Android Intent常用方法详细介绍,显示Intent,隐式Intent,调用浏览器,拨号,发短信,传递数据

Intent介绍

Intent是Android程序中各个组件之间进行交互的一种重要方式,它不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据。Intent一般用于启动活动,启动服务以及发送广播等场景。Intent大致可以分为两种,显示Intent和隐式Intent。Intent有多个构造函数的重载,其中最常用的一个是Intent(Context packageContext,Class<?> cls),这个构造函数接收两个参数,第一个是提供启动活动的上下文,第二个是想要启动的目标活动。

显示Intent

显示Intent的使用就是用“Intent介绍”中提到的最常用的Intent构造方法。因为这种“意图”非常的明显,所以叫它显示Intent。

Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
startActivity(intent);

隐式Intent 

与显示Intent相比,隐式Intent就没有明确的指出要启动那一个活动,而是指定了一系列更为抽象的action和category等信息,然后交给系统去分析这个Intent,找出匹配action和category的活动并启动。在AndroidManifest.xml中的<activity>标签下的<intent-filter>中指定当前活动能够响应的action和category。

<activity android:name=".SecondActivity">
    <intent-filter>
        <action android:name="com.example.activitytest.ACTION_START"/>
        <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
</activity>

在action标签中,指定了该Activity可以响应com.example.activitytest.ACTION_START这个action,而category标签则包含了一些附加信息,更精确的指明了当前活动能够相应的Intent还可能带有的category。只有action和category两个标签中的内容同时匹配,这个活动才能响应该Intent。使用Intent的另一个构造函数指定需要响应的action。

Intent intent = new Intent("com.example.activitytest.ACTION_START");

这样就可以启动添加了该action的SecondActivity了。上面不是说要同时匹配action和category吗?怎么这里只有action?在SecondActivity中添加的category是一种默认的category,在调用startActivity()方法时,会自动将这个category添加到该Intent中。如果有自定义的category,使用以下方法添加: 

intent.addCategory("com.example.activitytest.MY_CATEGORY");

添加自定义的category时,需要注意,如果没有任何一个活动匹配该category,当程序执行到该Intent时,程序会崩溃。 

Intent更多的隐式用法 

1.调用系统浏览器 

首先指定Intent的action为“Intent.ACTION_VIEW”,这是一个android系统的内置动作,其常量值为android.intent.action.VIEW。然后他通过Uri.parse()方法,将一个网址字符串解析成一个Uri对象。最后调用Intent的setData()方法将这个Uri对象传递进去。

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);

2.调用拨号界面 

首先指定Intent的action为“Intent.ACTION_DIAL”,这又是一个android系统的内置动作,然后在data部分指定协议为tel,号码为10086。

Intent intent = new Intent("Intent.ACTION_DIAL");
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);

 3.直接拨打电话

和Intent调用拨号盘一样,也是setAction(),然后setData(),只是Action,替换为“Intent.ACTION_CALL”。注意:使用“Intent.ACTION_CALL”是,需要在AndroidManifest.xml文件中添加拨号权限。

权限:

    <uses-permission android:name="android.permission.CALL_PHONE" />

 代码:

Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);

4.发送短信

 发送短信和拨打电话是一样的,只是Action和需要申请的权限不同。直接发送短信的Action为:Intent.ACTION_SENDTO。同时要需要调用putExtra()方法添加短信内容

权限:

    <uses-permission android:name="android.permission.SEND_SMS"/>

 代码:

Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.setData(Uri.parse("smsto:10086"));
//sms_body固定参数,代表短信内容
//发送短信内容为:"《致命魔术》贼好看。"
intent.putExtra("sms_body","《致命魔术》贼好看。");
startActivity(intent);

向下一个活动传递数据 

Intent中提供了一系列putExtra()方法的重载,可以把我们想要传递的数据暂存在Intent中,启动了另一个活动后,只需要把这些数据再从Intent中取出来就可以了。

//存入数据
String data = "hello world";
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
intent.putExtra("extra_data",data);
startActivity(intent);

//取出数据
Intent intent = getIntent();
String data = intent.getStringExtra("extra_data");

返回数据给上一个活动 

Activity中还有一个startActivityForResult()方法也是用于启动活动的,但是这个方法期望在活动销毁的时候能够返回一个结果给上一个活动。startActivityForResult()方法接收两个参数,第一个参数是Intent,第二个参数是请求码,用于在之后的回调中判断数据的来源。为了便于理解,下面阐述一下在demo中的使用过程。在FirstActivity(activity可以是任意activity,只要有两个不同的activity可以使用就行)中添加一个按钮button1,并设置点击事件。

button1.setOnClickLinstener(new View.OnClickListener(){
    @override
    public void onClick(View v){
        Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
        startActivityForResult(intent,1);
    }
});

在这里我们使用的是startActivityForResult()方法来启动SecondActivity,请求码只要是一个唯一值就行,这里传入的是1。接下来在SecondActivity中给按钮添加点击事件,并在这个点击事件中添加返回数据的逻辑。

button2.setOnClickListener(new View.OnClickListener(){
    @override
    public void onClick(View v){
        Intent intent = new Intent();
        intent.putExtra("data_return","hello FirstActivity");
        setResult(RESULT_OK,intent);
        finish();
    }
});

在Button2中创建的Intent仅仅是用于传递数据,并没有任何的“意图”,将需要传递的数据添加进去后,调用了setResult()方法接收两个参数,第一个参数用于向上一个活动返回处理结果,一般只使用RESULT_OK或RESULT_CANCELED这两个值。第二个参数则是把带有数据的Intent传递回去。最后使用finish()结束当前活动。

由于我们是使用的startActivityForResult()方法来启动的SecondActivity,在SecondActivity被销毁之后会回调上一个活动的onActivityResult()方法,所以我们需要在FirstActivity中重写这个方法,得到返回的数据。

@Override
protected void onActivityResult(int requestCode,int resultCode,Intent data){
    switch(requestCode){
        case 1:
            if(resultCode == RESULT_OK){
                String returnedDAta = data.getStringExtra("data_return");
            }
            break;
        default:
            break;
    }
}

onActivityResult()方法第一个参数requestCode,即我们在启动活动时传入的请求码,第二个resultCode,即我们在返回数据时传入的处理结果,第三个参数,即携带着返回数据的Intent。 

 发现错误,请指出,谢谢!

有问题欢迎私聊或者发送邮箱(964427082@qq.com)一起讨论

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值