【Android】Intent 启动 Activity

warning: 这篇文章距离上次修改已过762天,其中的内容可能已经有所变动。

Intent 可以用于启动 Activity 或者在 Activity 间传递数据。

显式启动 Activity

// new Intent(Context context, Class class)
Intent intent = new Intent(this, TargetActivity.class);
startActivity(intent);

意图明确的 Intent,明确指出在 thiscontext 上启动 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> 改变 actioncategory,并添加 <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_CALLaction,并设置 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() 回调中来处理返回键按下的情况。

评论已关闭