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

Android随笔之——Activity中启动另一应用的更多相关文章

  1. Android学习笔记——Activity的启动和创建

    http://www.cnblogs.com/bastard/archive/2012/04/07/2436262.html Android Activity学习笔记——Activity的启动和创建 ...

  2. Android开发9——Activity的启动模式

    在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作.在Android中Activity的启动模式决定了Activity的启动运行方式. 一. ...

  3. 【转】android之在activity中控制另一个activity的UI更新_如何在activity之间传递handler

    来自:http://blog.csdn.net/jason0539/article/details/18055259 遇到一个问题,需要在一个activity中控制另一个acitivity做一些更新, ...

  4. Android 实现在Activity中操作刷新另外一个Activity数据列表

    做android项目中遇到这样一个问题:有两个acticity,一个显示好友列表,另外一个显示会话列表,现在问题是在会话界面增加一个添加好友功能,添加好友后要求实时的刷新好友列表. 想了想,找了两种方 ...

  5. Activity 怎么和 Service 绑定,怎么在 Activity 中启动自己对应的 Service?

    Activity 通过 bindService(Intent service, ServiceConnection conn, int flags)跟 Service 进行绑定,当绑定成功的时候 Se ...

  6. Android,配置Activity为启动Activity(AndroidManifest.xml,application,intent-filter,MAIN,LAUNCHER)

    备忘: 将Activity注册为启动Activity. 在AndroidManifest.xml中的<application>元素中加入以下<activity>子元素内容: & ...

  7. 在一个Activity中启动另一个Activity

    一.新建一个空的工程 二.添加一个Activity并命名为BAty 三.在activity_main.xml中添加一个按钮,设置id号为btnStartB <Button android:lay ...

  8. android 49 广播接收者中启动其他组件

    main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" andro ...

  9. Android 关于在Activity中监听ListView

    Android 开发时,最常用的控件之一就是ListView了,而使用ListView的同时,必然需要对它设置监听器,常用的监听器有这么几个: 1. OnItemClickListener // 监听 ...

随机推荐

  1. Linux下Nano命令使用指南

    1.什么时候用nano? 一般网络很卡,ssh时一用vim/vi 就死窗口,或者死机的情况 2.如何使用?   打开或新建文件 #nano 文件名    禁用自动换行 #nano -w /etc/fs ...

  2. grunt-connect-proxy解决开发时跨域问题

    最近的项目中前后端是完全分离开发的,前端用grunt管理项目.这样就会导致一个问题:开发时前端调用后台的接口时因为不在一个服务器,所以会出现跨域问题.但是也不能用JSONP或CROS方式实现真正的跨域 ...

  3. 搭建OpenStack,kvm环境准备

    一.KVM简介 KVM全称是kernel-based virtual machine(基于内核的虚拟机),是一个开源的系统虚拟化模块,基于硬件的完全虚拟化,不过需要硬件支持(如Intel VT技术或者 ...

  4. C#委托与事件的简单使用

    前言:上一篇博文从原理和定义的角度介绍了C#的委托和事件.本文通过一个简单的小故事,来说明C#委托与事件的使用方法及其方便之处. 在阅读本文之前,需要你对委托和事件的基本概念有所了解.如果你是初次接触 ...

  5. [转]关于SVN的操作批处理示例

    为了一句话:不要动手做机器能够做的事情. 天天工作用svn,更新啥的打开目录啥的动作天天在重复.每次写些命令也蛮无聊的,不说了,看下面: @echo off rem 显示部分 @echo 注 意 事 ...

  6. python之路 - 爬虫

    网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁.自动索引.模拟程序或者蠕 ...

  7. 八大排序算法Java

    目录(?)[-] 概述 插入排序直接插入排序Straight Insertion Sort 插入排序希尔排序Shells Sort 选择排序简单选择排序Simple Selection Sort 选择 ...

  8. tomcat:域名指向项目名

    把项目部署到tomcat目录webapps后,使用域名访问的时候域名后面需要加上项目名称,如果想直接输入域名就可以访问项目呢?看了下tomcat官方文档,我修改了tomcat安装目录下conf/ser ...

  9. OPENDATASOURCE读取远程数据库数据中文乱码问题-sqlserver R2

    insert into kraft_sync_Store(StoreName,StoreCode,Province,PrefectureCity,CountyCity,Region,Area,Unit ...

  10. linux命令初识

    一.查看当前的目录文件 ls  demo   查看demo目录下的所有文件 ls  -l  demo/test.txt   --查看指定目录(test.txt)的详细内容 二.复制文件 cp   or ...