android判断点击次数_Android应用统计-使用时长及次数统计(一)
關(guān)鍵字: 應用統(tǒng)計 Android源碼 應用使用時長 應用使用次數(shù)
最近在做有關(guān)于應用統(tǒng)計有關(guān)的工作,主要是統(tǒng)計系統(tǒng)中客戶端應用(非系統(tǒng)自帶的那些基礎應用,比如DownLoadManager),在每一天的使用情況,統(tǒng)計內(nèi)容包括:應用打開次數(shù),應用合計使用時長等。
在所搜尋的方案中,大致有如下兩種:
方案一:自行記錄每次activity的打開和關(guān)閉,根據(jù)這些數(shù)據(jù)進行統(tǒng)計。
方案二:使用系統(tǒng)自行記錄的每次activity的打開和關(guān)閉數(shù)據(jù),進行統(tǒng)計。
以下方案采用兩個方案并行,主要是以系統(tǒng)數(shù)據(jù)統(tǒng)計結(jié)果為主,以自行記錄的數(shù)據(jù)作為參照,用以對比兩組數(shù)據(jù),以保證數(shù)據(jù)統(tǒng)計結(jié)果的有效性和穩(wěn)定性。
系統(tǒng)數(shù)據(jù)
在Android中,系統(tǒng)會自行記錄應用的打開次數(shù)和使用時間,且提供了相關(guān)api于開發(fā)者,但是每一次版本提升都可能會對api帶來相當大的改變,這一塊也不例外。但是始終沒有變化的就是在撥號鍵盤輸入* # * #4636# * #*,進入工程模式,點擊“使用情況統(tǒng)計數(shù)據(jù)”,你就可以看到統(tǒng)計界面了。由于各個版本之間差異比較大,而且相關(guān)的資料也比較少,本次使用的api以及相關(guān)的說明都是以Android-5.1為基礎。在某些版本中,應用統(tǒng)計api,存在不少缺陷以及避坑的地方,尤其是手機廠家修改過源碼之后,所以對于某些品牌的測試機器,程序的運行結(jié)果會有一點不一樣,請各位讀者有所注意。
如何獲取系統(tǒng)數(shù)據(jù)
第一步:獲取權(quán)限
在manifest文件中注冊該權(quán)限
在系統(tǒng)setting應用中打開相應開關(guān),準許demo應用獲取數(shù)據(jù)。如果不執(zhí)行這一步的話,demo將無法讀取系統(tǒng)數(shù)據(jù)。
測試機 : 小米4C。
打開目錄 : 設置 -〉其他高級設置 -〉安全和隱私 -〉有權(quán)查看使用情況的應用。界面如下圖:
第二步:獲取數(shù)據(jù)
獲取系統(tǒng)統(tǒng)計信息:
@SuppressWarnings("ResourceType")
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public static ArrayList getUsageList(Context context, long startTime, long endTime) {
Log.i(TAG," EventUtils-getUsageList() Range start:" + startTime);
Log.i(TAG," EventUtils-getUsageList() Range end:" + endTime);
Log.i(TAG," EventUtils-getUsageList() Range start:" + dateFormat.format(startTime));
Log.i(TAG," EventUtils-getUsageList() Range end:" + dateFormat.format(endTime));
ArrayList list = new ArrayList<>();
UsageStatsManager mUsmManager = (UsageStatsManager) context.getSystemService("usagestats");
Map map = mUsmManager.queryAndAggregateUsageStats(startTime, endTime);
for (Map.Entry entry : map.entrySet()) {
UsageStats stats = entry.getValue();
if(stats.getTotalTimeInForeground() > 0){
list.add(stats);
Log.i(TAG," EventUtils-getUsageList() stats:" + stats.getPackageName() + " TotalTimeInForeground = " + stats.getTotalTimeInForeground());
}
}
return list;
}
獲取系統(tǒng)記錄的詳細的各個activity的使用情況:
@SuppressWarnings("ResourceType")
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public static ArrayList getEventList(Context context, long startTime, long endTime){
ArrayList mEventList = new ArrayList<>();
Log.i(TAG," EventUtils-getEventList() Range start:" + startTime);
Log.i(TAG," EventUtils-getEventList() Range end:" +endTime);
Log.i(TAG," EventUtils-getEventList() Range start:" + dateFormat.format(startTime));
Log.i(TAG," EventUtils-getEventList() Range end:" + dateFormat.format(endTime));
UsageStatsManager mUsmManager = (UsageStatsManager) context.getSystemService("usagestats");
UsageEvents events = mUsmManager.queryEvents(startTime, endTime);
while (events.hasNextEvent()) {
UsageEvents.Event e = new UsageEvents.Event();
events.getNextEvent(e);
if (e != null && (e.getEventType() == 1 || e.getEventType() == 2)) {
Log.i(TAG," EventUtils-getEventList() "+e.getTimeStamp()+" event:" + e.getClassName() + " type = " + e.getEventType());
mEventList.add(e);
}
}
return mEventList;
}
獲取系統(tǒng)記錄的各個應用的使用次數(shù):
由于該字段不能通過api拿到,故而采取反射的形式,拿到該字段。(注:其實該字段的統(tǒng)計數(shù)據(jù)并不可靠,一旦強行關(guān)機,比如拔電池,就可能失去數(shù)據(jù),所以在系統(tǒng)代碼中該字段是被隱藏的。當然關(guān)于數(shù)據(jù)的可靠性,在接下來的文章中會有更詳細的說明)
private int getLaunchCount(UsageStats usageStats) throws IllegalAccessException {
Field field = null;
try {
field = usageStats.getClass().getDeclaredField("mLaunchCount");
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
return (int) field.get(usageStats);
}
結(jié)語:
本文主要介紹了關(guān)于Android系統(tǒng)中統(tǒng)計各個app的使用情況的解決方案,以及獲取相關(guān)數(shù)據(jù)的方法。關(guān)于系統(tǒng)記錄的數(shù)據(jù)的原理以及在該原理的邏輯下可能出現(xiàn)的bug,將會在接下來的文章中詳細闡述。
轉(zhuǎn)載請注明出處。
總結(jié)
以上是生活随笔為你收集整理的android判断点击次数_Android应用统计-使用时长及次数统计(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python替代hadoop_Pytho
- 下一篇: 联想e431怎么光盘启动 联想e431如