用户ActivityManager在Android中获得顶级活动的正确方法是什么?

用户ActivityManager在Android中获得顶级活动的正确方法是什么?,android,android-activity,android-service,android-launcher,Android,Android Activity,Android Service,Android Launcher,我的自定义启动器使用以下代码来识别顶级活动,并与一些允许运行的应用程序进行比较 private void restoreApp() { ctx = this; am = (ActivityManager) getBaseContext().getSystemService(Context.ACTIVITY_SERVICE); if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT_WATCH) {

我的自定义启动器使用以下代码来识别顶级活动,并与一些允许运行的应用程序进行比较

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()]);
  }
private void restoreApp(){
ctx=这个;
am=(ActivityManager)getBaseContext().getSystemService(Context.ACTIVITY_服务);
if(Build.VERSION.SDK\u INT>Build.VERSION\u code.KITKAT\u WATCH){
activePackages=getActivePackages();
}否则{
activePackages=getActivePackagesCompat();
}
Log.i(标记“restoreApp()->”);
布尔testPackage=false;
if(activePackages!=null){
for(字符串activePackage:activePackages){
Log.i(标签“testing->”+activePackage);
如果(!activePackage.contains(“com.estapar.mobile.launcher”)){
if(allowedApps.testApp(activePackage)){
restoreAppExec(activePackage);
testPackage=true;
Log.i(标记“restoring->”+activePackage);
}
}
}
if(!testPackage){
恢复PEXEC(“发射器”);
}
}
否则{
Log.i(标签“activepackagesh nulo”);
}
}
字符串[]GetActivePackageCompat(){
最终列表taskInfo=am.getRunningTasks(1);
final ComponentName ComponentName=taskInfo.get(0).topActivity;
最终字符串[]activePackages=新字符串[1];
activePackages[0]=componentName.getPackageName();
返回活动包;
}
字符串[]getActivePackages(){
final Set activePackages=new HashSet();
最终列表processInfos=am.getRunningAppProcesses();
字符串mpackageName=am.getRunningTasks(1.get(0.topActivity.getPackageName();
字符串mPackageName2=am.getRunningAppProcesses().get(0.processName);
Log.i(“asd”,mpackageName);
Log.i(“asd”,mPackageName2);
对于(ActivityManager.RunningAppProcessInfo processInfo:processInfos){
if(processInfo.importance==ActivityManager.RunningAppProcessInfo.importance\u前台){
addAll(Arrays.asList(processInfo.pkgList));
}
}
返回activePackages.toArray(新字符串[activePackages.size()]);
}
但是在Android版本5.1.1中,它停止工作=(,总是返回启动程序包

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


谢谢。

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

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


谢谢你的回答@FrankMonza,你知道如何解决吗?没有解决办法。很遗憾,你可以尝试解析shell的PS输出,但它可能不会带你去任何地方