最近碰到一个同事询问如何查询本地安装的浏览器列表,其使用的代码如下:

public static List<ResolveInfo> getBrowserList(Context context) {
PackageManager packageManager = context.getPackageManager(); Intent intent = new Intent(Intent.ACTION_VIEW);
intent.addCategory(Intent.CATEGORY_BROWSABLE);
intent.setData(Uri.parse("http://www.baidu.com/")); List<ResolveInfo> activities = packageManager.queryIntentActivities(intent,
                       PackageManager.MATCH_DEFAULT_ONLY); return activities;
}

运行结果如下:

com.android.browser

com.tencent.mtt

com.android.chrome

com.taobao.taobao

结果不知道怎么淘宝客户端就被当作browser添加进来了,后来发现原来淘宝客户端也添加了Intent.CATEGORY_BROWSABLE这个category过滤,但是使用

Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.setData(Uri.parse("http://www.baidu.com/"));
ComponentName name = new ComponentName("android",
"com.android.internal.app.ResolverActivity");
intent.setComponent(name);
context.startActivity(intent);

这样调起系统选择的浏览器的界面就没有出现淘宝客户端,这让我感觉很意外,于是看了com.android.internal.app.ResolverActivity的代码,发现有这样一段代码:

// Only display the first matches that are either of equal
// priority or have asked to be default options.
ResolveInfo r0 = currentResolveList.get(0);
for (int i=1; i<N; i++) {
ResolveInfo ri = currentResolveList.get(i);
if (r0.priority != ri.priority ||
r0.isDefault != ri.isDefault) {
while (i < N) {
if (mOrigResolveList == currentResolveList) {
mOrigResolveList = new ArrayList<ResolveInfo>(mOrigResolveList);
}
currentResolveList.remove(i);
N--;
}
}
}

于是将获取浏览器列表的逻辑改成了如下:

public static List<ResolveInfo> getBrowserList(Context context) {
PackageManager packageManager = context.getPackageManager(); Intent intent = new Intent(Intent.ACTION_VIEW);
intent.addCategory(Intent.CATEGORY_BROWSABLE);
intent.setData(Uri.parse("http://www.baidu.com/")); List<ResolveInfo> activities = packageManager.queryIntentActivities(intent,
                       PackageManager.MATCH_DEFAULT_ONLY); ResolveInfo r0 = activities.get(0); Iterator<ResolveInfo> activity_iter = activities.iterator();
while (activity_iter.hasNext()) {
ResolveInfo resolveInfo = activity_iter.next(); if (r0.priority != resolveInfo.priority ||
          r0.isDefault != resolveInfo.isDefault) {
activities.remove(resolveInfo);
}
} return activities;
}

运行得到的结果如下:

com.android.browser

com.tencent.mtt

com.android.chrome

总结:第一个是获取到的是最匹配查询条件的系统软件,所有app的优先级与其相同的即为所要获取的列表项。

最新文章

  1. Windows请求连接 Vmware+Ubuntu14被拒绝 的幽怨诉说
  2. 方便!C++ builder快捷键大全
  3. app基本信息
  4. markdown 基本语法
  5. 宏ut_mem_block_t
  6. oracle储存过程,job,视图,触发器(记性不好,写个例子自己记)
  7. 将Apache添加为Linux的服务 实现自启动(转)
  8. Java书籍推荐
  9. C# 中的常用正则表达式总结
  10. java 网络编程Socket编程
  11. Oracle 重建控制文件
  12. 【Java面试题】19 final,finally和finalize的区别
  13. Netty WebSocket 开发
  14. Matlab 学习视频集合
  15. [development][security][suricata] suricata 使用与调研
  16. CA证书和TLS介绍
  17. 浅谈 String 的 hashCode() 方法
  18. linux下导入导出数据库
  19. JS编写简单的弹窗插件(含有demo和源码)
  20. 【bzoj2001】 Hnoi2010—City 城市建设

热门文章

  1. pycharm和webstorm永久激活方法
  2. redis cluster 集群部署
  3. EntityFramework CodeFirst 数据库迁移
  4. Docker容器日志查看与清理(亲测有效)
  5. Android中的CardView使用
  6. Django From表单定制
  7. 初识backbone.js
  8. VS2010中VC++目录和C/C++之间的区别。VC++ Directories和C/C++的区别。
  9. 数据挖掘:基于Spark+HanLP实现影视评论关键词抽取(1)
  10. java开发中的设计模式