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

dos*_*osa 15 android launcher

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

Intent intent = new Intent();
intent.setClassName("com.android.launcher", "Launcher");
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)

Gar*_*son 21

你试过这个吗?

startActivity(new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_LAUNCHER));
Run Code Online (Sandbox Code Playgroud)

(我自己没试过,因为我的用例有点复杂了 - 我已经更换了发射器,我想打电话给发射器...)

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

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 请注意,getLaunchIntentForPackage方法不会返回启动器意图,因为它只检查INFO和LAUNCH类别,而Laucher在intent中具有HOME类别.这意味着for中的if中的调用将返回null intent.用下面的代码替换意图初始化对我来说是个窍门.intent = new Intent().addCategory(Intent.CATEGORY_HOME).setAction(Intent.ACTION_MAIN).setClassName(resolveInfo.activityInfo.packageName,resolveInfo.activityInfo.name); (4认同)