隐式意图获取所有符合的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的其中一个相同(值一致),才能匹配成功。

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

你可能感兴趣的文章

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

资源分享

“Faild to load the JNI shared Library”解决办法 “Faild to load the JNI sh
关于Android项目中R文件缺失的解决办法 关于Android项目中R文件缺失的
生活杂谈之网站SEO优化方法-卢松松外链工具 生活杂谈之网站SEO优化方法-卢
harmony学习UIAbility生命周期 harmony学习UIAbility生命周期