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