日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

android判断点击次数_Android应用统计-使用时长及次数统计(一)

發(fā)布時間:2025/3/8 Android 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android判断点击次数_Android应用统计-使用时长及次数统计(一) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

關(guān)鍵字: 應(yīng)用統(tǒng)計 Android源碼 應(yīng)用使用時長 應(yīng)用使用次數(shù)

最近在做有關(guān)于應(yīng)用統(tǒng)計有關(guān)的工作,主要是統(tǒng)計系統(tǒng)中客戶端應(yīng)用(非系統(tǒng)自帶的那些基礎(chǔ)應(yīng)用,比如DownLoadManager),在每一天的使用情況,統(tǒng)計內(nèi)容包括:應(yīng)用打開次數(shù),應(yīng)用合計使用時長等。

在所搜尋的方案中,大致有如下兩種:

方案一:自行記錄每次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)會自行記錄應(yīng)用的打開次數(shù)和使用時間,且提供了相關(guān)api于開發(fā)者,但是每一次版本提升都可能會對api帶來相當大的改變,這一塊也不例外。但是始終沒有變化的就是在撥號鍵盤輸入* # * #4636# * #*,進入工程模式,點擊“使用情況統(tǒng)計數(shù)據(jù)”,你就可以看到統(tǒng)計界面了。由于各個版本之間差異比較大,而且相關(guān)的資料也比較少,本次使用的api以及相關(guān)的說明都是以Android-5.1為基礎(chǔ)。在某些版本中,應(yīng)用統(tǒng)計api,存在不少缺陷以及避坑的地方,尤其是手機廠家修改過源碼之后,所以對于某些品牌的測試機器,程序的運行結(jié)果會有一點不一樣,請各位讀者有所注意。

如何獲取系統(tǒng)數(shù)據(jù)

第一步:獲取權(quán)限

在manifest文件中注冊該權(quán)限

在系統(tǒng)setting應(yīng)用中打開相應(yīng)開關(guān),準許demo應(yīng)用獲取數(shù)據(jù)。如果不執(zhí)行這一步的話,demo將無法讀取系統(tǒng)數(shù)據(jù)。

測試機 : 小米4C。

打開目錄 : 設(shè)置 -〉其他高級設(shè)置 -〉安全和隱私 -〉有權(quán)查看使用情況的應(yīng)用。界面如下圖:

第二步:獲取數(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)記錄的各個應(yī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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。