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 数据
}
}
}
热门推荐
定义市场的 5 个美容行业趋势和矛盾
水生植物对氮磷营养盐的利用和蓄积
墨兰的养殖方法和注意事项
摩擦力:无处不在的力量,它究竟是天使还是魔鬼?
2024年日本夏季花火大会指南:7、8月不容错过的盛大烟火秀
专家:不要频繁用棉签挖耳,耳屎堵住应去医院而不是去采耳
什么是服务器准系统?它与传统服务器有何不同?
心的五行属性:子字五行属金还是火
雅思口语如何提高流利度
动力配电箱常见故障及解决方法 动力配电箱如何维护和保养
古人为什么要剪蜡烛?浪漫背后的"烛芯效应"
漫威电影宇宙(MCU)大盘点:第一到第五阶段54部影视
腊八蒜的营养和功效
15个受欢迎月季品种全解析:从自由精神到碧翠丝,优缺点一览
深入解析财务分析课程:提升职业发展的必备技能
广东室内种植花卉指南:五种易养耐看的推荐品种
山东清明节旅游好去处
盐酸贝尼地平片的副作用
河南老君山初雪美景:银装素裹宛如童话世界
紫薇斗数中命主和身主哪个更重要?两者之间有何区别?
济南楼市最具成长空间的10大板块盘点
如何进行车辆价格评估以确保准确性?
《归龙潮》引领国潮风,中华文化创新如何内生爆发?
汉武帝远征西域:一场改变中国历史走向的军事行动
英语单词背了又忘?7步走,有效帮孩子提高记忆力
法国拿破仑三世成就探析
外汇交易时间一般是什么时候 如何选择外汇交易时间
如何识别PUA套路?小红书中的隐藏陷阱,你发现了吗?
美术指导大揭秘,如何打造悬疑剧的氛围感?
社会流动与个人发展:如何实现阶层跃升的路径分析