关于Intent的那些事儿(一)


intent构造函数有

(1)Intent();

(2)Intent(Intent copy);

(3)Intent(String action,Uri uri);



一、Intent启动方式分为implecitexplicit

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数据匹配。

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部分都匹配的情况下才匹配。

<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"。


参考 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值