背景:在做一個App Lock的demo,完全從應用層的層面去實現。
在5.0以下通過ActivityManager類的getRunningTasks()獲取當前打開的所有應用程序 。
在5.0版本之後廢棄了getRunningTasks()方法,意味着我們在5.0以後不能通過該方法獲取正在運行的應用程序,google在5.0又提供類新的api,可以通過ActivityManager的getRunningAppProcesses()方法獲取正在運行的應用程序 。
然後在5.1的版本發佈後getRunningAppProcesses()已經獲取不到正在運行的服務,在5.0版本google提供了一個UsageStatsManager類,通過這個類可以獲取到應用程序的運行情況。
使用方法:
1 添加權限:
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" />
添加了這個權限以後,在設置界面的“有權查看使用情況的應用”中就可以看到我們的這個應用了。
2 引導用戶進入授權界面授權:
我們通過啓動Action爲Settings.ACTION_USAGE_ACCESS_SETTINGS的activity,引導用戶進入“有權查看使用情況的應用”界面,將應用的這個權限打開,否則後面獲取信息時是獲取不到信息的。
3 真正的代碼使用:
1)調用相關代碼獲取棧頂的activity的方法:
usm = ((UsageStatsManager) getSystemService(Context.USAGE_STATS_SERVICE));
long endTime = System.currentTimeMillis();
long startTime = endTime - 10000;
//查詢這段時間內的所有使用事件
UsageEvents usageEvents = usm.queryEvents(startTime, endTime);
UsageEvents.Event event = new UsageEvents.Event();
//遍歷這個事件集合,如果還有下一個事件
while (usageEvents.hasNextEvent()){
//得到下一個事件放入event中,先得得到下個一事件,如果這個時候直接調用,則 event的package是null,type是0。
usageEvents.getNextEvent(event);
Log.d("sjx","package == "+event.getPackageName()+", type == "+event.getEventType());
//如果這是個將應用置於前臺的事件
if(event.getEventType() == UsageEvents.Event.MOVE_TO_FOREGROUND){
//獲取這個前臺事件的packageName.
topPackageName = event.getPackageName();
//Log.d("sjx","topPackageName == " + topPackageName);
}
}
這樣通過之前10s到當前時間的應用使用情況,獲取app置於前臺的時間,拿到該事件的packageName,就獲取了位於棧頂的activity,在AppLock的實現中,是有一個無限循環,每隔300s,調用上面的方法獲取一下位於棧頂的activity,然後通過判斷要不要打開加鎖界面。
2)獲取一段時間內的應用的使用情況:
調用UsageStatsManager的queryUsageStats(int intervalType, long beginTime, long endTime)方法,其中參數:
a) intervalType:時間間隔類型,有五種
INTERVAL_DAILY: 日長短級別數據,最長7天內的數據;
INTERVAL_WEEKLY: 星期長短級別數據,最長4個星期內的數據;
INTERVAL_MONTHLY: 月長短級別數據,最長6個月內的數據;
INTERVAL_YEARLY: 年長短級別數據,最長2年內的數據,也就是說,數據最長保存2年;
INTERVAL_BEST: 根據提供的時間間隔(根據與第二個參數和第三個參數獲取),自動搭配最好的級別
b) beginTime:開始統計的時間
c) endTime:結束的時間
返回值爲:List<UsageStats>。
這樣我們獲得了一段時間內的所有應用的使用情況的數據。
通過UsageStats類提供的方法再得到應用具體的使用數據。