【问题标题】:Which is the Correct way to user ActivityManager to get top Activity in Android?哪个是用户 ActivityManager 在 Android 中获取顶级 Activity 的正确方法?
【发布时间】:2015-10-07 19:40:46
【问题描述】:

我的自定义启动器使用以下代码来识别最热门的活动,并与一些允许运行的应用进行比较。

private void restoreApp() {
    ctx = this;
    am = (ActivityManager) getBaseContext().getSystemService(Context.ACTIVITY_SERVICE);

    if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT_WATCH) {
      activePackages = getActivePackages();
    } else {
      activePackages = getActivePackagesCompat();
    }
    Log.i(TAG, "restoreApp() -> ");
    Boolean testPackage  = false;
    if (activePackages != null) {
      for (String activePackage : activePackages) {
        Log.i(TAG, "testing  -> "+activePackage);
        if(!activePackage.contains("com.estapar.mobile.launcher")){
          if (allowedApps.testApp(activePackage)) {
            restoreAppExec(activePackage);
            testPackage = true;
            Log.i(TAG, "restoring  -> "+activePackage);
          }
        }
      }
      if(!testPackage){
        restoreAppExec("launcher");
      }
    }
    else{
      Log.i(TAG, "activePackages eh nulo");
    }
  }

  String[] getActivePackagesCompat() {
    final List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1);
    final ComponentName componentName = taskInfo.get(0).topActivity;
    final String[] activePackages = new String[1];
    activePackages[0] = componentName.getPackageName();
    return activePackages;
  }

  String[] getActivePackages() {
    final Set<String> activePackages = new HashSet<String>();
    final List<ActivityManager.RunningAppProcessInfo> processInfos = am.getRunningAppProcesses();

    String mpackageName = am.getRunningTasks(1).get(0).topActivity.getPackageName();
    String mPackageName2 = am.getRunningAppProcesses().get(0).processName;

    Log.i("asd",mpackageName);
    Log.i("asd",mPackageName2);
    for (ActivityManager.RunningAppProcessInfo processInfo : processInfos) {
      if (processInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
        activePackages.addAll(Arrays.asList(processInfo.pkgList));
      }
    }
    return activePackages.toArray(new String[activePackages.size()]);
  }

但在 Android 版本 5.1.1 中它停止工作 =(,总是返回启动器包。

有人知道在这个android版本中使用这种方法的正确方法吗?

谢谢。

【问题讨论】:

    标签: android android-activity android-service android-launcher


    【解决方案1】:

    这已经不可能了,根据 android 文档

    此方法在 API 级别 21 中已弃用。从 LOLLIPOP 开始,此方法不再可用于第三方应用程序:引入以文档为中心的最新消息意味着它可能会将个人信息泄露给调用者。为了向后兼容,它仍然会返回一小部分数据:至少是调用者自己的任务,可能还有其他一些已知不敏感的任务,例如 home。

    【讨论】:

    • 感谢@FrankMonza 的回答,您知道如何解决吗?
    • 遗憾的是没有解决方法,您可以尝试从 shell 解析 PS 输出,但它可能不会带您到任何地方
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-26
    • 1970-01-01
    • 2019-07-20
    • 1970-01-01
    • 2016-06-16
    相关资源
    最近更新 更多