摘要:
隐式意图匹配需要指定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是否存在,最后再启动。
第一种判断方式:
- PackageManager pm=getPackageManager();
- List<ResolveInfo> list=pm.queryIntentActivities(intent,0);
如果list不为null,说明找到符合条件的activity,并返回所有符合条件的activity信息
第二种判断方式:
- ComponentName name=intent.resolveActivity(getPackageManager();
如果name不为null,说明找到符合条件的其中一个activity,并返回符合条件的activity的组件名称
一.简单演示
创建ImplicitActivity和SecondActivity、ThreeActivity,在ImplicitActivity使用隐式意图启动activity,ImplicitActivity只声明一个action,category使用默认android.intent.category.DEFUALT,如下
- @Override
- public void onClick(View v) {
- Intent intent = null;
- if (intent == null) {
- intent = new Intent();
- intent.setAction("cn.teachcourse.action.MAIN");
- /**
- * 不指定category,默认给intent设置android.intent.category.DEFUALT
- */
- }
- ComponentName name=intent.resolveActivity(getPackageManager());
- if (name!= null) {
- startActivity(intent);
- } else {
- Toast.makeText(ImplicitIntentActivity.this, "找不到符合action和category的activity", Toast.LENGTH_SHORT).show();
- }
- }
SecondActivity和ThreeActivity的过滤规则声明,如下
- <activity
- android:name="cn.teachcourse.SecondActivity"
- android:label="callphone/SecondActivity">
- <intent-filter>
- <action android:name="cn.teachcourse.action.MAIN" />
- <category android:name="android.intent.category.DEFUALT" />
- </intent-filter>
- </activity>
- <activity
- android:name="cn.teachcourse.ThreeActivity"
- android:label="callphone/ThreeActivity">
- <intent-filter>
- <action android:name="cn.teachcourse.action.MAIN" />
- <category android:name="cn.teachcourse.category.SAMPLE_CODE" />
- </intent-filter>
- </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的其中一个相同(值一致),才能匹配成功。
你可能感兴趣的文章
转载请注明出处: https://www.teachcourse.cn/2090.html ,谢谢支持!