Pau*_*ron 5 android intentfilter android-intent
我有一个关于意图解决的问题以及Intent.ACTION_PICK_ACTIVITY和Intent.ACTION_CHOOSER之间的区别(包括它的便利功能版本,Intent.createChooser()).
我正在写一个"包经理"应用程序.在其中我有一个ListActivity,它显示设备上安装的所有软件包(填充了PackageManager.getInstalledPackages()).我还在列表中注册了一个上下文菜单,其中一个项目是"启动".
下面是来自onContextItemSelected()的代码,用于处理"Launch"上下文菜单项.
Intent intent ;
List<ResolveInfo> ris ;
int nLauchables ;
int REQUEST_LAUNCH = 1 ; // for use in onActivityResult()
// PackageInfo pi ; // set outside this code
intent = new Intent (Intent.ACTION_MAIN) ;
intent.addCategory (Intent.CATEGORY_LAUNCHER) ;
intent.setPackage (pi.packageName) ; // limit to launchable activities in the package represented by pi
ris = getPackageManager ().queryIntentActivities (intent, 0) ; // get list of launchable activities in pi
nLaunchables = ris.size () ;
if (ris == null || nLaunchables == 0) {
// do nothing (in the real code, the "Launch" item is already disabled in this case, so this never happens)
}
else if (nLaunchables == 1) {
// only 1 launchable activity, so just start that activity
intent.setComponent (new ComponentName (ris.get (0).activityInfo.packageName, ris.get (0).activityInfo.name)) ;
startActivity (intent) ;
}
else if (nLaunchables > 1) {
// mutiple launchable activites, so let the user choose which one they want to launch
// Intent chooseIntent = new Intent (Intent.ACTION_CHOOSER) ;
// chooseIntent.putExtra (Intent.EXTRA_INTENT, intent) ;
// chooseIntent.putExtra (Intent.EXTRA_TITLE, "Select activity") ;
// startActivity (chooseIntent) ; // doesn't show all launchable activities in the package
//
// or
//
// startActivity (Intent.createChooser (intent, "Select activity") ; // doesn't show all launchable activities in the package
Intent pickIntent = new Intent (Intent.ACTION_PICK_ACTIVITY) ;
pickIntent.putExtra (Intent.EXTRA_INTENT, intent) ;
startActivityForResult (pickIntent, REQUEST_LAUNCH) ;
}
Run Code Online (Sandbox Code Playgroud)
我首先尝试了ACTION_CHOOSER版本......但它并不总是显示包中的所有可启动活动.例如,Google地图有4个可启动的活动(纬度,地图,导航和地点),这些活动显示ACTION_PICK_ACTIVITY,但ACTION_CHOOSER仅显示2(纬度,地图).我唯一可以看到的是,在使用ACTION_CHOOSER时显示的活动与不使用ACTION_CHOOSER时显示的活动之间的不同之处在于它们的<intent-filter>中有CATEGORY_DEFAULT.
以下是我参考的文档部分,以了解正在发生的事情:
CATEGORY_DEFAULT的文档部分地说,"在对某些数据执行操作时,设置此项将隐藏用户的任何活动而不设置它".
这似乎解释了我所看到的行为 ......但......
ACTION_CHOOSER的文档部分地说:"...... 即使其中一个活动当前被标记为首选活动,也将始终显示所有可能的活动." (强调我的)
这似乎是在与CATEGORY_DEFAULT上述文档冲突,并建议使用ACTION_CHOOSER和ACTION_PICK_ACTIVITY应产生相同的结果....和...
意图和意图解析的文件(对不起,作为一个新用户,我只限于帖子中的2个链接,所以我无法链接到这个...只需查看"意图解析"部分,"类别测试"部分说,"Android处理传递给startActivity()的所有隐式意图,就好像它们包含至少一个类别:android.intent.category.DEFAULT"(CATEGORY_DEFAULT常量).因此,愿意接收隐式意图的活动必须在其意图过滤器中包含android.intent.category.DEFAULT".(使用android.intent.action.MAIN过滤器和android.intent.category.LAUNCHER"设置是例外.它们标记开始新任务的活动以及在启动器屏幕上显示的活动.它们可以在类别列表中包含"android.intent.category.DEFAULT",但不需要.)"(强调我的)
同样,这似乎明确地说使用ACTION_CHOOSER和ACTION_PICK_ACTIVITY应该产生相同的结果.
那么,这只是ACTION_CHOOSER的不完整文档的情况(即,它没有提到CATEGORY_DEFAULT活动被排除在外)还是还有其他事情发生?
使用ACTION_PICK_ACTIVITY对我有用但不理想,因为需要用它调用startActivityForResult()(而不仅仅是startActivity()).
我认为您对文档中最后两段摘录的阅读并不是预期的含义。从ACTION_CHOOSER文档开始,“...即使其中一项当前被标记为首选活动,所有可能的活动也将始终显示”,特指首选活动。通常,当您使用隐式意图并且有多个活动匹配时,如果用户之前已从前一个选择器中为此意图选择了“始终”,那么您将在没有选择器的情况下获得该活动。如果您使用ACTION_CHOOSER意图,您将获得所有匹配的活动,即使已选择一项活动。这就是这一行的全部含义:“所有可能的活动”意味着与意图过滤器匹配的所有活动,也考虑到类别。这只是自动获取选择器与使用 之间差异的另一种解释ACTION_CHOOSER。
您调用的另一部分 aboutandroid.intent.action.MAIN和android.intent.category.LAUNCHER并不意味着该操作和类别是在意图过滤过程中专门处理的。不要忘记,大多数阅读本文档的人只是编写可启动的应用程序,并且需要知道要在清单中放入哪些内容才能在启动器中显示活动。这里的“例外”并不是意图过滤器规则的例外:它是隐式意图使用的通常行为的例外CATEGORY_DEFAULT,这只是一个例外,因为启动器设置此类别(CATEGORY_LAUNCHER)而不是CATEGORY_DEFAULT。
总之,正如您所发现的,意图解析的整个领域的记录相当不足,但是您提到的摘录中没有不一致之处:它们只是在谈论稍微不同的事情。
| 归档时间: |
|
| 查看次数: |
3546 次 |
| 最近记录: |