【Android】Intent 启动 Activity
Intent 可以用于启动 Activity 或者在 Activity 间传递数据。
显式启动 Activity
// new Intent(Context context, Class class)
Intent intent = new Intent(this, TargetActivity.class);
startActivity(intent);
意图明确的 Intent,明确指出在 this
的 context
上启动 TargetActivity
。
隐式启动 Activity
首先在 AndroidManifest.xml 中 Activity 的 <intent-filter>
中定义 <action>
和 <category>
。
<activity android:name=".TargetActivity">
<intent-filter>
<!-- 可以有多个action和category -->
<action android:name="com.example.test.ACTION_START"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="com.example.test.MY_CATEGORY"/>
</intent-filter>
</activity>
// new Intent(String action)
Intent intent = new Intent("com.example.test.ACTION_START");
// [没有]使用 addCategory 时,会自动添加 android.intent.category.DEFAULT
intent.addCategory("com.example.test.MY_CATEGORY");
startActivity(intent);
隐式启动浏览器
// new Intent(String action)
Intent intent = new Intent(Intent.ACTION_VIEW);
// 设置 URI data
Intent.setData(Uri.parse("https://www.baidu.com"));
startActivity(intent);
自定义响应含有 data 的 Intent
在 AndroidManifest.xml 中 Activity 的 <intent-filter>
还可以添加 <data>
。<data>
中可以配置:
android:scheme
,指定可以处理的协议android:host
,指定可以处理的主机名android:port
,指定可以处理的端口android:path
,指定可以处理的路径android:mineType
,指定可以处理的数据类型
只有 <data>
中指定的内容和 Intent 中的 data 完全一致时,Activity 才能响应这个 Intent。
自定义相应 https 协议
在 AndroidManifest.xml 中 Acivity 中的 <intent-filter>
改变 action
和 category
,并添加 <data>
并指明可以处理的内容。
<activity android:name=".TargetActivity">
<intent-filter>
<!-- 可以有多个action和category -->
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="https"/>
</intent-filter>
</activity>
这样,[其他隐式 - 调用浏览器] 中的 Intent 就可以被 TargetActivity
响应了。
隐式启动拨号界面
使用 Intent.ACTION_CALL
的 action
,并设置 data 的 URI 为 tel:10086
。
// new Intent(String action)
Intent intent = new Intent(Intent.ACTION_DIAL);
// 设置 URI data
Intent.setData(Uri.parse("tel:10086"));
startActivity(intent);
Activity 间传递数据
使用 putExtra(name, data)
将额外数据放进 Intent。
Intent intent = new Intent(this, TargetActivity.class);
intent.putExtra("rick_astley", "Never gonna give you up");
startActivity(intent);
在被启用的 Activity 中使用 getIntent()
来得到 Intent。
并使用 Intent.get___Extra(name)
来获取对应类型的额外数据。
Intent intent = getIntent();
String data = intent.getStringExtra("rick_astley");
被启动 Activity 传回数据
父 Activity 使用 startActivityForResult(intent, requestCode)
来启动子 Activity。
子 Activity 使用 setResult(resultCode, intent)
来设置结果。
子 Activity 销毁时,父 Activity 会接收到 onActivityResult(requestCode, resultCode, intent)
回调。
在子 Activity 的 onBackPressed()
回调中来处理返回键按下的情况。
评论已关闭