Intent
Posted 时空矩人
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Intent相关的知识,希望对你有一定的参考价值。
Intent
Intent 作用(两个):
1. 激活系统组件
startActivity(Intent)
startService(Intent) / stopService(Intent)
bingService(Intent, ServiceConnection, int)
2. 在系统组件之间传递数据(依赖于intent的属性)
Intent 属性(一共6个,常用4个)
1. ComponentName: 组件名称. 用于显式地指定被激活的组件, 在Intent显示的激活系统组件时, 通过ComponentName属性来完成的.
例子:
Intent intent = new Intent(this, SecondActivity.class); // 在这里已经很明确的指出我们需要激活的Activity 是SecondActivity
/ 而这个SecondActivity 变量就是CommentName
startActivity(intent)
==> 等价于:
Intent intent = new Intent();
ComponentName commentName = ComponentName(this, 包名.StartActivity);
intent.setComponentName(commentName);
startActivity(intent);
2. Action: 动作. 用于隐式地指定被激活的组件, 被激活的组件可以是其他应用的组件, 如果是显示的只能是自己的组件
例子:
Intent intent = new Intent();
intent.setAction(Intent.ACTION_DIAL); // 隐式激活时, 你不知道激活的到底是哪个Activity, 里面的参数是字符串,
/如果是自己的Action, 可以在项目清单(Manifest.xml)中配置action, 然后
<intent-filter>
<action adroid:name="intent_action" />
<action adroid:name="intent_action2" /> // 可以重复写多次同一个属性
<category android:name="android.intent.category.DEFAULT" /> // 默认就有
<category android:name="hello" /> // 如果在代码中使用了intent.setCategory()这里就需要些多个
</intent-filter>
intent.addCategory("hello");
Data data = Uri.parse("tel://10086");
intent.setData(data);
startActivity(intent)
3. Data: 数据. 用于封装数据, 通常与Activity同时使用. 该属性是Uri 类型的, 可以通过Uri.parse(String)获取该类型的数据
4. Category: 分类. 用于Intent与IntentFilter的过滤 (没什么其他软用)
5. Extra: 附加数据. Extra属性的类型是Bundle, 而Bundle的本质是操作HashMap<String, Object>, 由于Bundle中的Map不可以被直接操作,
且Bundle提供了一些了API想Map中封装数据, 而Intent的Extra是进阶操作Map的,
所以Intent是Extra属性可以防止Bundle中约定的数据类型的数据
例子:
intent.putExtra("name", "小明"); // 向intent添加额外数据
intent.getStringExtra("name"); // 在另一个Activity中获取这个传过来的数据
6. Flag: 标记,标识. 通常用于激活Activity时, 指定特殊的参数.
相关方法: setFlags(int), addFlags(int)
Intent 与 IntentFilter
IntentFilter 是 "意图过滤器", 用于处理Intent的匹配(拦截/放行), 即使得某些Intent能够成功匹配, 从而放行; 某些Intent不能被匹配, 从而达到拦截
IntentFilter 对于Intent的匹配通常从Action属性, Category属性进行过滤, 也可以根据Data属性过滤
如果从Action / Category 进行过滤, 可以简单的认为规则是: IntentFilter中配置的属性比Intent中的只能更多不能更少. (你可以在IntentFilter配置
中写多个action来达到IntentFilter 配置属性比Intent 属性更多)
注意: 每个Intent对象中默认即存在一个一个category
Parcelable接口:
Android 中的Parcelable接口的作用类似于Java中的Serializable接口, 用于实现类的成员的序列化. Java中有序列化接口(自动序列化).
抽象方法:
1. describeContents() 保持默认,不需要动它
2. writeToParcel(Parcel dest) { // 将数据写入Parcel(放数据的容器)
dest.writeString(path);
dest.writeString(name);
}
实现步骤:
1. 自定义类, 实现Parcelable接口
2. 重写捏的describeContents()方法, 直接返回0即可
3. 重写的writeToParcel(Parcel, int)方法, 调用穿男生的write洗礼方法向Parcel容器内依次写入本类的各属性
4. 声明public static final Parcelable.Creator<T> CREATOR常量, 并使用匿名内部类赋值(也可以使用其他内部类语法), 在匿名内部了中, newArray(int)方法直接根据参数创建对应长度的数组createFromParcel(Parcel)中, 创建出本类的对象, 并从参数中依次(与此前写入时保存一直, 先写入先读取, 后写入后读取)读取数据为本类的对象属性赋值.
注:
获取包名的方法, getPackageName()
在配置文件(Manifest.xml)中的Activity属性名命名规则: "公司域名.action.SECOND" 或 "公司域名.category.HELLO"
以上是关于Intent的主要内容,如果未能解决你的问题,请参考以下文章