1

我遇到了一个非常奇怪的情况,我得到了所有具有 CATEGORY_HOME 意图的已安装软件包的列表。

我的意图是手动启动本机 Home 应用程序(目前不是默认的本机 Home 应用程序,因为我的应用程序具有该角色)。

因此,我使用的方法(下面)正确识别出有两个应用程序设置为 CATEGORY_HOME。

当我尝试启动我的那个(获取启动器活动)时,它工作正常。但是,当我尝试获取默认启动器活动时,它返回为空。

所以......我很难过。当我尝试从中提取相关的启动活动时,当股票主页应用程序的包名称返回 null 时,如何确定我应该实际启动 getLaunchIntentForPackag什么?

这就是我正在做的事情(有一些评论以避免混淆),并且为了记录,我知道并不是所有的人都会在名称空间中使用“android”这个表达式,但我正试图让它在最初的时候起作用一个确实与该字符串一起返回的设备,因此它的一部分不是问题。

            //get a list of all apps that set themselves up as CATEGORY_HOME
    final Intent intent = new Intent(Intent.ACTION_MAIN); 
    intent.addCategory(Intent.CATEGORY_HOME); 
    final List<ResolveInfo> list = ((PackageManager)getPackageManager()).queryIntentActivities(intent, 0);

    String packageName = null;
            //look for the one that has the word android in the package name
    for(ResolveInfo ri : list){

        if(ri.activityInfo.packageName.indexOf("android") != -1)
            //this does get set correctly and looks like "com.sec.android.app.launcher"
            packageName = ri.activityInfo.packageName;
    }

    PackageManager pm = SlidePlayer.this
            .getPackageManager();
    Intent it = pm.getLaunchIntentForPackage(packageName);

    //it is NULL so this doesn't work
            startActivity(it);

***编辑

根据 CommonsWare 的建议尝试以下方法...

String packageName = null;
    String className = null;
    for(ResolveInfo ri : list){
        //L.d("HOME PACK = " + ri.);
        if(ri.activityInfo.packageName.indexOf("android") != -1){
            className = ri.activityInfo.applicationInfo.className;
            packageName = ri.activityInfo.applicationInfo.packageName;
        }
    }

    //PackageManager pm = SlidePlayer.this
            //.getPackageManager();
    Intent it = new Intent();//pm.getLaunchIntentForPackage(packageName);

            //both packageName and className appear to be set correctly
             //packageName = "com.sec.android.app.launcher"
            //className = "com.android.launcher2.LauncherApplication"
    it.setClassName(packageName, className);
    it.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(it);

编辑 2 * 半huzzah ...

在一台设备(Samsung Note II)上,关键是通过 Component 像这样设置它......

     Intent it = new Intent();//pm.getLaunchIntentForPackage(packageName);
ComponentName cn = new ComponentName(packageName, className);
it.setComponent(cn);
//it.setClassName(packageName, className);
it.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(it);

这不适用于三星 Tab 10" 或摩托罗拉 M(这是迄今为止我用这种方法测试过的仅有的另外 2 台设备)。

4

2 回答 2

2

getLaucnIntentForPackage专门寻找CATEGORY_INFOor CATEGORY_LAUNCHER-not CATEGORY_HOME,在这种情况下它将返回null。从文档

公共抽象意图 getLaunchIntentForPackage (String packageName)

在 API 级别 3 中添加 返回“良好”意图以在包中启动前门活动,例如用于在浏览包时实现“打开”按钮。当前实现将首先查找类别 CATEGORY_INFO 中的主要活动,然后查找类别 CATEGORY_LAUNCHER 中的主要活动,如果两者都找不到,则返回 null。

于 2013-03-04T00:13:27.163 回答
1

但是,当我尝试获取默认启动器活动时,它返回为空。

这是因为大多数固件主屏幕并非设计为由主屏幕启动,因此可能不包括启动器活动。

当我尝试通过 getLaunchIntentForPackag 从中提取相关启动活动时,当股票主页应用程序的包名称返回 null 时,如何确定我应该实际启动什么?

由于它是主屏幕,因此您知道它必须具有与您相同ACTION_MAIN/的活动CATEGORY_HOME。找到那个并启动它。

于 2013-03-04T00:17:32.743 回答