我正在寻找一种以编程方式启动默认 android 启动器的方法,可能类似于下面的代码。还是我必须在清单文件中添加一些东西?谢谢!
Intent intent = new Intent();
intent.setClassName("com.android.launcher", "Launcher");
startActivity(intent);
你试过这个吗?
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 的回答,这里有一个丑陋的单线,假设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
不能与此方法一起使用。
=> 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()
}
startActivity( Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME));