一、Activity之间跳转
1.显示Intent
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivity(intent);
FirstActivity.this作为上下文,传入SecondActivity.class作为目标活动,通过startActivity()方法来执行这个Intent。
2.隐式Intent
1.配置Activity
<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="top.xiexiaodong.activity.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
2.代码跳转
Intent intent = new Intent("top.xiexiaodong.activity.ACTION_START");
startActivity(intent);
同时匹配<action>和<category>才能响应,android.intent.category.DEFAULT是一种默认的<category>,在调用startActivity()方法的时候会自动将这个<category>添加到Intent中。如果需要添加别的<category>,可以通过下面代码实现:
intent.addCategory("top.xiexiaodong.category.MY_CATEGORY");
这里必须在AndroidManifest文件中添加这个<category>,代码如下:
<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="top.xiexiaodong.activity.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="top.xiexiaodong.category.MY_CATEGORY" />
</intent-filter>
</activity>
否则会报错:
No Activity found to handle Intent
3.更多隐式Intent用法
1.打开浏览器
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.xiexiaodong.top"));
startActivity(intent);
2.打开拨号
Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);
可以配置AndroidMainfest文件,通过<data>标签,更精确地指定当前Activity能够响应什么类型的数据。<data>标签中主要可以配置以下内容:
-
android:scheme。用于指定数据的协议部分,如上例中的http部分。
-
android:host。用于指定数据的主机名部分,如上例中的www.xiexiaodong.top部分。
-
android:port。用于指定数据的端口部分,一般紧随在主机名后面。
-
android:path。用于指定主机名和端口之后的部分,如一段网址中跟在域名之后的内容。
-
android:mimeType。用于指定可以处理的数据类型,允许使用通配符的方式进行指定。
只用<data>标签中指定的内容和Intent中携带的Data完全一致时,当前活动才能够响应该Intent。可以配置如下内容,使其能够响应所有http协议的Intent,代码如下:
<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="top.xiexiaodong.activity.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="top.xiexiaodong.category.MY_CATEGORY" />
<data android:scheme="http" />
</intent-filter>
</activity>
二、Activity之间传数据
1.向下一个Activity传数据
1.发送
String data = "Hello SecondActivity";
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("extra_data", data);
startActivity(intent);
2.接收
Intent intent = getIntent();
String data = intent.getStringExtra("extra_data");
Log.d("SecondActivity", data);
2.返回数据给上一个Activity
1.startActivityForResult
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivityForResult(intent, 1); // 1是唯一值即可
2.setResult
Intent intent = new Intent();
intent.putExtra("data_return", "Hello FirstActivity");
setResult(RESULT_OK, intent); // 把带有参数的intent传回去
finish();
3.重写OnActivityResult()方法
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case 1:
if (resultCode == RESULT_OK) {
String returnData = data.getStringExtra("data_return");
Log.d("FirstActivity", returnData);
}
break;
default:
break;
}
}