我遇到了一个非常奇怪的情况,我得到了所有具有 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 台设备)。