安卓(Android)中的Intent
是系统内用于不同组件之间通信的一种重要机制。它是轻量级的消息传递对象,允许一个组件(如Activity
、Service
、BroadcastReceiver
)请求另一个组件执行特定的操作或传递数据。以下是Intent
在Android开发中的关键特性、作用和使用场景:{{{width="auto" height="auto"}}}
关键特性:
-
动作(Action):
Intent
通过定义动作来表达想要执行的操作。这些动作通常以字符串形式表示,如ACTION_VIEW
(查看)、ACTION_SEND
(发送)、ACTION_INSTALL_PACKAGE
(安装包)等。动作是Intent
的核心组成部分,用于描述意图的基本行为。 -
数据(Data):
Intent
可以携带数据,这可能包括要操作的具体内容(如一个网页URL、联系人信息、多媒体文件等)。数据可以通过setData()
方法设置URI(统一资源标识符),也可以通过putExtra()
方法添加键值对形式的额外信息。 -
类别(Category):类别用于进一步细化
Intent
的语义,如CATEGORY_DEFAULT
、CATEGORY_BROWSABLE
等。它们与动作一起使用,可以帮助系统更准确地匹配和解析Intent
。 -
组件指定(Component):虽然通常情况下
Intent
依赖系统来选择合适的组件处理请求,但也可以直接指定目标组件的类名,确保请求被确切的组件接收。
作用与使用场景:
-
启动组件:
Intent
最常见的是用于启动新的Activity
、Service
或触发BroadcastReceiver
。例如,打开一个新的界面、启动后台任务或响应系统广播事件。 -
数据传递:
Intent
可以携带数据从一个组件传递到另一个组件。这些数据可以是简单类型(如字符串、整数、布尔值),也可以是复杂类型(如序列化对象、parcelable对象),甚至是文件URI。通过在Intent
中放入Bundle
对象或直接使用putExtra()
方法添加键值对来实现。 -
跨应用交互:除了在单个应用内部通信外,
Intent
还支持跨应用操作。开发者可以定义公开的Intent
过滤器,使得其他应用能够通过标准的Intent
动作和数据类型与其进行交互,例如分享内容、打开特定类型文件等。 -
系统操作:
Intent
可用于执行一些系统级别的操作,如安装、卸载应用(如上述代码片段所示)、打开应用详情页、启动主屏幕、注册监听开屏锁屏广播等。
包括:
-
打开软件安装页面:创建一个
Intent
,设置ACTION_VIEW
动作,指定application/vnd.android.package-archive
数据类型和待安装APK文件的URI,启动安装过程。 -
分享软件信息:创建一个
ACTION_SEND
类型的Intent
,指定数据类型为text/plain
,并添加要分享的文本信息,启动分享操作。 -
卸载软件:创建一个
ACTION_DELETE
类型的Intent
,指定要卸载应用的包名URI,启动卸载流程。 -
打开软件详情页:创建一个
ACTION_APPLICATION_DETAILS_SETTINGS
类型的Intent
,指定目标应用包名URI,打开系统应用详情设置界面。 -
打开其他软件:通过
PackageManager
获取指定包名应用的启动Intent
,并启动该应用。 -
跳转到主界面:创建一个具有
ACTION_MAIN
动作和CATEGORY_HOME
类别的Intent
,启动设备主屏幕。 -
注册开屏锁屏的广播接收者:在
IntentFilter
中添加ACTION_SCREEN_OFF
和ACTION_SCREEN_ON
动作,以监听系统屏幕状态变化。 -
获取应用信息:使用
PackageManager
获取已安装应用的包名、版本名、图标、名称、是否为用户应用、是否安装在SD卡等信息,封装为AppInfo
对象列表。 -
获取系统中所有进程信息:通过
ActivityManager
获取运行中的进程列表,包括进程名、内存占用、图标、名称、是否为用户应用等,封装为TaskInfo
对象列表。 -
清理所有非自身进程:使用
ActivityManager
获取所有运行中的进程,判断并杀死非自身应用的后台进程。 -
动态检查服务是否运行:利用
ActivityManager
查询正在运行的服务列表,对比服务类名以确定目标服务是否正在运行。 -
获取内存卡和SD卡可用空间:使用
StatFs
类查询指定路径(通常是SD卡路径)的磁盘分区信息,计算可用空间。
如何传递数据
示例代码:
在Android中,使用Intent
传递数据主要有以下几种方法:
方法一:使用 putExtra()
方法添加键值对
这是最常见的数据传递方式,适用于基本数据类型、String、CharSequence、Parcelable 对象和 Serializable 对象等。以下是一些示例:
// 创建 Intent
Intent intent = new Intent(this, TargetActivity.class);
// 添加基本类型数据
intent.putExtra("key_integer", 123);
intent.putExtra("key_string", "Hello, Intent!");
// 添加复杂类型数据(如 Parcelable 对象)
MyParcelableObject myParcelable = new MyParcelableObject();
intent.putExtra("key_parcelable", myParcelable);
// 添加 Serializable 对象
MySerializableObject mySerializable = new MySerializableObject();
intent.putExtra("key_serializable", mySerializable);
// 启动目标 Activity,并传递数据
startActivity(intent);
在目标 Activity 中,通过 getIntent()
方法获取到传递过来的 Intent
,然后使用对应的 getXXXExtra()
方法取出数据:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_target);
Intent intent = getIntent();
// 获取基本类型数据
int intValue = intent.getIntExtra("key_integer", defaultValue);
String stringValue = intent.getStringExtra("key_string", defaultValue);
// 获取 Parcelable 对象
MyParcelableObject parcelableObject = intent.getParcelableExtra("key_parcelable");
// 获取 Serializable 对象
MySerializableObject serializableObject = (MySerializableObject) intent.getSerializableExtra("key_serializable");
}
注意:对于默认值(defaultValue
),请根据实际数据类型为其指定合适的值。
方法二:使用 setData()
设置 URI 数据
Intent
也可以通过 setData()
方法设置 URI(统一资源标识符),用于指向特定的数据资源(如文件、网页、联系人等)。例如:
// 创建 Intent
Intent intent = new Intent(Intent.ACTION_VIEW);
// 设置指向网页的 URI
Uri webpageUri = Uri.parse("https://www.example.com");
intent.setData(webpageUri);
// 启动目标 Activity,并传递数据
startActivity(intent);
在目标 Activity 或者能够响应该 Intent
的组件中,可以通过 getData()
方法获取 URI 数据:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_target);
Intent intent = getIntent();
// 获取 URI 数据
Uri dataUri = intent.getData();
}
方法三:使用 ClipData
传递多条数据
对于需要一次性传递多条数据(如多张图片、多个文件)的场景,可以使用 ClipData
类。例如:
// 创建 Intent
Intent intent = new Intent(this, TargetActivity.class);
// 创建 ClipData 对象
ClipData clipData = ClipData.newRawUri("clip_label", Uri.parse("content://some/content/uri"));
// 添加更多 URI 数据
clipData.addItem(new ClipData.Item(Uri.parse("another/content/uri")));
// 将 ClipData 设置到 Intent 中
intent.setClipData(clipData);
// 启动目标 Activity,并传递数据
startActivity(intent);
在目标 Activity 中,通过 getClipData()
方法获取 ClipData
对象,然后遍历其中的 ClipData.Item
来访问各个 URI:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_target);
Intent intent = getIntent();
// 获取 ClipData 对象
ClipData clipData = intent.getClipData();
if (clipData != null) {
for (int i = 0; i < clipData.getItemCount(); i++) {
ClipData.Item item = clipData.getItemAt(i);
Uri uri = item.getUri();
// 处理每个 URI 数据
}
}
}