zoukankan      html  css  js  c++  java
  • Android随笔之——Activity中启动另一应用

      最近在写语音交互程序,在语音打开应用这块碰到如何用代码控制应用启动的问题。百度了一下,有两种方案: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的name
    17             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);

    作者:登天路

    转载请说明出处:http://www.cnblogs.com/travellife/

    作者:登天路

    转载请说明出处:http://www.cnblogs.com/travellife/
    GitPages:http://www.littlejie.com/
  • 相关阅读:
    理解C#系列 / 核心C# / 常量
    理解C#系列 / 核心C# / 变量
    理解C#系列 / C#语言的特性
    理解C#系列 / .NET体系结构
    利用DMZ对象保护全局变量
    随手翻的一道摩拜校招题
    关于为函数形参赋值和搜索变量标识符的云云
    竟然修改形参有这么可怕的后果!!
    牛得一逼的delete操作符
    屏蔽属性
  • 原文地址:https://www.cnblogs.com/travellife/p/3930179.html
Copyright © 2011-2022 走看看