Intent:

在Android系统中,Intent是非常重要的一个概念,它是启动activity、service、broadcast这三大组件关键信息。那什么是Intent呢?SDK doc中是这样定义的: 引用 An Intent object is a bundle of information. It contains information of interest to the component that receives the intent (such as the action to be taken and the data to act on) plus information of interest to the Android system (such as the category of component that should handle the intent and instructions on how to launch a target activity).Intent是一些信息的集合,包括了目标组件感兴趣的信息和一些Android系统自身感兴趣的信息。

Intent主要包括如下几部分信息:
1.ComponentName(要处理本Intent的组件信息):
此部分是一个ComponentName对象,由一个完整类名和在manifest文件中设定的包名组成(完整类名的包部分和manifest中的包名不要求必须一致)。这个部分是可选的,如果设定了Intent的ComponentName,那么这个Intent将直接发送给对应的组件,如果没有设定,Android还有其他的方式来查找合适的组件处理此Intent。
2.Action:
由一个字符串表示的想要进行的活动(广播发出的Intent中的action代表的是已发生的活动)。
3.Data:
此部分是数据部分,包括数据的URI和MIME类型。
4.Category:
关于能处理本Intent的组件的其他信息的一个字符串。每个Intent可以有任意多个Category。
5.Extras:
键-值对表示的其他数据。
6.Flags:
指示Android系统如何启动或启动后如何处理activity的标志信息。

那么,系统是如何将Intent正确的投放个相应的组件的呢?
有如下两种方式:
1.确定的intent:Intent中设置了component name,系统会直接找到对应的组件类并将intent投放给它处理。常用于同一个程序内部,此方式优先级比2高。
2.不确定的intent:在intent中设置action、data、category中的一个或多个,系统根据系统中定组件的intent filter来决定如何投放intent。
Intent中其他信息与系统如何投放intent无关。


Intent filter:

Intent filter是activity 、service、broadcast receiver向Android系统通告自己会处理哪些不确定intent的方式(确定的intent会直接被投放到对应的组件,而不管其是否指定了自己的intent filter),只有能够通过这些filter过滤的intent才会被它们接收到。
一个组件可以有多个intent filter,每个filter向用户展示了此组件的一项能力。每一个filter都会比较action、 data 、category,只有这三项都通过,intent才算通过此filter的过滤而被投放到定义这个filter的组件。由于每个组件可能定义多个filter,一个intent可能通不过这个filter但是通过了另一个filter,所以还是可能会被投放到对应的组件的。
1.action过滤:
一个intent只能指定一个action,但是intent filter可以指定多个action。如果filter不指定action,那么所有的intent都不会通过这个filter
2.category过滤:
intent和intent filter都可以有多个category项,只有intent中的category都在filter中时,此intent才算通过过滤,即intent的category必须为filter的category的子集。因此,如果intent中没有category,那它总是能通过category过滤的。
但是有一种情况除外:对应startActivity()中的不确定的intent,Android系统总是认为这个intent是包含android.intent.category.DEFAULT这个分类的。如果activity想接收一个不确定的intent,那它必须在自己的intent filter中定义android.intent.category.DEFAULT这个category。
3.data过滤:
intent filter中也可以包含多个data项,过滤规则如下:
a.如果一个intent既没包含URI有没包含data type,那么只有filter也没包含两者时,才能通过过滤。
b.如果一个intent包含了URI但没有包含data type,并且data type不能通过URI推断出来时,只有这个URI符合filter的URI并且filter没有指定data type时才能通过过滤。
c.如果一个intent包含了data type但没有包含URI,只有filter也包含对应的data type且也没指定URI时才能通过过滤。
d.如果一个intent包含了URI和data type(或能够通过URI推断出data type),那么,如果data type符合filter时,会通过data type的过滤,要想通过整个data过滤,还必须通过URI部分的过滤:如果URI部分和filter的匹配,或者URI是content:或file:形式且filter中没有定义URI部分。
当inetnt通过了action、category、data过滤后才算通过了这个filter的过滤。

一些常用的配置:

从上面的d可以看出,Android期望一个组件可以接收content provider或本地文件的数据,只要它的filter列出data type而不需要列出content:和file:的URI。因此一种常用的配置方式就是filter类似于:<data android:mimeType="image/*" />
举个例子,当用户点击一个链接时:
1.浏览器软件会首先尝试直接显示链接的内容。
2.如果链接的内容不适于在网页上直接展示,那么它会把链接的scheme和data type等组成一个intent,由系统选择如何打开这些内容
3.如果没有其他的组件能打开,那么会调用download manager下载这些内容。
通过这种机制,信息将会有很多可能的组件来处理。
另外,如果一个程序想不接受任何附加的数据,完全自己来初始化自己,那么可以在intent filter中指定一个android.intent.action.MAIN的action。

更多相关文章

  1. Android——拍照、剪切、得到图片/从相册中选择照片(api19以上和
  2. android电话系统和ril分析(2)————rild详细分析
  3. Android系统移植与调试之------->如何修改Android设备的默认休眠
  4. Android应用编程--基本概念
  5. Android(安卓)StatFs类
  6. Android成长的故事——Android组件_ TextView && EditView
  7. android 关于prop属性
  8. Adobe AIR for Android开发记录
  9. 用ndk-build 编译C语言文件,生成可在android系统上运行的文件

随机推荐

  1. android 更新列表
  2. android:descendantFocusability 焦点 父
  3. Android中VISIBLE、INVISIBLE、GONE的区
  4. android widget ViewFlipper
  5. Android隐藏状态栏和标题栏
  6. 底部菜单
  7. CheckBox as Image use button
  8. (已解决)Android Studio JVM报错解决方案
  9. Android音频开发(3):使用AudioRecord实现录
  10. android 只能输入数字和字母并且弹出数字