【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() 回调中来处理返回键按下的情况。
评论已关闭