你的Android组件们,可能只差一层Intent的窗户纸。
一、Intent是什么?为什么它如此重要?
在Android世界中,人不会漫无目的地瞎逛,他们所做的大部分事情——比如看电视、购物、编写下一个杀手级App——都带有特定的目的或者意图。Android也是同样的,而实现这种“目的”或“意图”的机制,就叫做Intent。
简单来说,Intent是Android应用中连接三个核心组件——Activity、Service和BroadcastReceiver的桥梁。它负责对应用中操作的动作、动作涉及数据及附加数据进行描述。
想象一下,如果没有Intent,你的App就像一支没有指挥的交响乐团——每个乐手(组件)都很优秀,但无法协同演奏出美妙的音乐。
二、Intent数据传递的两种方式:Data属性 vs Extra属性
很多Android新手常常会混淆Intent中的Data属性和Extra属性,它们虽然都用于传递数据,但有着本质的区别。
2.1 Data属性:Intent的“核心使命”
Data属性用于完成对Intent消息中数据的封装,描述Intent动作所操作数据的URI(Uniform Resource Identifier,通用资源标识符)及MIME(多用途互联网邮件扩展)类型。
它通常与Action属性配合使用,告诉系统“我要对什么数据执行什么操作”。比如查看一个网页、编辑一个联系人、拨打一个电话等。
2.2 Extra属性:Intent的“随身行李”
相比之下,Extra属性更像是一个随身携带的背包,用于在多个Action之间进行数据交换。Extra可以被当作一个Bundle对象,存入多组key-value对(键-值对)。
当你需要在Activity之间传递一些用户ID、设置参数或者其他业务数据时,Extra属性就派上了用场。
那么,什么时候该用Data,什么时候该用Extra呢?
问自己一个问题:这个数据是操作的核心对象,还是辅助信息?如果是核心对象,比如你要查看的网页URL、要拨打的电话号码,用Data;如果是辅助信息,比如用户昵称、页面主题颜色,用Extra。
三、深度解析Data属性:不只是个URI
3.1 Data属性的结构
Data属性接受一个Uri对象,其标准格式为:scheme://host:port/path
例如:
content://com.android.contacts/contacts/1(查看ID为1的联系人)tel:123(拨打123电话)http://www.example.com(查看示例网站)
其中,port部分常常被省略,contacts/1是path部分。
3.2 Data与Type的“相爱相杀”
Data属性有一个亲密伙伴——Type属性,用于指定Data所指定Uri对应的MIME类型(如"text/plain"、"image/jpeg"等)。
但它们的关系有点“别扭”——如果你分别设置Data和Type,后设置的会覆盖先设置的!看看这个例子:
// Type属性被Data覆盖
public void overrideType(View source){
Intent intent = new Intent();
intent.setType("abc/xyz");
intent.setData(Uri.parse("lee://www.baidu.com:80/test"));
// 最终只有Data生效
}
// Data属性被Type覆盖
public void overrideData(View source){
Intent intent = new Intent();
intent.setData(Uri.parse("lee://www.baidu.com:80/test"));
intent.setType("abc/xyz");
// 最终只有Type生效
}
正确的姿势是使用setDataAndType()方法同时设置两者:
// 同时设置Data和Type
public void dataAndType(View source){
Intent intent = new Intent();
intent.setDataAndType(
Uri.parse("lee://www.baidu.com:80/test"), "abc

最低0.47元/天 解锁文章
452

被折叠的 条评论
为什么被折叠?



