获取正在运行的app方案尝试

RunningTask

Android4.0系列可以,5.0以上机器不行

RunningProcess

5.0可以 之后版本失效 只能返回自身app信息

UsageStatsManager

可以但是又缺陷
1 需要指定时间范围 超过时间范围用不了
2 需要用户授权 跳转到系统设置授权

无障碍功能实现

需要用户手动授权

通过shell命令

1 ps 只能返回自身app的信息
2 读取proc目录下的文件信息 亲测和ps一样只能读取自身的信息
3 dumpsys window | grep mCurrentFocus 被selinux拦截

SELinux : avc: denied { find } for pid=31932 uid=10245 name=window scontext=u:r:untrusted_app_27:s0:c245,c256,c512,c768 tcontext=u:object_r:window_service:s0 tclass=service_manager permissive=0

通过反射

思路 通过目标app的包名拿到对应app的application 然后通过application 反射mActivityThread —亲测可以拿到自身app的信息

曲线救国的方式

获取所有三方应用然后过滤掉不运行的,然后遍历出你想要监听的那个应用
  public void getRunning3rdApp() {
    PackageManager localPackageManager = getPackageManager();
    List localList = localPackageManager.getInstalledPackages(0);
    for (int i = 0; i < localList.size(); i++) {
      PackageInfo localPackageInfo1 = (PackageInfo) localList.get(i);
      String str1 = localPackageInfo1.packageName.split(":")[0];
      if (((ApplicationInfo.FLAG_SYSTEM & localPackageInfo1.applicationInfo.flags) == 0)
              && ((ApplicationInfo.FLAG_UPDATED_SYSTEM_APP & localPackageInfo1.applicationInfo.flags) == 0)
              && ((ApplicationInfo.FLAG_STOPPED & localPackageInfo1.applicationInfo.flags) == 0)) {
            android.util.Log.e("yubang", "packageName =====>:" + str1);
      }
    }
  }

你可能感兴趣的:(android)