隐式意图获取所有符合的Activity

2016-11-13 13:56 阅读 3,693 次 评论 0 条
版权声明:本文著作权归TeachCourse所有,未经许可禁止转载,谢谢支持!
转载请注明出处:http://teachcourse.cn/2090.html

摘要:

隐式意图匹配需要指定action,一个intent中的action必须和过滤规则多个action的其中一个相同,才能成功匹配。category和action不同的是,intent中可以不指定category,如果不指定,默认给intent加上android.intent.category.DEFAULT,同样也必须过滤规声明了android.intent.category.CATEGORY才能匹配成功。如果指定了category,那么category的值必须和过滤规则多个category的其中一个相同。

为了防止找不到action和category匹配一致的activity调用startActivity或startActivityforResult,需要先判断符合条件的activity是否存在,最后再启动。

第一种判断方式:

  1. PackageManager pm=getPackageManager();  
  2. List<ResolveInfo> list=pm.queryIntentActivities(intent,0);  

如果list不为null,说明找到符合条件的activity,并返回所有符合条件的activity信息

第二种判断方式:

  1. ComponentName name=intent.resolveActivity(getPackageManager();  

如果name不为null,说明找到符合条件的其中一个activity,并返回符合条件的activity的组件名称

一.简单演示

创建ImplicitActivity和SecondActivity、ThreeActivity,在ImplicitActivity使用隐式意图启动activity,ImplicitActivity只声明一个action,category使用默认android.intent.category.DEFUALT,如下

  1. @Override  
  2. public void onClick(View v) {  
  3.                 Intent intent = null;  
  4.                 if (intent == null) {  
  5.                     intent = new Intent();  
  6.                     intent.setAction("cn.teachcourse.action.MAIN");  
  7.                     /** 
  8.                      * 不指定category,默认给intent设置android.intent.category.DEFUALT 
  9.                      */  
  10.                 }  
  11.                 ComponentName name=intent.resolveActivity(getPackageManager());  
  12.                 if (name!= null) {  
  13.                     startActivity(intent);  
  14.                 } else {  
  15.                     Toast.makeText(ImplicitIntentActivity.this"找不到符合action和category的activity", Toast.LENGTH_SHORT).show();  
  16.                 }  
  17.             }  

SecondActivity和ThreeActivity的过滤规则声明,如下

  1. <activity  
  2.             android:name="cn.teachcourse.SecondActivity"  
  3.             android:label="callphone/SecondActivity">  
  4.             <intent-filter>  
  5.                 <action android:name="cn.teachcourse.action.MAIN" />  
  6.                   
  7.         <category android:name="android.intent.category.DEFUALT" />  
  8.             </intent-filter>  
  9. </activity>  
  1. <activity  
  2.             android:name="cn.teachcourse.ThreeActivity"  
  3.             android:label="callphone/ThreeActivity">  
  4.             <intent-filter>  
  5.                 <action android:name="cn.teachcourse.action.MAIN" />  
  6.                   
  7.         <category android:name="cn.teachcourse.category.SAMPLE_CODE" />  
  8.             </intent-filter>  
  9. </activity>  

运行Demo后,点击按钮,ImplicitActivity启动找到符合条件的SecondActivity,然后启动它。ThreeActivity过滤规则中声明的category没有和ImplicitActivity默认的android.intent.category.DEFUALT一致,所以匹配失败。

如果在ImplicitActivity中添加:intent.setCategory("cn.teachcourse.category.SAMPLE_CODE"),则最终匹配成功的式ThreeActivity。从而得出一个结论:intent中声明的action、category必须和过滤规则中的多个action、category的其中一个相同(值一致),才能匹配成功。

关注公众号 扫一扫二维码,加我QQ

如果文章对你有帮助,欢迎点击上方按钮关注作者

来源:TeachCourse每周一次,深入学习Android教程,关注(QQ1589359239或公众号TeachCourse)
转载请注明出处:http://teachcourse.cn/2090.html
AsyncTask==Handler+Thread对比使用说明 AsyncTask==Handler+Thread对
Genymotion-eclipse-plugin插件安装 Genymotion-eclipse-plugin插件
浅谈Eclipse插件ADT 浅谈Eclipse插件ADT
浅谈SortedList方法使用 浅谈SortedList方法使用

发表评论

呲牙 憨笑 坏笑 偷笑 色 微笑 抓狂 睡觉 酷 流汗 鼓掌 大哭 可怜 疑问 晕 惊讶 得意 尴尬 发怒 奋斗 衰 骷髅 啤酒 吃饭 礼物 强 弱 握手 OK NO 勾引 拳头 差劲 爱你

表情