一、概述
Intent 是 Android 程序中各组件之间进行交互的一种重要方式,它不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据。Intent 一般用于:
- 启动 Activity
- 启动Service
- 发送广播
二、显式 Intent
Intent 有不同的构造函数,Intent 利用 public Intent(Context packageContext, Class<?> cls)
版本的构造函数,实现显式 Intent 。
Intent intent = new Intent(MainActivity.this, SubActivity.class);
startActivity(intent);
如上代码所示
- 构造函数第一个参数,指定当前Activity 的上下文。
- 构造函数的第二个参数,指定目标Activity 。
- Activity 类中提供了
startActivity()
方法,专门用于启动Activity ,它接收一个 Intent 参数。
三、隐式 Intent
1. 实现APP Activity 间 跳转
隐式 Intent 不明确指出想要启动哪个Activity ,而是指定一系列更为抽象的 action
和 category
等信息,然后交由系统去分析这个 Intent ,并帮我们找到合适的Activity 去启动。
1.1 指定Activity 能够响应的action 和 category
打开 AndroidManifest.xml
文件,通过在 <activity>
标签下配置 <intent-filter>
的内容,可以指定当前Activity 能够响应的 action
和 category
。
<activity android:name=".SubActivity"
android:exported="false">
<intent-filter>
<action android:name="com.example.helloworld.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
这里使用 Intent 的另外一个构造函数 public Intent(String action)
实现。如下示例代码所示:
Intent intent = new Intent("com.example.helloworld.ACTION_START");
startActivity(intent);
这里直接将 action
的字符串传进去,表明想要启动能够响应 com.example.helloworld.ACTION_START
这个action 的Activity。
上面没看到指定 category,这是因为android.intent.category.DEFAULT
是一种默认的 category 。上述代码等同于:
Intent intent = new Intent("com.example.helloworld.ACTION_START");
intent.addCategory("android.intent.category.DEFAULT");
startActivity(intent);
2. 调用系统浏览器
使用 隐式 Intent ,不仅可以启动自己程序内的Activity ,还可以启动其他程序的Activity,这就使多个应用程序之间的功能共享成为可能。
例如,在当前程序调用系统的浏览器
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("https://www.baidu.com"));
startActivity(intent);
3. 调用系统拨号界面
Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData ( Uri.parse("tel:1000") );
startActivity(intent);
四、Activity 之间传递数据
1. 向下一个Activity 传递数据
intent 在启动 Activity 的时候还可以传递数据。
在启动Activity 时传递数据的思路很简单,Intent 中提供了一些列 putExtra()
方法的重载,可以把我们想要传递的数据暂存在 Intent 中,在启动另一个 Activity 后,只需要把这些数据从 Intent 取出就可以了。
在当前Activity 设置数据
Intent intent = new Intent(MainActivity.this, SubActivity.class);
intent.putExtra("test_data","MainActivity say :hello");
startActivity(intent);
- 利用 intent 的 putExtra 方法设置传递的数据。设置的数据是一组键值对。
- putExtra 的第一个参数是键值,接收时,需要根据这个键值读取数据。
- putExtra 的第二个参数是具体要传递的数据。
在目标 Activity 接收数据
在 目标 Activity 的 onCreate 函数,执行如下代码:
String str_from_main = getIntent().getStringExtra("test_data");
Log.v("subActivity",str_from_main);
getIntent()
是Activity 的一个方法getStringExtra
根据键值返回传递过来的字符串。- 如果传递的是布尔类型数据,则使用
getBooleanExtra
方法。 - 如果传递的是整数数据,则使用
getIntExtra
方法
2. 返回数据给上一个Activity
返回上一个Activity
只需要按一下 Back
键就可以了,并没有一个用于启动Activity 的 Intent 来传递数据。
Android 提供了 registerForActivityResult
方法,注册Activity 返回时的处理函数。