【问题标题】:Launching default android launcher programmatically以编程方式启动默认的android启动器
【发布时间】:2011-10-06 01:23:48
【问题描述】:

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

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

【问题讨论】:

标签: android launcher


【解决方案1】:
 startActivity( Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME));

【讨论】:

    【解决方案2】:
    => 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()
        }
    

    【讨论】:

      【解决方案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不能用于此方法。

      【讨论】:

      • 系统主页活动可以通过将其签名与任何其他已知系统应用程序进行比较来与其他活动区分开来:两者都将具有相同的 SHA1 哈希。
      【解决方案4】:

      你试过了吗?

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

      (我自己没试过,因为我的用例稍微复杂一点---我已经更换了启动器,我想调用旧的启动器...)

      我还发现您可以使用包管理器查看所有符合某些意图过滤条件的活动。例如,如果您想查找所有标记为 home 默认 home 活动的活动,请使用以下命令:

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

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

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

      【讨论】:

      • 请注意,getLaunchIntentForPackage 方法不会返回启动器意图,因为它只检查 INFO 和 LAUNCH 类别,而 Laucher 具有 HOME 类别的意图。这意味着在 for 中的 if 中的调用将返回一个 null 意图。用下面的代码替换意图初始化对我有用。 intent = new Intent().addCategory(Intent.CATEGORY_HOME).setAction(Intent.ACTION_MAIN) .setClassName(resolveInfo.activityInfo.packageName, resolveInfo.activityInfo.name);
      • 嘿@GarretWilson,你知道如何启动非默认启动器吗?
      • @isaganiesteron,对不起,我好几年没碰过这段代码了。我目前没有任何更新。
      • 要启动股票启动器,添加:`intent.setPackage("com.android.launcher");`
      猜你喜欢
      • 1970-01-01
      • 2019-01-17
      • 2012-04-28
      • 2011-10-13
      • 2014-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-01
      相关资源
      最近更新 更多