【问题标题】:How to check if my application is the default launcher [duplicate]如何检查我的应用程序是否是默认启动器 [重复]
【发布时间】:2012-01-08 02:58:06
【问题描述】:

我正在开发一个商业应用程序,它本质上是一个主屏幕,应该用作默认主屏幕(作为“信息亭”应用程序)。

有什么方法可以检查我的启动器是否是默认启动器? 谢谢!

附言。 类似的例子,但用于检查 GPS 设置

LocationManager alm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
if (alm.isProviderEnabled(android.location.LocationManager.GPS_PROVIDER)) {
    Stuffs&Actions;
}

【问题讨论】:

    标签: android launcher homescreen


    【解决方案1】:

    Kotlin 版本:

    val Context.isMyLauncherDefault: Boolean
      get() = ArrayList<ComponentName>().apply {
        packageManager.getPreferredActivities(
          arrayListOf(IntentFilter(ACTION_MAIN).apply { addCategory(CATEGORY_HOME) }),
          this,
          packageName
        )
      }.isNotEmpty()
    

    【讨论】:

      【解决方案2】:
      boolean isHomeApp() {
          final Intent intent = new Intent(Intent.ACTION_MAIN);
          intent.addCategory(Intent.CATEGORY_HOME);
          final ResolveInfo res = getPackageManager().resolveActivity(intent, 0);
          if (res.activityInfo != null && getPackageName()
                  .equals(res.activityInfo.packageName)) {
              return true;
          }
          return false;
      }
      

      【讨论】:

        【解决方案3】:

        您可以从PackageManager 获取首选活动列表。使用getPreferredActivities() 方法。

        boolean isMyLauncherDefault() {
            final IntentFilter filter = new IntentFilter(Intent.ACTION_MAIN);
            filter.addCategory(Intent.CATEGORY_HOME);
        
            List<IntentFilter> filters = new ArrayList<IntentFilter>();
            filters.add(filter);
        
            final String myPackageName = getPackageName();
            List<ComponentName> activities = new ArrayList<ComponentName>();
            final PackageManager packageManager = (PackageManager) getPackageManager();
        
            // You can use name of your package here as third argument
            packageManager.getPreferredActivities(filters, activities, null);
        
            for (ComponentName activity : activities) {
                if (myPackageName.equals(activity.getPackageName())) {
                    return true;
                }
            }
            return false;
        }
        

        【讨论】:

        • 工作正常。我使用包名作为第三个参数,然后检查activities 列表的长度。如果为 0,则表示不是启动器。
        • 在哪些情况下“活动”会在此查询中填写多个项目?
        • getPreferredActivities 的文档建议第一个参数应该是由方法填充的空列表。当您给出一个已经填充的列表时,具体的行为是什么?
        • 我检查了安卓source code。像您在示例中所做的那样添加过滤器没有任何效果。我相信检查默认活动的更好方法是使用resolveActivitythis answer 中的类似问题。
        • 如何为所有具有它们的意图找到所有首选活动?您需要检查所有应用,为应用清单上的每个 Intent 准备一个过滤器,然后使用此方法?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-07
        • 1970-01-01
        • 1970-01-01
        • 2012-01-15
        • 2014-11-01
        • 1970-01-01
        相关资源
        最近更新 更多