2 baifaxiaoyao baifaxiaoyao 于 2012.10.25 14:36 提问

如何获得一组已经安装的android应用程序然后选择一个运行?

我已经试了:

Intent intent = new Intent(ACTION_MAIN);
intent.addCategory(CATEGORY_LAUNCHER);

但是这只显示那些预先安装的或者是可以运行ACTION_MAIN Intent类型的应用程序
我也知道我可以用PackageManager来获得所有的已经安装的应用程序,但是我怎么能够用这个来运行一个特定的应用程序?
谢谢。

3个回答

niangzhi
niangzhi   2012.10.25 15:41
已采纳

下边的代码是获得在android上已经安装的app的activity列表和方法:

final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
final List pkgAppsList = context.getPackageManager().queryIntentActivities( mainIntent, 0);

在ResolveInfo你可以得到所有的启动一个app需要的数据

liangchichexin
liangchichexin   2012.10.25 16:10

这是一个用packageManager的比较简单的方法

final PackageManager pm = getPackageManager();
        List<ApplicationInfo> packages = pm
                .getInstalledApplications(PackageManager.GET_META_DATA);

        for (ApplicationInfo packageInfo : packages) {

            Log.d(TAG, "Installed package :" + packageInfo.packageName);
            Log.d(TAG,
                    "Launch Activity :"
                            + pm.getLaunchIntentForPackage(packageInfo.packageName)); 

        }
    }
gouxiaojin
gouxiaojin   2012.10.25 16:40

你可以看看这个例子:

class PInfo {
    private String appname = "";
    private String pname = "";
    private String versionName = "";
    private int versionCode = 0;
    private Drawable icon;
    private void prettyPrint() {
        Log.v(appname + "\t" + pname + "\t" + versionName + "\t" + versionCode);
    }
}

private ArrayList<PInfo> getPackages() {
    ArrayList<PInfo> apps = getInstalledApps(false); /* false = no system packages */
    final int max = apps.size();
    for (int i=0; i<max; i++) {
        apps.get(i).prettyPrint();
    }
    return apps;
}

private ArrayList<PInfo> getInstalledApps(boolean getSysPackages) {
    ArrayList<PInfo> res = new ArrayList<PInfo>();        
    List<PackageInfo> packs = getPackageManager().getInstalledPackages(0);
    for(int i=0;i<packs.size();i++) {
        PackageInfo p = packs.get(i);
        if ((!getSysPackages) && (p.versionName == null)) {
            continue ;
        }
        PInfo newInfo = new PInfo();
        newInfo.appname = p.applicationInfo.loadLabel(getPackageManager()).toString();
        newInfo.pname = p.packageName;
        newInfo.versionName = p.versionName;
        newInfo.versionCode = p.versionCode;
        newInfo.icon = p.applicationInfo.loadIcon(getPackageManager());
        res.add(newInfo);
    }
    return res; 
}
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
使用命令行创建并运行android apk
有时候觉得为了写一个简单的apk就开启android studio或者Eclipse太麻烦了. 所以就想着是不是可以用命令行的方式来生成一个android apk工程并安装到手机上测试.于是, 上网搜刮资料, 于是就有了如下内容: 1. 在命令行中输入 : android list. 这个命令是用来查看当前我们安装了的有效的android系统(SDK) 2. 创建android
selenium学习-----xpath和css定位一组元素
上一篇博文中写到了用tag name来定位一组元素,本篇文章中用XPath和css实现定位一组元素,两者的区别在于用tag name找到一组标签之后,用for循环来进行遍历,在遍历的过程中通过get_attribute(&quot;type&quot;)对type属性进行判断,通过XPath和CSS可以直接判断属性值,还是以checkbox.html为例checkbox.html&amp;lt;html&amp;gt; &amp;lt;he...
Navicat Premium 11.2.16 X64位简体中文版破解
解压运行,然后选择你已经安装的navicat mysql 启动exe文件,即可破解
查看Silverlight是否安装,版本
http://www.microsoft.com/getsilverlight/get-started/install/default.aspx
android应用程序如何获得系统权限
在 android 的API中有提供 SystemClock.setCurrentTimeMillis()函数来修改系统时间,可惜无论你怎么调用这个函数都是没用的,无论模拟器还是真机,在logcat中总会得到"Unable to open alarm driver: Permission denied ".这个函数需要root权限或者运行与系统进程中才可以用。   本来以为就没有办法在应用程
Android应用程序源代码
一个Android应用程序的源代码,适合需要解析代码的学生获得
Android应用程序用户界面(十二)菜单
菜单是很多类型的应用程序中的通用用户界面组件。为了提供一个相似和一致的用户体验,你应该使用菜单的API来提示用户可执行的动作或你的活动中的其他选项。从Android 3.0开始,使用Android系统的设备不再要求提供专门的菜单按钮。伴随着这种改变,Android应用程序应该不再依赖传统的六元素菜单面板,而是提供一个动作条来提示普遍的用户动作。尽管某些菜单项的设计和用户体验已经改变,但是定义动作和选
ora-30926 无法在源表中获得稳定的行
1.一般就是需要一个值的地方,取到了多个值。 2.就是多值了。  我出现这个问题的时候是这样的。   table A  left join table B  on (A.name=b.Name) A中的name值唯一,而B中的name值不唯一 造成了这种错误。
第九章:定位一组元素
有时候一个页面上有多个对象需要操作,如果一个个去定位的话,比较繁琐,这时候就可以定位一组对象。 webdriver 提供了定位一组元素的方法,跟前面八种定位方式其实一样,只是前面是单数,这里是复数形式:find_elements  实例一:find_elements_by_css_selector() 一、定位搜索结果     1.在百度搜索框输入关键字
merge into 从一个表的一列数据复制到另一个表的一列 oracle 中报ora-30926 无法在源表中获得稳定的行
转自: http://hi.baidu.com/ex_dijkstra/item/a902e601cd1e2917cd34ea73  2)在merge的时候也遇到一个问题,出现”ORA-30926: 无法在源表中获得一组稳定的行。“这个问题原因比较简单,因为在merge into时需要设定一个key值,会根据这个key值来决定merge into的操作(update还是insert