我遇到了一个非常奇怪的情况,我得到了所有已安装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(这是迄今为止我使用此方法测试的其他两款设备)。
答案 0 :(得分:2)
getLaucnIntentForPackage
专门针对CATEGORY_INFO
或CATEGORY_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
的活动。找到那个并启动它。