私は、毎日のアプリの使用状況を追跡するための Android アプリに取り組んでいます。アイデアは、ユーザーが任意のアプリの 1 日の制限時間を設定でき、制限を超えてから最大 2 分以内に通知が表示されるというものです。(遅延の理由:アプリの制限を超えているかどうかをチェックするJobIntentServiceを実行するために毎分オフになるAlarmManagerクラスを使用してアラーム システムを作成しました)
アプリの使用時間をカウントするために、 UsageStatsManagerクラスのqueryEventsメソッドを使用しました。
アプリの使用時間をカウントするための私のコードは次のとおりです(私はHow to use queryEvents に従いました):
HashMap<String, Integer> getTimeSpent(Context context, String packageName, long beginTime, long endTime) {
UsageEvents.Event currentEvent;
List<UsageEvents.Event> allEvents = new ArrayList<>();
HashMap<String, Integer> appUsageMap = new HashMap<>();
UsageStatsManager usageStatsManager = (UsageStatsManager)context.getSystemService(Context.USAGE_STATS_SERVICE);
UsageEvents usageEvents = usageStatsManager.queryEvents(beginTime, endTime);
while (usageEvents.hasNextEvent()) {
currentEvent = new UsageEvents.Event();
usageEvents.getNextEvent(currentEvent);
if(currentEvent.getPackageName().equals(packageName) || packageName == null) {
if (currentEvent.getEventType() == UsageEvents.Event.ACTIVITY_RESUMED
|| currentEvent.getEventType() == UsageEvents.Event.ACTIVITY_PAUSED) {
allEvents.add(currentEvent);
String key = currentEvent.getPackageName();
if (appUsageMap.get(key) == null)
appUsageMap.put(key, 0);
}
}
}
for (int i = 0; i < allEvents.size() - 1; i++) {
UsageEvents.Event E0 = allEvents.get(i);
UsageEvents.Event E1 = allEvents.get(i + 1);
if (E0.getEventType() == UsageEvents.Event.ACTIVITY_RESUMED
&& E1.getEventType() == UsageEvents.Event.ACTIVITY_PAUSED
&& E0.getClassName().equals(E1.getClassName())) {
int diff = (int)(E1.getTimeStamp() - E0.getTimeStamp());
diff /= 1000;
Integer prev = appUsageMap.get(E0.getPackageName());
if(prev == null) prev = 0;
appUsageMap.put(E0.getPackageName(), prev + diff);
}
}
return appUsageMap;
}
つまり、上記のコードは、アプリがフォアグラウンドになったときのタイムスタンプ ( UsageEvents.Event.ACTIVITY_RESUMED ) とバックグラウンドになったときのタイムスタンプ( UsageEvents.Event.ACTIVITY_PAUSED ) の時間差をカウントします。次に、この差をアプリの合計使用時間に加算します。
問題は、アプリがバックグラウンドに移行しない限り、フォアグラウンドで費やされた時間をカウントできないことです。そのため、使用制限を超えた場合、アプリがバックグラウンドになるまで通知は表示されません。
アプリがフォアグラウンドにあるときにフォアグラウンド時間を取得することは実際に可能ですか?
注意: queryUsageStats と UsageStats.getTotalTimeInForeground() を試しましたが、 queryUsageStats にはこの質問に関連しない他の問題があったため、成功しませんでした。