Android随笔之——Activity中启动另一应用

来源:互联网 发布:js object clone 编辑:程序博客网 时间:2024/06/06 20:59

最近在写语音交互程序,在语音打开应用这块碰到如何用代码控制应用启动的问题。百度了一下,有两种方案:1、获取应用的包名;2、获取应用的包名、入口类名。

  之前对两种方案都进行了尝试,发现方案二中存在一个弊端,那就是系统级应用只能获取到包名,不能获取到入口类名,这会导致程序报错,当然你也可以不获取系统级应用的包名和入口类名。出于简单方便的考虑,选择了方案一,废话不多说,上代码。

方案一、

1、获取程序包名:

复制代码
 1      // 获取PackageManager对象 2         PackageManager packageManager = getPackageManager(); 3         // 得到系统安装的所有程序的PackageInfo对象 4         List<PackageInfo> packages = packageManager.getInstalledPackages(0); 5         // 创建String类型的数组,用来存放获取的包名 6         ArrayList<String> packageList = new ArrayList<String>(); 7  8         for (int i = 0; i < packages.size(); i++) { 9             PackageInfo packageInfo = packages.get(i);10 11             // 判断是否是系统级应用12             if ((packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {13                 packageList.add(packageInfo.packageName);14             }15         }
复制代码

 

2、根据获取的包名启动应用:

复制代码
 1      // 获取PackageManager对象 2         PackageManager packageManager = getPackageManager(); 3         // 获取索引为i的包名 4         String packageName = packageList.get(i); 5         // 如果该程序不可启动(像系统自带的包,有很多是没有入口的)会返回NULL 6         Intent intent = packageManager.getLaunchIntentForPackage(packageName); 7  8         if (intent != null) { 9             startActivity(intent);10         }
复制代码

 

方案二、还没仔细研究过,不过对那些主入口设置<intent-filter>的应用,方案二应该会优于方案一

1、获取包名、主类名:

复制代码
 1      // 获取PackageManager对象 2         PackageManager packageManager = context.getPackageManager(); 3          4         Intent intent = new Intent(Intent.ACTION_MAIN); 5         intent.addCategory(Intent.CATEGORY_LAUNCHER); 6  7         // 通过查询,获得所有ResolveInfo对象. 8         List<ResolveInfo> resolveInfos = packageManager.queryIntentActivities( 9                 intent, 0);10         // 调用系统排序 , 根据name排序11         // 该排序很重要,否则只能显示系统应用,而不能列出第三方应用程序12         Collections.sort(resolveInfos, new ResolveInfo.DisplayNameComparator(13                 packageManager));14 15         for (ResolveInfo reInfo : resolveInfos) {16             String activityName = reInfo.activityInfo.name; // 获得该应用程序的启动Activity的name17             String pkgName = reInfo.activityInfo.packageName; // 获得应用程序的包名18             19             System.out.println("activityName---" + activityName + " pkgName---"20                     + pkgName);21         }
复制代码

2、启动应用:

复制代码
1 Intent intent = new Intent(Intent.ACTION_MAIN);2 intent.addCategory(Intent.CATEGORY_LAUNCHER);3 4 ComponentName cn = new ComponentName(packageName,className);5 6 intent.setComponent(cn);7 context.startActivity(intent);
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 gta5线上马丁任务卡了怎么办 双肩背包黑色的皮子褪色怎么办 lspdfr在游戏里崩溃怎么办 gta5钱超过21亿怎么办 假警察要带走我怎么办 遇到假警察拦车怎么办 大连船员体检眼力不合格怎么办 禁行如果通过了怎么办 钻戒的戒圈磨损怎么办 多肉的肉掉了怎么办 电脑自带鼠标动不了怎么办 笔记本电脑自带鼠标动不了怎么办 包包弹簧扣松了怎么办 耳钉氧化成黑色怎么办 想买点小股票玩玩要怎么办 玩具子弹打到眼睛怎么办 玩具汽车遥控器码乱了怎么办 索尼A7屏幕花了怎么办? 汽车冷冻器坏了怎么办 sim卡损坏怎么办 补卡 异或门一个输入怎么办 迷你世界加不了好友怎么办 电脑软件显示无效应用程序怎么办 美的滚筒洗衣机打不开门怎么办 手机存储卡坏了怎么办 回南天地板潮湿怎么办 lg滚筒洗衣机门打不开怎么办 西门子滚桶洗衣机门打不开怎么办 洗衣机离合器螺丝卸不动怎么办 门锁保险栓坏了怎么办 小车电瓶没电了怎么办 重装机兵战车底盘坏了怎么办 父亲沉迷安利十年该怎么办 脚的大脚骨痛怎么办 自考准考证号忘记了怎么办 有桌子老师不出马怎么办 电商遇到职业打假人怎么办 超市遇到职业打假人怎么办 阿里巴巴碰到职业打假人怎么办 商家遇到职业打假人怎么办 买过期食品不赔怎么办