android基础(Intent)

来源:互联网 发布:软件的用户界面类型 编辑:程序博客网 时间:2024/06/05 02:37

Intent封装了Android应用需要启动某个组件(Activity、Service、BroadcastReceiver)的“意图”,不仅如此,Intent还是应用程序组件之间通信的重要媒介(使用Intent携带Bundle对象)

使用Intent启动不同组件的方法:

startActivity、startActivityForResult、startService、bindService、sendBroadcast

Intent对象大致包含Component、Action、Category、Data、Type、Extra和Flag这七种属性,其中,Component用于明确指定需要启动的目标组件,而Extra则用于携带需要交换的数据

Intent的Component属性需要接受一个ComponentName对象,ComponentName对象包含如下几个构造器:

ComponentName(String pkg,String cls)

ComponentName(Context pkg,String cls)

ComponentName(Context pkg,Class<?> cls)

上面构造器的本质就是:创建一个ComponentName需要指定包名和类名,这就可以唯一确定一个组件类除此之外,Intent还包含了如下三个方法:setClass、setClassName、setClassName

指定Component属性的Intent已经明确了它将要启动哪个组件,因此这种Intent也被称为显示Intent,否则称为隐式Intent

ComponentName comp = new ComponentName(a.this,b.class);

Intent intent = new Intent();

intent.setComponent(comp);

可以简化为:Intent intent =  new Intent(a.this,b.class);

Intent的Action、Category属性都是一个普通的字符串,其中Action代表该Intent所要完成的一个抽象动作,而Category则用于Action增加额外的附加类别信息,通常Action属性会与Category属性结合使用,最终启动哪个组件,取决于<intent-filer/>元素的配置

<intent-filter/>元素里通常包含如下子元素:

0到N个<action/>子元素

0到N个<category/>子元素

0到1个<data/>子元素

一个Intent对象最多只能包含一个Action属性,程序可以调用Intent的setAction方法来设置Action属性值,但一个Intent对象可以包含多个Category属性,可以调用Intent的addCategory来添加

当程序创建Intent时,该Intent默认启动Category属性值为Intent.CATEGORY_DEFAULT常量(android.intent.category.DEFAULT)

Intent代表了启动某个程序组件的“意图”,实际上Intent对象不仅可以启动本应用内程序组件,也可以启动Android系统的其他应用的程序组件,包括系统自带的程序组件,Android内部提供了大量标准Action、Category常量

startActivity -- intent(Intent.ACTION_MAIN、Intent.CATEGORY_HOME)返回桌面

Data属性通常用于向Action属性提供操作的数据,Data属性接受一个Uri对象,一个Uri对象通常通过如下形式的字符串来表示:scheme://host:port/path

Type属性用于指定该Data所指定Uri对应的MIME类型,这种MIME类型可以是任何自定义的MIME类型,只要符合abc/xyz格式的字符串即可

Data属性与Type属性会相互覆盖,如果希望Intent既有Data属性,也有Type属性,应该调用Intent的setDataAndType方法

AndroidManifest.xml文件中为组件声明Data、Type属性都通过<data/>元素,mimeType用于声明该组件所能匹配的Intent的Type属性,scheme用于声明该组件所能匹配的Intent的Data属性的scheme部分,host、port、path、pathPrefix、pathPattern

Intent的Type属性必须与<data/>子元素的mimeType属性相同,才能启动该组件

Intent的Data属性并不要求android:scheme、android:host、android:port、android:path完全匹配

只有一个Intent同时匹配action、category、data类别才算完全匹配,完全匹配才能成功启动目标Activity,一个过滤规则中可以有多个action,只要Intent中的action能够和过滤规则中的任何一个action相同即可匹配成功,action要求Intent中必须有一个action且必须能够和过滤规则中的某个action相同,而category要求Intent可以没有category,但是如果你一旦有category,不管有几个,每个都要能够和过滤规则中的任何一个category相同

data由两部分组成,mimeType和URI,如果URI中没有指定scheme,那么整个URI的其他参数无效,如果host未指定,那么整个URI中的其他参数无效,这意味着URI是无效的,仅当URI中指定了scheme和host参数的时候port参数才是有意义的

下面两种写法,作用相同

<data android:scheme=“file”android:host=www.baidu.com/>

 

<data android:scheme=“file”/>

<data android:host=www.baidu.com/>

Extra属性通常用于在多个Action之间进行数据交换,Intent的Extra属性值应该是一个Bundle对象,Buidle对象就像一个Map对象,它可以存入多组key-value对

Flag属性:Intent.FLAG_ACTIVITY_CLEAR_TOPIntent.FLAG_ACTIVITY_NEW_TASK

Intent.FLAG_ACTIVITY_SINGLE_TOP:与加载模式singleTop功能相同

Intent.FLAG_ACTIVITY_CLEAR_TOP销毁目标Activity和它之上的所有Activity,重新创建目标Activity

Intent.FLAG_ACTIVITY_NEW_TASK

0 0
原创粉丝点击