读书人

Android终究那个Acitivity启动

发布时间: 2012-09-08 10:48:07 作者: rapoo

Android到底那个Acitivity启动

启动那个Acitivity有两种方式:implicit(隐藏) intent 和 explicit(明确) intent

Explicit Intent

明确的指定了要启动的Acitivity?
比如以下Java代码,明确指定了要启动B:?
Intent intent= new Intent(this, B.class)?

?

Implicit Intent


没有明确的指定要启动哪个Activity ,而是通过设置一些Intent Filter来让系统去筛选合适的Acitivity去启动。

当使用startActivity时,隐式Intent解析到一个单一的Activity。如果存在多个Activity都有能力在特定的数据上执行给定的动作的话,Android会从这些中选择最好的进行启动。

?

Implicit?Intent 到底发给哪个activity?

这需要进行三个匹配,一个是action,一个是category,一个是data。根据三个的匹配结果,找到应该启动的Activity。

?

Action Implicit Intent

动作匹配指Android Intent Filter包含特定的动作或没有指定的动作。

一个Intent Filter有一个或多个定义的动作,如果没有任何一个能与Intent指定的动作匹配的话,这个Intent Filter在算作是动作匹配检查失败。

<intent-filter>元素中可以包括子元素<action>,比如:?
<intent-filter>?
<action android:name=”com.example.project.SHOW_CURRENT” />?
<action android:name=”com.example.project.SHOW_RECENT” />?
<action android:name=”com.example.project.SHOW_PENDING” />?
</intent-filter>?
一条<intent-filter>元素至少应该包含一个<action>,否则任何Intent请求都不能和该<intent-filter>匹配。如果Intent请求的Action和<intent-filter>中个某一条<action>匹配,那么该Intent就通过了这条<intent-filter>的动作测试。

Category Implicit Intent

种类匹配更为严格。Intent Filter必须包含所有在解析的Intent中定义的种类。一个没有特定种类的Intent Filter只能与没有种类的Intent匹配。

<intent-filter>元素可以包含<category>子元素,比如:?
<intent-filter . . . >?
<category android:name=”android.Intent.Category.DEFAULT” />?
<category android:name=”android.Intent.Category.BROWSABLE” />?
</intent-filter>?
只有当Intent请求中所有的Category与组件中某一个IntentFilter的<category>完全匹配时,才会让该Intent请求通过测试,IntentFilter中多余的<category>声明并不会导致匹配失败。

Data Implicit Intent

Intent的数据URI中的部分会与Intent Filter中的data标签比较。如果Intent Filter定义scheme,host/authority,path或mimetype,这些值都会与Intent的URI比较。任何不匹配都会导致Intent Filter从列表中删除。没有指定data值的Android Intent Filter会和所有的Intent数据匹配。

读书人网 >Android

热点推荐