Android中使用Intent切换活动的方法

Android中使用Intent切换活动的方法

Intent

Intent即意图,主要是用于活动之间切换。Intent大致可以分为显式Intent和隐式Intent.

显式Intent

显式Intent(explicit Intent)明确的指定了要启动的Acitivity,

// MainActivity是主活动名,OtherActivity是要跳转的活动
Intent intent = new Intent(MainActivity.this, OtherActivity.class); 
startActivity(intent);

可以看出,显式Intent是直接给出活动名,“意图”十分明显,即在MainActivity这个活动的基础上打开OtherActivity这个活动,最后使用startActivity()方法来执行这个Intent.

隐式Intent

隐式Intent(implicit Intent)没有明确的指定要启动哪个Activity ,而是通过设置Intent Filter来让系统去筛选符合的Acitivity去启动.
implicit Intent需要进行三个匹配,一个是action,一个是category,一个是data.

  1. 指定action

首先在AndroidManifest.xml文件的OtherActivity活动中添加如下代码:

<activity android:name=".OtherActivity">
            <intent-filter>
                <action android:name="My_Action"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
</activity>
<activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
 </activity>

所以,隐式Intent 的代码为:

// MainActivity跳转到OtherActivity
Intent intent = new Intent();
// 指定ACTION
intent.setAction("My_Action");
startActivity(intent);

这里只指定了action,没有指定category,是因为当OtherActivity活动的时,不需要指定category,若有自定义category,则需要指定category,下面就有说明.

  1. 指定action和category

首先在AndroidManifest.xml文件的OtherActivity活动中添加如下代码:

<activity android:name=".OtherActivity">
            <intent-filter>
                <action android:name="My_Action"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="My_Category"/>
            </intent-filter>
</activity>

所以,隐式Intent 的代码为:

Intent intent = new Intent();
// 指定ACTION
intent.setAction("My_Action");
// 添加一个自定义的category
intent.addCategory("My_Category");
startActivity(intent);

可以看到,OtherActivity里虽然自定义了,但仍然需要加上,这是因为每一个通过 startActivity() 方法发出的隐式 Intent 都至少有一个 category,就是android.intent.category.DEFAULT. 所以只要是想接收一个隐式 Intent 的 Activity 都应该包括 “android.intent.category.DEFAULT” category,不然将导致 Intent 匹配失败。所以这里对category匹配进行了两次,分别是android.intent.category.DEFAULT和My_Category.
综上可以得出:每个Intent中只能指定一个action,但却能指定多个category.

Intent的更多用法

  1. 调用系统浏览器
// Intent.ACTION_VIEW是系统内置的action,对应的值为"android.intent.action.VIEW"
intent = new Intent(Intent.ACTION_VIEW);
// Uri通过parse方法将网页字符串解析成一个Uri对象,http表示网络协议
Uri data = Uri.parse("http://www.baidu.com");
// 调用Intent的setData方法将这个Uri对象传递进去
intent.setData(data);
startActivity(intent);
  1. 调用系统拨号界面
intent = new Intent(Intent.ACTION_DIAL);
// tel表示拨打电话
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);
  1. 传递数据

    3.1 向下一个活动传递数据

    流程:首先打开FirstActivity活动,然后跳转到ThirdActivity活动的同时将数据传过去.

    FirstActivity活动中的代码如下:

    String str = "Hello ThirdActivity";
    intent = new Intent(FirstActivity.this, ThirdActivity.class);
    // putExtra方法传递字符串(para1:键;para2:要传递的数据)
    intent.putExtra("extra_data", str);
    startActivity(intent);
    

    ThirdActivity活动中的代码如下:

    Intent intent = getIntent();
    // intent中取键为extra_data对应的数据;根据传递数据的类型选择使用getStringExtra()、getIntExtra()、getBooleanExtra()等方法。
    String data = intent.getStringExtra("extra_data");
    // 在日志中将数据显示出来
    Log.d("ThirdActivity", data);
    

    3.2 向上一个活动传递数据

    流程:首先打开FirstActivity,然后打开SecondActivity,最后销毁SecondActivity的同时将SecondActivity中的数据传递给FirstActivity.

    FirstActivity活动中的代码如下:

    public void onClick(View v) {
        Intent intent;
        int id = v.getId();
        switch (id){
            case R.id.button:
            intent = new Intent(FirstActivity.this, SecondActivity.class);
    	    // startActivityForResult方法也是用于启动活动,但这个方法期望在活动销毁的时候能够返回一个结果给上一个活动
    	    // 第二个参数是请求码,只要是一个唯一值就可以了,这里传入了1
    	    startActivityForResult(intent,1);
    	    break;
    	}
    }
    // 由于使用的是startActivityForResult()方法启动SecondActivity活动,所以当SecondActivity活动被销毁后,会回调上一个活动的onActivityResult()方法
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode) {
            case 1:
                if (resultCode == RESULT_OK) {
                    String returnedData = data.getStringExtra("data_return");                    
                    Log.d("FirstActivity", returnedData);
                }
                break;
        }
    }
    

    SecondActivity活动中的代码如下:

    Intent intent = new Intent();
    // data_return是键,Hello FirstActivity是要传的数据
    intent.putExtra("data_return", "Hello FirstActivity");
    // 	setResult()方法是专门用于向上一个活动返回数据的(para1:用于向上一个活动返回处理结果,一般只使用RESULT_OK和RESULT_CANCELED两个值)
    setResult(RESULT_OK, intent);
    // 销毁SecondActivity
    finish();
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值