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
- Android随笔之——Activity中启动另一应用
- Android Activity中启动另一应用程序的方法
- Android入门-启动另一个个Activity
- Android Activity中启动另一应用程序的方法,无需得到类名
- Android Activity中启动另一应用程序的方法,无需得到类名
- Android 如何在Activity中启动另一应用程序的方法,无需得到类名
- android Activity中启动另一应用程序的方法,无需得到类名
- Android 如何在Activity中启动另一应用程序的方法,无需得到类名
- Android Activity中启动另一应用程序的方法,无需类名
- Android Activity中启动另一应用程序的方法,无需得到类名
- Android Activity中启动另一应用程序的方法,无需得到类名
- Android--Activity中启动另一应用程序的方法,无需得到类名
- 23、Android Activity中启动另一应用程序的方法,无需得到类名
- Android Activity中启动另一应用程序的方法,无需得到类名
- Android随笔(一)——Activity的四种启动方式
- Android随笔——Activity生命周期
- Android—Activity启动
- Android中实现Activity的启动拦截之----实现360卫士的安装应用界面
- 华硕A450J电脑在Ubuntu操作系统下通过wifi上网问题
- hdu #5884 Sort(快速哈夫曼树+队列)
- Android随笔之——PackageManager详解
- 棋盘问题(dfs)(poj-1321)
- 性能优化十七之图片压缩优化
- Android随笔之——Activity中启动另一应用
- hdu2102A计划
- 机器学习小组知识点39:广义线性模型(Generalized Linear Model)
- bzoj 3771: Triple (容斥原理+生成函数+FFT)
- 第九届河南省ACM程序设计大赛 NYOJ 1274 信道安全
- bzoj 4827: [Hnoi2017]礼物 fft
- Python学习第一弹——Python环境搭建
- Linux学习篇之~unit14
- 动态规划练习--05(吃糖果)