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.
- 指定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,下面就有说明.
- 指定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的更多用法
- 调用系统浏览器
// 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);
- 调用系统拨号界面
intent = new Intent(Intent.ACTION_DIAL);
// tel表示拨打电话
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);
-
传递数据
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();