intent构造函数有
(1)Intent();
(2)Intent(Intent copy);
(3)Intent(String action,Uri uri);
一、Intent启动方式分为implecit和explicit。
explicit明确要启动的class的name;使用Intent的构造函数Intent(action,class);
implicit没有明确指出要启动的组件的名称,而是通过IntentFilter来进行控制。具体IntentFilter有三个匹配项可以控制,分别是action,category,data.
1.1 action定义的是IntentFilter包含的特定动作或者一组动作,只要intent请求通过了其中动作组中的一条action就通过了该IntentFilter的动作测试。
<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>
1.2 category定义的是IntentFIlter的种类,匹配方式和action不一样(原因可以理解为一个Intent的意图action只能定义一个,但是intent的种类可以有很多),只有在Intent中有所有category都和IntentFilter中的category匹配,如果没有申明category的IntentFilter则只能与没有定义category的Intent匹配。
<intent-filter>
<category android:name="android.intent.Category.Default">
<category android:name="...">
</intent-filter>
1.3URI中的部分会与Intent Filter中的data标签比较。如果Intent Filter定义scheme,host/authority,path,mimetype,这些值都会与Intent的URI比较。任何不匹配都会导致Intent Filter从列表中删除。没有指定data值的Android Intent Filter会和所有的Intent数据匹配。
<intent-filter . . . >
<data android:type=”video/mpeg” android:scheme=”http” . . . />
<data android:type=”audio/mpeg” android:scheme=”http” . . . />
</intent-filter>
<data>元素指定了希望接受的Intent请求的数据URI和数据类型,URI被分成三部分来进行匹配:scheme、authority和path。其中,用setData()设定的Inteat请求的URI数据类型和scheme必须与IntentFilter中所指定的一致。若IntentFilter中还指定了authority或path,它们也需要相匹配才会通过测试。
mimetype是正在匹配的数据的数据类型。当匹配数据类型时,你可以使用通配符来匹配子类型(例如,earthquakes/*)。如果Intent Filter指定一个数据类型,它必须与Intent匹配;没有指定数据的话全部匹配。scheme是URI部分的协议——例如,http:,mailto:,tel:。host-name或“data authority”是介于URI中scheme和path之间的部分(例如,www.google.com)。匹配主机名时,Intent Filter的scheme也必须通过匹配。数据path是紧接在“data authority”的后面(例如,/ig)。path只在scheme和host-name部分都匹配的情况下才匹配。
解析出来后的处理逻辑
如果这个过程中多于一个组件解析出来的话,它们会以优先度来排序,可以在Android Intent Filter的节点里添加一个可选的标签。最高等级的组件会返回。
Android本地的应用程序组件和第三方应用程序一样,都是Intent解析过程中的一部分。它们没有更高的优先度,可以被新的Activity完全的代替,这些新的Activity宣告自己的Intent Filter能响应相同的动作请求。
实例1:
Intent intent = new Intent();
intent.setAction("com.android.zy.thirdactivity");//Intent intent = new Intent("com.android.zy.thirdactivity");
startActivity(intent);
<activity
android:name=".ThirdActivity"
android:screenOrientation="portrait" >
<intent-filter >
<action android:name="com.android.zy.thirdactivity"/>
</intent-filter>
</activity>
失败,找不到action对应的Activity。
实例2
Uri uri = Uri.parse("info://test");
//通过Action和URI调用第二个进程中的Activity,并传递数据
Intent intent = new Intent("com.android.zy.THIRD",uri);
startActivity(intent);
<activity
android:name=".ThirdActivity"
android:screenOrientation="portrait" >
<intent-filter >
<action android:name="com.android.zy.THIRD" />
<data android:scheme="info"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
成功了!之后试了去掉URI这一个属性也是OK的,所以判断category这个属性的特性是:默认情况下是没有category的。但是之后自定义category(不为DefaultCategory)的就是不OK了,还是报错找不到activity(intent和IntentFilter的category保证完全一样)。解决方法 :
<activity
android:name=".ThirdActivity"
android:screenOrientation="portrait" >
<intent-filter>
<action android:name="com.android.zy.THIRD" />
<category android:name="com.android.example.category" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
结论:intentFilter一定要有category android name="android.intent.category.DEFAULT"。