- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我对 Intent 解析以及 Intent.ACTION_PICK_ACTIVITY 和 Intent.ACTION_CHOOSER 之间的区别有疑问(包括它的便利函数版本 Intent.createChooser())。
我正在编写一个“程序包管理器”应用程序。我在其中有一个 ListActivity,它显示设备上安装的所有包(使用 PackageManager.getInstalledPackages() 填充)。我还在列表中注册了一个上下文菜单,其中一项是“启动”。
下面是我来自 onContextItemSelected() 的代码,用于处理“启动”上下文菜单项。
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) ;
}
我首先尝试了 ACTION_CHOOSER 版本...但它并不总是显示包中的所有可启动 Activity 。例如,Google map 有 4 个可启动的 Activity (纬度、 map 、导航和地点)显示为 ACTION_PICK_ACTIVITY,但 ACTION_CHOOSER 仅显示 2 个(纬度、 map )。在使用 ACTION_CHOOSER 时显示的 Activity 与不显示的 Activity 之间,我唯一能看到的不同之处在于它们的
以下是我查阅过的文档部分以了解正在发生的事情:
Docs for CATEGORY_DEFAULT部分地说,“设置此设置将向用户隐藏在对某些数据执行操作时未设置它的任何 Activity 。”
这似乎可以解释我所看到的行为...但是...
Docs for ACTION_CHOOSER部分地说,“...将始终显示所有可能的 Activity ,即使其中之一当前被标记为首选 Activity 。” (强调我的)
这似乎与 CATEGORY_DEFAULT 的上述文档冲突,并建议使用 ACTION_CHOOSER 和 ACTION_PICK_ACTIVITY 应该产生相同的结果。...和...
Intents 和 Intent Resolution 文档(抱歉,作为新用户,我在一篇文章中被限制为 2 个链接,所以我无法链接到这个...只需查看“Intent Resolution”部分,“类别测试”小节)部分地表示,“Android 将所有传递给 startActivity() 的隐式 Intent 视为它们至少包含一个类别:android.intent.category.DEFAULT”(CATEGORY_DEFAULT 常量)。因此,愿意接收隐式 Intent 的 Activity 必须在其 Intent 过滤器中包含 android.intent.category.DEFAULT”。(Filters with android.intent.action.MAIN” 和 android.intent.category.LAUNCHER” 设置是异常。它们标记开始新任务并显示在启动器屏幕上的 Activity 。它们可以在类别列表中包含“android.intent.category.DEFAULT”,但不需要.)"(强调我的)
同样,这似乎明确表示使用 ACTION_CHOOSER 和 ACTION_PICK_ACTIVITY 应该产生相同的结果。
那么,这只是 ACTION_CHOOSER 文档不完整的情况(即它没有提到 CATEGORY_DEFAULT Activity 被排除在外)还是有其他事情发生?
使用 ACTION_PICK_ACTIVITY 对我有用,但并不理想,因为需要用它调用 startActivityForResult()(而不仅仅是 startActivity())。
最佳答案
我认为您阅读文档的最后两段摘录并不是预期的意思。从 ACTION_CHOOSER
文档开始,“...将始终显示所有可能的 Activity ,即使其中之一当前被标记为首选 Activity ”,具体指的是首选 Activity 。通常,当您使用隐式意向并且有多个 Activity 匹配时,如果用户之前从先前的选择器中为此意向选择了“始终”,那么您将在没有选择器的情况下获得该 Activity 。如果您使用 ACTION_CHOOSER
Intent ,您将获得所有匹配的 Activity ,即使已经选择了一个 Activity 。这就是这一行的全部意思:“所有可能的 Activity ”是指与 Intent 过滤器匹配的所有 Activity ,同时也考虑了类别。这只是对自动获取选择器与使用 ACTION_CHOOSER
之间的区别的另一种解释。
你说的另一部分,关于android.intent.action.MAIN
和android.intent.category.LAUNCHER
,并不意味着那个action和category在 Intent 过滤过程中进行了特殊处理。不要忘记大多数阅读本文档的人只是在编写可启动的应用程序,并且需要知道在他们的 list 中放入什么才能在启动器中显示一个 Activity 。这里的“异常(exception)”不是 Intent 过滤器规则的异常(exception):它是隐式 Intent 使用 CATEGORY_DEFAULT
的通常行为的异常(exception),这只是一个异常(exception),因为启动器设置了这个类别( CATEGORY_LAUNCHER
) 而不是 CATEGORY_DEFAULT
。
总而言之,正如您所发现的那样, Intent 解析的整个领域都没有足够的文档记录,但是您提到的摘录中没有不一致之处:它们只是在谈论略有不同的事情。
关于android - ACTION_CHOOSER 和 ACTION_PICK_ACTIVITY 之间的 Intent 解析和区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7614652/
平时很少在jquery中用到this。查看代码时发现用到了,就调试出this的值,心想原来如此。还是挺有用的。这里总结一下this与$(this)的区别和使用。 $(this)生成的是什么?
使用单例类和应用程序范围的托管 bean 来保存应用程序数据有区别吗? 我需要查找某些 JNDI 资源,例如远程 bean 接口(interface),因此我为自己编写了一个单例来缓存我的引用并且只允
如果您仔细查看包含的图片,您会注意到您可以使用 Eclipse IDE 重构 Groovy 代码并将方法转换为闭包,反之亦然。那么,闭包到底是什么,它与方法有什么不同呢?有人可以举一个使用闭包的好例子
vagrant box repackage有什么区别( docs ) 和 vagrant package ( docs )? 我意识到 vagrant package仅适用于 VirtualBox 提
我想看看是否有人可以解释为什么以下代码适用于 valueOf 但不适用于其他代码。 import java.math.BigDecimal; public class Change { publ
这个问题已经有答案了: 已关闭12 年前。 Possible Duplicates: What is Closures/Lambda in PHP or Javascript in layman te
This question already has answers here: Vagrant, Docker, Puppet, Chef (3个答案) 2年前关闭。 docker和chef有什么共同
以下代码在95%的机器上产生相同的输出,但是在几台机器上却有所不同。在 Debug模式下,输出: Changing from New to Fin OK 但在 Release模式下: Changing
////Creating Object var Obj; // init Object Obj= {}; 它们之间有什么区别两个? 有没有可能把它变成一个单行? 这样使用有什么好处吗?
我想找出定时器服务之间的区别。我应该使用哪个以及何时使用。我正在使用 Jboss 应用服务器。 1) java.ejb.Schedule。 @Schedule注解或配置自xml。 2) javax.e
我发现在 C++ 中可以通过三种不同的方式将对象传递给函数。假设我的类(class)是这样的: class Test { int i; public: Test(int x);
有什么区别。 public class Test { public static void main(String args[]) { String toBeCast = "c
如果我有一列,设置为主索引,设置为INT。 如果我不将其设置为自动递增,而只是将唯一的随机整数插入其中,与自动递增相比,这是否会减慢 future 的查询速度? 如果我在主索引和唯一索引为 INT 的
这两种日期格式有什么区别。第一个给出实际时间,第二个给出时间购买添加时区偏移值。 NSDateFormatter * dateFormatter = [[NSDateFormatter alloc]
如果有一个函数,请说foo: function foo() { console.log('bar'); } 那么在 JavaScript 中,从另一个函数调用一个函数有什么区别,如下所示: f
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
代码是什么: class Time { private: int hours; int minutes; int seconds; pu
我知道这是非常基本的,但有人介意解释一下这两个数组声明之间的区别吗: #include array myints; ...和: int myints[5]; ...以及为什么 myints.size
我学会了如何根据 http://reference.sitepoint.com/css/specificity 计算 css 特异性但是,基于this reference,我不明白伪类(来自c)和伪元
为什么在运行 2) 时会出现额外的空行?对我来说 1 就像 2。那么为什么 2) 中的额外行? 1) export p1=$(cd $(dirname $0) && pwd) #
我是一名优秀的程序员,十分优秀!