我的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;??}
?
下载视频代码