UsageStatsManager怎樣使用問題詳解和獲取應用使用信息

轉載自:http://blog.csdn.net/andoop/article/details/50593699

UsageStatsManager就是使用情況統計管理者,通過它可以獲取應用的使用情況。
它是Android 5.0 纔有的API。

使用它之前需要在清單文件中配置 “android.permission.PACKAGE_USAGE_STATS”的權限
用戶必須在 設置–安全–有權查看使用情況的應用 中勾選相應的應用
對應設備 Android 5.0 及其以上。
魅族和小米手機不能通過UsageStatsManager獲取應用使用情況
系統會統計應用的使用情況並保存起來,然後按照這些保存起來的信息的時間長短進行劃分。

劃分級別有4個:
1.日長短級別數據:Daily data
最長7天內的數據
2.星期長短級別數據:Weekly data
最長4個星期內的數據
3.月長短級別數據: Monthly data
最長6個月內的數據
4.年長短級別數據: Yearly data
最長2年內的數據,也就是說,數據最長保存2年
對於每一個應用來說,系統會記錄以下信息:

應用最後一次被用的時間
對應存儲的4個級別,應用在前臺的總共時間
時間戳:一個組件一天之內改變狀態的時刻(從前臺到後臺,或從後臺到前臺),這個組件可以通過包名或activity的名字來唯一標示。
時間戳:設備配置信息改變的時刻,如:橫豎屏切換。
android5.0以後通過UsageStatsManager獲取前臺應用進程

5.0之前:
<pre name="code" class="java">public String getForegroundApp(Context context) {  
            ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);  
            List<RunningAppProcesInfo> lr = am.getRunningAppProcesses();  
            if (lr == null) {  
                  return null;  
            }  
            for (RunningAppProcessInfo ra : lr) {  
                if (ra.importance == RunningAppProcessInfo.IMPORTANCE_VISIBLE  
                     || ra.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {  
                            return ra.processName;  
               }  
            }  
  
            return null;  
        }  




5.0之後(魅族除外)
@SuppressLint("NewApi") 
    private String getForegroundApp() {
        Calendar calendar=Calendar.getInstance();
        calendar.setTime(new Date());
        long endt = calendar.getTimeInMillis();//結束時間
        calendar.add(Calendar.DAY_OF_MONTH, -1);//時間間隔爲一個月
        long statt = calendar.getTimeInMillis();//開始時間
        UsageStatsManager usageStatsManager=(UsageStatsManager) getSystemService(USAGE_STATS_SERVICE);
        //獲取一個月內的信息
        List<UsageStats> queryUsageStats = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_MONTHLY,statt,endt);

        if (queryUsageStats == null || queryUsageStats.isEmpty()) {
                return null;
        }

        UsageStats recentStats = null;
        for (UsageStats usageStats : queryUsageStats) {

                if(recentStats == null || recentStats.getLastTimeUsed() < usageStats.getLastTimeUsed()){
                        recentStats = usageStats;
                }
        }

        return recentStats.getPackageName();
     }



UsageStatsManager 的方法 queryUsageStats用法
queryUsageStats的三個參數說明:
intervalType 時間間隔的類型,5種,對應上面的4個,還有一個,後面再說
beginTime 開始的時間
endTime 結束的時間

正如上面的代碼,我們可以通過queryUsageStats這個方法獲取指定時間段內的應用使用情況信息
long endt = calendar.getTimeInMillis();//結束時間
            calendar.add(Calendar.DAY_OF_MONTH, -1);//時間間隔爲一個月
            long statt = calendar.getTimeInMillis();//開始時間
            UsageStatsManager usageStatsManager=(UsageStatsManager) getSystemService(USAGE_STATS_SERVICE);
            //獲取一個月內的信息
            List<UsageStats> queryUsageStats = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_MONTHLY,statt,endt);



但是在指定時間段的時候要注意了:有可能獲取的數據爲空。

很多人喜歡這樣用:
long st = System.currentTimeMillis();
List<UsageStats> queryUsageStats = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_BEST,st-2*1000,st);

這種情況下,很容易獲取到空的數據,如果在執行這段代碼之前,有一個時間間隔:2*1000(這裏就是2秒了),在這個間隔內系統沒有記錄應用使用情況的信息(應用什麼時候記錄應用使用情況信息請看上面內容),這樣就導致系統數據庫中沒有對應這個時間段的數據,所以就爲空了。
關於第一個參數:intervalType 是時間間隔的類型:

INTERVAL_DAILY 天存儲級別的數據
INTERVAL_WEEKLY 星期存儲級別的數據
INTERVAL_MONTHLY 月存儲級別的數據
INTERVAL_YEARLY 年存儲級別的數據
INTERVAL_BEST 根據提供的時間間隔(根據與第二個參數和第三個參數獲取),自動搭配最好的級別
如代碼:


Calendar calendar=Calendar.getInstance();
calendar.setTime(new Date());
long endt = calendar.getTimeInMillis();//結束時間
calendar.add(Calendar.DAY_OF_MONTH, -1);//時間間隔爲一個月
long statt = calendar.getTimeInMillis();//開始時間
UsageStatsManager usageStatsManager=(UsageStatsManager) getSystemService(USAGE_STATS_SERVICE);
//獲取一個月內的信息
List<UsageStats> queryUsageStats = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_MONTHLY,statt,endt);

時間最好不要太短,以防獲取不到數據
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章