Android开发速成简洁教程七:Intents和Intent Filters

移动开发 Android
Android应用中的三个核心组件:Activities,Services和broadcast receivers都是通过称为“Intent”的消息来激活的。Intent本身为一个数据载体,可以描述想要执行的操作以及用于这个操作的数据和其它属性。

Android应用中的三个核心组件:Activities,Services和broadcast receivers都是通过称为“Intent”的消息来激活的。Android应用一个特点是“低耦合”,各个Activities,Services 和broadcast receivers相当独立,可以看成是一个个“迷你应用”,而Intent是这些“迷你应用”的粘合剂,Intent不但可以用于同一个 Application之间Activities,Services和broadcast receivers的交互,也可以用于不同Application之间Activities,Services和broadcast receivers的交互。

Intent本身为一个数据载体,可以描述想要执行的操作以及用于这个操作的数据和其它属性。用个容易理解的概念,在访问网站时,我们需要提供网站的 URL,有时还需要通过URL参数,在Android世界里,Intent 的功能类似于URL,Android操作系统根据Intent来触发对于的Activitives,Services或是Broadcast Receivers。

Android应用中的三个核心组件:Activities,Services和broadcast receivers都是通过Intent来触发的,当它们触发的机制各不相同,而且不会有重叠,也就是说发给Activity的Intent不会激活 Service或是broadcast receivers,发给broadcast receivers的Intent也不会触发Activity和Service。

  1. Activity 通过方法 Context.startActivity() 和 Activity.startActivityForResult()来调用。以函数调用为参考startActivity() 相当于调用无返回值的函 数,startActivityForResult()调用的Activity有返回值,可以通过Activity.setResult()来返回结果。
  2.  Context.startService()用来初始化Service,Context.bindService()可以用来建立与目标Service之间的连接,如果Service没有运行,则会启动该Service。
  3. Broadcast Receiver是通过  Context.sendBroadcast(), Context.sendOrderedBroadcast(), 和Context.sendStickyBroadcast()来触发的。大部分的Broadcast消息来自于Android操作系统,如电池状态,来 电,短消息等。

和URL不太一样的是,URL和网站一般是一一对应的,而一个Intent可以用来触发某个指定的Activity,Service或是 Broadcast Receiver,或是触发多个满足Intent条件的Activities,Services或是Broadcast Receivers。

下面来看看Android OS如何根据Intent来找到满足触发条件的Activity,Service或是Broadcast Receiver.  借用SQL 数据库的概念可以更好的理解。

     SELECT (Activitives|Services|Broadcast Receivers) AS Target

     FROM  (List in AndroidManifest.xml)

     WHERE Intent Meet Target’s (Intent Filter)

意思就是从AndroidManifest.xml中定义的Activities,Services和Broadcast Receiver列表中查找符合Intent 条件的Activities,Services,或是Broadcast Receivers。所有能活被激活的Activity,Service和Broadcast Receiver都必须在AndroidManifest.xml有定义,否则Android OS无法查询到该目标,相当于数据库中无记录,即使你在代码中定义了该Activity,Service或Broadcast Receiver。

Intent

Intent本身为一个数据载体,可以描述想要执行的操作以及用于这个操作的数据和其它属性。它主要包含下列信息:

Component name:可以处理该Intent的组件名称,组件名称指定义Activity,Service 的包和类的全名称。比如类名为com.pstreets.gisengine.AndroidGISEngineTutorial ,包名为com.pstreets.gisengine。 组件名称为可选项,如果指定了,意味明确指定用来响应该Intent的Activity,Service。

Action: 列出需要执行的操作名称。或者在Broadcast Intents的情况下给出发生的事件名称。

Constant Target component Action
ACTION_CALL activity 开始打电话.
ACTION_EDIT activity 显示编辑对话框.
ACTION_MAIN activity 作为一个任务(应用)的起始Activity,对于可以从Android应用列表的应用来说,都需要在AndroidManifest.xml 中设置ACTION_MAIN的Intent-Filter属性。
ACTION_SYNC activity 同步数据.
ACTION_BATTERY_LOW broadcast receiver 电池电量低告警.
ACTION_HEADSET_PLUG broadcast receiver 耳机插入或拔出.
ACTION_SCREEN_ON broadcast receiver 屏幕打开或关闭.
ACTION_TIMEZONE_CHANGED broadcast receiver 时区变动.

Data:定义不数据的URL以及数据的MIME类型。不同的Action能够处理的Data类型也不一样,比如 ACTION_CALL,它处理的数据格式为tel: URI,URI为电话号码。

Category: 定义了可以响应Intent的附加信息,一个Intent可以指定多个Category类型。和Action类似,Android 预定义了一些Category类型:

