我的android 第27天 - Intent意图
Intent(意图) 是一个将要执行的动作的抽象的描述,一般来说是作为参数来使用,由Intent来协助完成android各个组件之间的通讯。intent主要是用来启动其他的activity 或者service、BroadcastReceiver,所以可以将intent理解成组件之间的粘合剂。
一、intent 表现形式
1. 通过Context.startActivity()\startActivityForResult()启Activity
2. 通过 Context.startService() 启动一个服务,或者通过
Context.bindService() 和后台服务交互;
3. 通过广播方法(比如:Context.sendBroadcast()
,Context.sendOrderedBroadcast(), 发给broadcast receivers
二、属性设置
1.Action(动作)
* 系统动作
ACTION_CALL,ACTION_EDIT,ACTION_VIEW,ACTION_BATTERY_LOW
* 自定义动作
最好在前缀加包名(比如:cn.itcast.contact.SHOW_TEL)
2.Data(执行动作要操作的数据,数据用Uri表示)
3.type(数据类型,显式指定Intent的数据类型(MIME))
二、属性设置
4.category(类别)
*CATEGORY_DEFAULT
*CATEGORY_BROWSABLE
*CATEGORY_DEFAULT
*CATEGORY_HOME
*CATEGORY_LAUNCHER
5.component(组件)指定目标组件的类名称
6.extras(附加信息) 是所有附加信息的集合
三、显示意图与隐式意图
Intent可以划分成显式意图和隐式意图。
1. 显式意图:调用Intent.setComponent()或Intent.setClass()方法明确指定
了组件名,显式意图明确指定了Intent应该传递给哪个组件。
2.隐式意图:没有明确指定组件名的Intent为隐式意图。 Android系统会根据隐式意
图中设置的动作(action)、类别(category)、数据(URI和数据类型)找到最合适
的组件来处理这个意图。
四、intent-filter(意图过滤器)
五、Bundle介绍:
Bundle类用作携带数据,它类似于Map,用于存放key-value名值对形式的值。相对于Map,它提供了各种常用类型的putXxx()/getXxx()方法,如:putString()/getString()和putInt()/getInt(),putXxx()用于往Bundle对象放入数据,getXxx()方法用于从Bundle对象里获取数据。Bundle的内部实际上是使用了HashMap<String, Object>类型的变量来存放putXxx()方法放入的值:
publicfinal class Bundle implements Parcelable, Cloneable {
......
Map<String, Object> mMap;
public Bundle() {
mMap = new HashMap<String, Object>();
...... }
public void putString(String key, String value) {
mMap.put(key, value);
}
publicString getString(String key) {
Object o = mMap.get(key);
return (String) o;
........//类型转换失败后会返回null,这里省略了类型转换失败后的处理代码
} }
在调用Bundle对象的getXxx()方法时,方法内部会从该变量中获取数据,然后对数据进行类型转换,转换成什么类型由方法的Xxx决定,getXxx()方法会把转换后的值返回。
六、Intent附加数据的两种写法
1. 第一种写法,用于批量添加数据到Intent:
Intentintent =new Intent();
Bundlebundle =new Bundle();//该类用作携带数据
bundle.putString("name","传智播客");
intent.putExtras(bundle);//为意图追加额外的数据,意图原来已经具有的数据不会丢失,但key同名的数据会被替换
2第二种写法:这种写法的作用等价于上面的写法,只不过这种写法是把数据一个个地添加进Intent,这种
写法使用起来比较方便,而且只需要编写少量的代码。
Intentintent =new Intent();
intent.putExtra("name","传智播客");
Intent提供了各种常用类型重载后的putExtra()方法,如: putExtra(String name, String value)、 putExtra(String name, long value),在putExtra()方法内部会判断当前Intent对象内部是否已经存在一个Bundle对象,如果不存在就会新建Bundle对象,以后调用putExtra()方法传入的值都会存放于该Bundle对象,下面是Intent的putExtra(String name, String value)方法代码片断:
publicclass Intentimplements Parcelable {
privateBundle mExtras;
public Intent putExtra(String name, String value) {
if (mExtras == null) {
mExtras = newBundle() }
mExtras.putString(name, value);
return this; }
下载视频代码