Intent消息可用于当前运行时同应用内部的组件之间或者不同应用的组件之间通信。Intent自身,即一个Intent对象,包含说明一个执行操作的抽象数据结构,传递给执行操作的组件,或者,常见于broadcast的情况,该数据结构用于描述正在执行或者已经发生的事情。 针对组件类型不同,发送Intent有不同的机制:
在以上各种情况下,Android系统找到适合响应该Intent的activity、service或者broadcast service集合。不会出现重叠现象,即,broadcast intent只会发送给broadcast receiver,而不会发送给Activity或者Service。 Intent对象Intent对象可绑定一组信息:
隐式的intent需要用到不同的策略。android需要找到处理这个intent的最合适组件(集合)。要通过intent filter,比较intent对象和组件关联结构。filter根据组件的能力决定他们能处理哪些intent。android系统打开合适的组件处理相应的隐式intent。如果组件不包含任何intent filter,那只能接收显式的intent。带filter的组件既可接收隐式intent也可接收显式的。 Intent有三个方面可用于intent filter:
Intent filter为了能支持隐式intent,activity、service和broadcast receiver会包含1到多个intent filter。每个intent filter描述组件的可接收一组intent的能力。在intent filter中,说明了可接受的类型,以及不想要的intent。隐式的intent要想投递到一个组件,只需通过组件的一个filter即可。 组件把filter分成多个,是为了针对具体不同的任务。在sample中的Note pad示例中,NoteEditor activity有两个filter,一个用于启动并打开指定的note,另一个是为了打开新的空的note。 一个intent filter是一个IntentFilter类的实例。但是,android系统必须在组件未启动的情况下就知道它的能力,因此intent filter一般不会在java代码中设置,而是在应用的manifest文件中作为<intent-filter>元素的方式声明。一个例外是,为broadcast receiver注册动态的filter,可以调用Context.registerReceiver()方法,通过直接实例化IntentFilter对象创建。 filter有三个平等的部分:action、data和category。隐式intent将测试这三个部分。一个intent要想投递到一个组件,那么这三个测试都要通过才行。当然如果组件有多个intent filter,可能一个intent没有通过,但是通过了另外的一个,这样也可以把intent投递到组件。 action测试在intent filter中可以包含多个action,比如: <intent-filter . . . >要想通过测试,intent中的action名称要匹配其中之一。 如果intent filter中不包含action列表,而intent指定action,那么intent没有匹配的action,不通过;intent未指定action,而intent filter指定,会自动通过测试。 category测试在intent filter中可包含category列表: <intent-filter . . . >intent想通过测试,必须匹配一个intent filter中的category。 原理上讲,intent如果没有category设置,那么总是可以通过测试。这基本上是正确的,但是有一个例外。Android在为所有隐式intent执行startActivity()方法的时候,会认为它们至少包含了一个android.intent.category.DEFAULT。因此,如果activity想收到隐式intent,必须加入这个category。 date测试data元素在intent filter元素中,可以重复多次(action和category不允许重复的),也可以根本没有。比如: <intent-filter . . . >在data元素中指定uri和数据类型(MIME类型)。uri是被分开表示的: scheme://host:port/path其中host和port是关联的,如果host没有设置,port也会忽略。 所有这些属性都是可选的,但是不是独立的。比如,如果要设置path,那么也必须设置schema、host和port。 在比较intent中的uri和intent filter中指定的uri时,只会比较intent filter中提及的URL部分。比如,intent filter中只提及了schema,那么所有url包含这个schema的都匹配。在filter的path部分可以使用通配符做到灵活的匹配。 mimeType属性,比uri方式更常用。intent和intent filter都可以使用mime通配符的方式,比如,text/*。 如果既有mimeType,又有uri的情况,比较规则如下:
| Activity、Service和Broadcast Receiver这些核心组件之间通过消息激活,这个消息就是Intent。
Intent概念(转帖)
最新推荐文章于 2021-03-29 17:12:41 发布