以编程方式启动默认的android启动器

新手上路,请多包涵

我正在寻找一种以编程方式启动默认 android 启动器的方法,可能类似于下面的代码。还是我必须向清单文件中添加一些内容?谢谢!

 Intent intent = new Intent();
intent.setClassName("com.android.launcher", "Launcher");
startActivity(intent);

原文由 dosa 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 273
2 个回答

你试过这个吗?

 startActivity(new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_LAUNCHER));

(我自己没试过,因为我的用例有点复杂—我已经更换了启动器,我想调用 的启动器……)

我还发现您可以使用包管理器查看所有满足某些意图过滤条件的活动。例如,如果要查找标记为主页默认主页活动的所有活动,请使用:

 Intent intent=null;
final PackageManager packageManager=getPackageManager();
for(final ResolveInfo resolveInfo:packageManager.queryIntentActivities(new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME), PackageManager.MATCH_DEFAULT_ONLY))
{
    if(!getPackageName().equals(resolveInfo.activityInfo.packageName))  //if this activity is not in our activity (in other words, it's another default home screen)
    {
        intent=packageManager.getLaunchIntentForPackage(resolveInfo.activityInfo.packageName));
        break;
    }
}

请注意,我已经替换了我设备上的默认主屏幕——这就是为什么我必须确保我找到的活动不是正在运行的活动!如果您没有替换默认的主页活动,则不需要此检查——只需使用第一个(也可能是唯一的)默认主页活动。

(请注意,我仍然无法从我的启动器启动旧启动器,也许是因为旧启动器保留了默认启动器的记录,这是我的新启动器,并简单地回调它。我不知道。但在至少它不会崩溃,我猜想,如果你没有更换旧的主屏幕,它可能会起作用。)

原文由 Garret Wilson 发布,翻译遵循 CC BY-SA 3.0 许可协议

按照 Garret Wilson 的回答,这是一个丑陋的单行代码,假设 context 是您的应用程序上下文:

 context.startActivity(new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME).setPackage(context.getPackageManager().queryIntentActivities(new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME), PackageManager.MATCH_DEFAULT_ONLY).get(0).activityInfo.packageName));

此代码假定原始系统主页活动始终是 queryIntentActivities 返回的第一个结果,而接受的答案返回不属于正在运行的包的第一个主页活动。

目前还不清楚如何干净地获取系统主页活动。一些线程提到 getPackageManager().resolveActivity(intent, flags) 可以用于此,但似乎 PackageManager.MATCH_SYSTEM_ONLY 不能与此方法一起使用。

原文由 zeiky 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题