Intent(使用intent传递数据)
创作时间:
作者:
@小白创作中心
Intent(使用intent传递数据)
引用
CSDN
1.
https://blog.csdn.net/u012554661/article/details/140195884
安卓(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 数据
}
}
}
热门推荐
《军师联盟》里的夏侯惇,历史上的他有多牛?
中国力量:2024年的科技与军事突破
乌龙茶与普洱茶能否互相替代?
冷暖大逆转!湖北雨雪降温将齐来袭 公众春运返乡需注意
乌龙茶的工艺与起源
春节焦虑症:如何应对亲朋好友的灵魂拷问?
梦公主与白光莹:《精灵梦叶罗丽》角色设计对比分析
央视春晚里的餐桌变迁:从温饱到健康
赵丽颖、肖战加盟2025央视春晚!
揭秘2025央视春晚《栋梁》:科技与艺术的完美融合
简单美味辣子鸡
预售破2.7亿!《射雕英雄传:侠之大者》能否成为春节档最大赢家?
2025年春节肇庆活动指南:从动漫嘉年华到非遗表演
湖南卫视&芒果TV陪你过个热闹年
运动心理学助你轻松瘦身
最新研究:运动减肥真的能保护心脏!
HIIT燃脂挑战:20分钟瘦成闪电⚡️
英国研究:每周150分钟有氧运动才能有效减肥
《不差钱》再登热搜,赵本山:从春晚舞台到全球巡演
演艺之都汇集世界璀璨星光
皮肤暗黄的5大原因及7种改善方法
当苏格拉底遇见孔子:美德即知识?| 政治学与生活
文艺复兴时期新柏拉图主义的复兴与影响:从查士丁尼到佛罗伦萨
探秘泰顺承天氡泉,感受大自然的神奇魅力!
泰顺玉龙山:除了泡温泉,这些小众玩法你绝对不能错过!
秋拍壶口瀑布,这些技巧你必须知道!
《中国国家地理》推荐:壶口瀑布的传奇故事
秋天去山西壶口瀑布,你准备好了吗?
世界古典学大会|古希腊何以成为“古典的”
春节档19.9元的电影票,竟然这么难抢?二手平台有人卖“资格”,叫价5元或10元