getRunningTasks和getRunningAppProcesses失效

mac2025-11-01  1

Android 5.0以上的getRunningTasks失效,该方法可以获得在前台运行的系统进程。可以用getRunningAppProcesses方法暂时替代。

android6.0以上的getRunningAppProcesses也失效,系统关闭了三方软件对系统进程的访问,出于安全考虑。

参考资料:

http://blog.csdn.NET/hyhyl1990/article/details/45700447 http://www.cnblogs.com/luoyangcn/p/4936830.html 替代方案 AndroidProcesses:Get running processes on Android

AndroidProcess:判断App位于前台或者后台的6种方法

Android 5.1.1 and above - getRunningAppProcesses() returns my application package only

Android5.1.+ getRunningAppProcesses()获取运行中进程(第三方开源库)

可以通过以下两种方式得到topActivity的信息:

1、利用ActivityManager.getRunningAppProcesses();获得当前正在运行的所有应用程序的进程。然后根据当前进程信息里的importance和processState来确定当前在顶部的进程。不过这里得到的进程信息里只有被载入当前进程的所有包名pkgList,所以只能判断当前列表有没有你需要监控的包名。

private String[] getActivePackages(Context context) {

        ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);

        final Set<String> activePackages= new HashSet<String>();

        final List<ActivityManager.RunningAppProcessInfo> processInfos = am.getRunningAppProcesses();

        for(ActivityManager.RunningAppProcessInfo processInfo : processInfos) {

            if (processInfo.importance ==ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND

                    && processInfo.processState == ActivityManager.START_TASK_TO_FRONT){

                activePackages.addAll(Arrays.asList(processInfo.pkgList));

                Log.d(TAG,"====processInfo.processState " + processInfo.processState + processInfo.processName);

            }

        }

        return activePackages.toArray(new String[activePackages.size()]);

    } 2、利用UsageStatsManager,并且调用他的queryUsageStats方法来获得启动的历史记录,调用这个方法需要设置权限“Apps withusage access”。但是这个queryUsageStats只能查询一段时间内的使用状态,如果时间间隔较短,并且一段时间不使用手机,获得的列表就可能为空。

static class RecentUseComparator implements Comparator<UsageStats>

    {

        @Override         public int compare(UsageStats lhs,UsageStats rhs) {

            return (lhs.getLastTimeUsed() > rhs.getLastTimeUsed()) ? -1 : (lhs.getLastTimeUsed()== rhs.getLastTimeUsed()) ? 0 : 1;         }

    }

    private StringgetTopPackage(Context context) {

        long ts = System.currentTimeMillis();

        RecentUseComparator mRecentComp = new RecentUseComparator();

        UsageStatsManager mUsageStatsManager =(UsageStatsManager) context.getSystemService("usagestats");         //查询ts-10000 到ts这段时间内的UsageStats,由于要设定时间限制,所以有可能获取不到         List<UsageStats> usageStats =mUsageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_BEST,ts - 10000, ts);  

        if (usageStats == null) return "";         if (usageStats.size() == 0) return "";         Collections.sort(usageStats,mRecentComp);         Log.d(TAG,"====usageStats.get(0).getPackageName()"+ usageStats.get(0).getPackageName());         return usageStats.get(0).getPackageName();     }

 

//-------------------------------如果只是简单获取该进程是否在前台可以反射那隐藏API-------------

final int PROCESS_STATE_TOP = 2; RunningAppProcessInfo currentInfo = null; Field field = null; try { field = RunningAppProcessInfo.class.getDeclaredField("processState"); } catch (Exception ignored) { } ActivityManager am = (ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE); List<RunningAppProcessInfo> appList = am.getRunningAppProcesses(); for (RunningAppProcessInfo app : appList) { if (app.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND && app.importanceReasonCode == 0 ) { Integer state = null; try { state = field.getInt( app ); } catch (Exception ignored) { } if (state != null && state == PROCESS_STATE_TOP) { currentInfo = app; break; } } } return currentInfo;
最新回复(0)