Constant  Meaning 
CATEGORY_BROWSABLE 表示目标Activity可以使用浏览器安全显示指定连接,比如说一个图片或是Email消息.
CATEGORY_GADGET 表示该Activity可以当作一个Gadget嵌入到其它可以放置Gadget的Activity中。
CATEGORY_HOME 表示还Activity是Home Screen,可以设置这个属性来替换Android自带的Home Screen。
CATEGORY_LAUNCHER 该Activity可以显示在Android程序管理器中。一般应用的主Activity都会在AndroidManifest.xml 定义该属性。

Extra:  附加Key-Value列表,可以向目标Activity传送附加参数。可以理解成函数调用时的参数。

Flags:指出Android启动目标Activity时的一些选项(比如目标Activity隶属于那个应用等)。

除非是Intent明确指定目标(Explicitly)Activity的类和包名称,这是Activity无需在 AndroidManifest.xml定义intent-filter,其它情况也叫隐含(Implicit)方式启动目标Activity,在这种情 况下Android 操作系统查找目标Activity,Service或是Broadcast Receiver时主要根据Intent 的Action,Data 和Category属性来匹配定义在AndroidManifest.xml 中 Activity,Service或是Broadcast Receiver的 Intent Filters。

Intent Filters

Android中没个有效的Activity,Service,Broadcast Receiver都必须在AndroidManifest.xml有对应的定义。除非只使用明确调用发生来启动目标Activity,每个 Activity都需要定义一个intent-filter。下面是是明确指定目标Activity的示例代码:

  1. Intent intent=new Intent(SplashActivity.this,GNavigator.class); 
  2. startActivity(intent); 

而更一般的情况,Activity在AndroidManifest.xml具有如下定义:

  1. <activity android:name=”.AndroidGISEngineTutorial” 
  2.     android:label=”@string/app_name”> 
  3.  <intent-filter> 
  4.   <action android:name=”android.intent.action.MAIN” /> 
  5.   <action android:name=”com.example.project.SHOW_CURRENT” />    
  6.   <action android:name=”com.example.project.SHOW_RECENT” />    
  7.   <action android:name=”com.example.project.SHOW_PENDING” /> 
  8.    
  9.   …. 
  10.   <category android:name=”android.intent.category.DEFAULT” />    
  11.   <category android:name=”android.intent.category.BROWSABLE” /> 
  12.   … 
  13.    <data android:mimeType=”video/mpeg” android:scheme=”http” . . . />     
  14.    <data android:mimeType=”audio/mpeg” android:scheme=”http” . . . /> 
  15.    …. 
  16.  </intent-filter> 
  17. </activity> 

Activity的intent-filter可以包含action,category,data 子元素,给出了该Activity能够处理的Intent的Action,Category和数据类型。Android 操作系统就是根据Activity的intent-filter来匹配Intent,从而触发目标Activity,或是 Service,Broadcast Receiver。

最常见的一个Intent Filter组合如下:

  1. <intent-filter . . . >    
  2.    <action android:name=”code android.intent.action.MAIN” />    
  3.    <category android:name=”code android.intent.category.LAUNCHER” /> 
  4.   </intent-filter> 

表示用户可以从Android设备的应用程序管理器启动该Activity,这个Activity为应用的主Activity,主Activity可以再使用Intent触发或是启动其它Activity。

责任编辑:闫佳明 来源: imobilebbs
相关推荐

2013-12-26 15:10:08

Android开发应用和框架Linux 内核

2013-12-26 15:43:07

Android开发Android应用Activities

2013-12-26 15:18:09

Android开发安装开发环境

2013-12-27 14:05:22

Android开发Android应用Dialog

2013-12-27 14:16:43

Android开发Android应用线程

2013-12-27 14:34:46

Android开发Android应用短信触发示例

2013-12-27 16:06:10

Android开发Android应用发布应用

2013-12-27 13:27:05

Android开发Android应用RadioButton

2013-12-26 15:46:30

Android开发Android应用用户界面设计

2013-12-26 15:34:19

Android开发Android应用基本概念

2013-12-27 13:49:22

Android开发Android应用Button

2013-12-27 12:51:44

Android开发Android应用引路蜂

2013-12-26 16:59:12

Android开发Android应用数据绑定Data Bi

2013-12-27 15:31:26

Android开发Android应用资源Resources

2013-12-26 16:46:21

2013-12-27 13:00:30

Android开发Android应用Context Men

2013-12-26 17:08:36

Android开发Android应用自定义Adapter显

2013-12-27 15:11:17

Android开发访问Internet绘制在线地图

2013-12-27 14:10:36

Android开发Android应用Transform

2013-12-27 12:42:15

Android开发Android应用引路蜂
点赞
收藏

51CTO技术栈公众号