何时是家庭而不是家庭(启动器相关)

时间:2013-03-03 23:50:11

标签: android android-launcher

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

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

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

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

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

这是我正在做的事情(有一些评论可以避免混淆),而且对于记录我知道并非所有人都会在名称空间中使用表达式“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);

*** EDIT

根据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 个答案:

答案 0 :(得分:2)

getLaucnIntentForPackage专门针对CATEGORY_INFOCATEGORY_LAUNCHER - 而非CATEGORY_HOME,在这种情况下,它会返回 null 。来自Documentation

  

public abstract Intent getLaunchIntentForPackage(String packageName)

     

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

答案 1 :(得分:1)

  

但是,当我尝试获取默认的Launcher活动时,它会返回null。

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

  

当我尝试通过getLaunchIntentForPackag从中拉出相关的Launch活动时,如何确定stock home应用程序的包名称返回null时,我应该如何确定实际启动的内容?

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