getRunningTasks和getRunningAppProcesses失效

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;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章