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

2016-11-13 13:56 评论 0 条

摘要:

隐式意图匹配需要指定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的其中一个相同(值一致),才能匹配成功。

当前文章价值9.83元,扫一扫支付后添加微信提供帮助!(如不能解决您的问题,可以申请退款)

你可能感兴趣的文章

来源:每日教程每日一例,深入学习实用技术教程,关注公众号TeachCourse
转载请注明出处: https://www.teachcourse.cn/2090.html ,谢谢支持!

资源分享

调用相机拍照后截取指定尺寸大小 调用相机拍照后截取指定尺寸大小
微信支付不成功的几个原因 微信支付不成功的几个原因
Android开发深入理解WebChromeClient之onShowFileChooser或openFileChooser使用说明 Android开发深入理解WebChrom
Android Studio搭配VirtualSVN Server与TortoiseSVN的深入学习 Android Studio搭配VirtualS

发表评论

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

表情