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

时间:2011-07-15 10:45:10

标签: android launcher

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

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

3 个答案:

答案 0 :(得分:21)

你试过这个吗?

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;
    }
}

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

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

答案 1 :(得分:3)

根据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不能用于此方法。

答案 2 :(得分:0)

=> In kotlin add below code in onDestroy method of appCompactActvity use to make your app as default launcher, 

override fun onDestroy() {
        var intent = Intent(Intent.ACTION_MAIN)
        var packageManager: PackageManager = packageManager
        for (resolveInfo in packageManager.queryIntentActivities(Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME), PackageManager.MATCH_DEFAULT_ONLY)) {
            if (packageName != resolveInfo.activityInfo.packageName)  //if this activity is not in our activity (in other words, it's another default home screen)
            {
                startActivity(intent)
            }
            break
        }
        super.onDestroy()
    }