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

16

我正在寻找一种以编程方式启动默认的Android Launcher的方法,类似于下面的代码。或者我需要在清单文件中添加一些内容吗?谢谢!

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

1
http://stackoverflow.com/questions/5547606/how-to-integrate-default-app-of-android-in-our-app-programatically - Nikunj Patel
5个回答

23

你试过这个吗?

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;
    }
}
请注意,我已经替换了我的设备上的默认主屏幕 - 这就是为什么我必须确保我找到的 Activity 不是正在运行的 Activity!如果您没有更换默认主屏幕,则不需要进行此检查-只需使用第一个(可能是唯一的)默认主屏幕 Activity。
(请注意,我仍然无法从我的启动器中启动旧的启动器,也许是因为旧的启动器保留了默认启动器的记录,即我的新启动器,并简单地回调它。我不知道。但至少它不会崩溃,如果您没有替换旧主屏幕,它可能会正常工作。)

5
请注意,getLaunchIntentForPackage方法不会返回启动器的意图,因为它只检查INFO和LAUNCH类别,而启动器在意图中有HOME类别。这意味着if语句中的调用将返回一个空意图。使用下面的代码替换意图初始化对我有帮助。intent = new Intent().addCategory(Intent.CATEGORY_HOME).setAction(Intent.ACTION_MAIN) .setClassName(resolveInfo.activityInfo.packageName, resolveInfo.activityInfo.name); - r1k0
1
嘿,@GarretWilson,你解决如何启动非默认启动器的问题了吗? - isaganiesteron
1
@isaganiesteron,抱歉,我已经好几年没有碰过这段代码了。目前我没有任何更新。 - Garret Wilson
1
要启动股票启动器,请添加以下内容:intent.setPackage("com.android.launcher"); - Greg Ennis

4

在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这种方法。


1
系统主页活动可以通过将其签名与任何其他已知的系统应用程序进行比较来区分它与其他应用程序:两者将具有相同的SHA1哈希值。 - AlxDroidDev

1
 startActivity( Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME));

1
=> 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()
    }

0

这段代码可以打开应用程序启动器,

   
Intent intentf = new Intent(Intent.ACTION_ALL_APPS);
intentf.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intentf);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接