Как подсчитать время использования приложения, когда приложение находится на переднем плане? ⇐ Android
Как подсчитать время использования приложения, когда приложение находится на переднем плане?
Я работаю над приложением для Android, позволяющим отслеживать ежедневное использование приложения. Идея состоит в том, что пользователь может установить дневной лимит времени для любого приложения, и уведомление появится не позднее, чем через 2 минуты после превышения лимита. (Причина задержки: я создал систему сигнализации с использованием класса AlarmManager, которая будет срабатывать каждую минуту для запуска JobIntentService, который будет проверять, превышен ли лимит для какого-либо приложения. )
Я использовал метод queryEvents класса UsageStatsManager для подсчета времени использования приложения.
Вот мой код для подсчета времени использования приложения (я следил за тем, как использовать queryEvents):
HashMap getTimeSpent (Контекст контекста, String packageName, long BeginTime, long EndTime) { UsageEvents.Event currentEvent; List allEvents = новый ArrayList(); HashMap appUsageMap = new HashMap(); UsageStatsManager useStatsManager = (UsageStatsManager)context.getSystemService(Context.USAGE_STATS_SERVICE); UsageEvents UsageEvents = UsageStatsManager.queryEvents(beginTime, endTime); в то время как (usageEvents.hasNextEvent()) { currentEvent = новый UsageEvents.Event(); useEvents.getNextEvent(currentEvent); if(currentEvent.getPackageName().equals(packageName) || packageName == null) { если (currentEvent.getEventType() == UsageEvents.Event.ACTIVITY_RESUMED || currentEvent.getEventType() == UsageEvents.Event.ACTIVITY_PAUSED) { allEvents.add(currentEvent); Строковый ключ = currentEvent.getPackageName(); если (appUsageMap.get(key) == null) appUsageMap.put(ключ, 0); } } } for (int i = 0; i < allEvents.size() - 1; i++) { UsageEvents.Event E0 = allEvents.get(i); UsageEvents.Event E1 = allEvents.get(i + 1); если (E0.getEventType() == UsageEvents.Event.ACTIVITY_RESUMED && E1.getEventType() == UsageEvents.Event.ACTIVITY_PAUSED && E0.getClassName().equals(E1.getClassName()))) { int diff = (int)(E1.getTimeStamp() - E0.getTimeStamp()); разница /= 1000; Целое число prev = appUsageMap.get(E0.getPackageName()); если (предыдущая == NULL) предыдущая = 0; appUsageMap.put(E0.getPackageName(), prev + diff); } } вернуть приложениеUsageMap; } Короче, приведенный выше код подсчитывает разницу во времени между меткой времени, когда приложение переходит на передний план (UsageEvents.Event.ACTIVITY_RESUMED) и меткой времени, когда оно переходит в фоновый режим (UsageEvents.Event.ACTIVITY_PAUSED) ). Затем эта разница добавляется к общему времени использования приложения.
Проблема в том, что время, проведенное на переднем плане, невозможно подсчитать, если приложение не переходит в фоновый режим. Таким образом, если лимит использования превышен, уведомление не появится, пока приложение не перейдет в фоновый режим.
Можно ли на самом деле получить время на переднем плане, пока приложение находится на переднем плане?
Примечание. Я попробовал queryUsageStats вместе с UsageStats.getTotalTimeInForeground(), но не смог добиться успеха, поскольку у queryUsageStats были другие проблемы, не связанные с этим вопросом.
Я работаю над приложением для Android, позволяющим отслеживать ежедневное использование приложения. Идея состоит в том, что пользователь может установить дневной лимит времени для любого приложения, и уведомление появится не позднее, чем через 2 минуты после превышения лимита. (Причина задержки: я создал систему сигнализации с использованием класса AlarmManager, которая будет срабатывать каждую минуту для запуска JobIntentService, который будет проверять, превышен ли лимит для какого-либо приложения. )
Я использовал метод queryEvents класса UsageStatsManager для подсчета времени использования приложения.
Вот мой код для подсчета времени использования приложения (я следил за тем, как использовать queryEvents):
HashMap getTimeSpent (Контекст контекста, String packageName, long BeginTime, long EndTime) { UsageEvents.Event currentEvent; List allEvents = новый ArrayList(); HashMap appUsageMap = new HashMap(); UsageStatsManager useStatsManager = (UsageStatsManager)context.getSystemService(Context.USAGE_STATS_SERVICE); UsageEvents UsageEvents = UsageStatsManager.queryEvents(beginTime, endTime); в то время как (usageEvents.hasNextEvent()) { currentEvent = новый UsageEvents.Event(); useEvents.getNextEvent(currentEvent); if(currentEvent.getPackageName().equals(packageName) || packageName == null) { если (currentEvent.getEventType() == UsageEvents.Event.ACTIVITY_RESUMED || currentEvent.getEventType() == UsageEvents.Event.ACTIVITY_PAUSED) { allEvents.add(currentEvent); Строковый ключ = currentEvent.getPackageName(); если (appUsageMap.get(key) == null) appUsageMap.put(ключ, 0); } } } for (int i = 0; i < allEvents.size() - 1; i++) { UsageEvents.Event E0 = allEvents.get(i); UsageEvents.Event E1 = allEvents.get(i + 1); если (E0.getEventType() == UsageEvents.Event.ACTIVITY_RESUMED && E1.getEventType() == UsageEvents.Event.ACTIVITY_PAUSED && E0.getClassName().equals(E1.getClassName()))) { int diff = (int)(E1.getTimeStamp() - E0.getTimeStamp()); разница /= 1000; Целое число prev = appUsageMap.get(E0.getPackageName()); если (предыдущая == NULL) предыдущая = 0; appUsageMap.put(E0.getPackageName(), prev + diff); } } вернуть приложениеUsageMap; } Короче, приведенный выше код подсчитывает разницу во времени между меткой времени, когда приложение переходит на передний план (UsageEvents.Event.ACTIVITY_RESUMED) и меткой времени, когда оно переходит в фоновый режим (UsageEvents.Event.ACTIVITY_PAUSED) ). Затем эта разница добавляется к общему времени использования приложения.
Проблема в том, что время, проведенное на переднем плане, невозможно подсчитать, если приложение не переходит в фоновый режим. Таким образом, если лимит использования превышен, уведомление не появится, пока приложение не перейдет в фоновый режим.
Можно ли на самом деле получить время на переднем плане, пока приложение находится на переднем плане?
Примечание. Я попробовал queryUsageStats вместе с UsageStats.getTotalTimeInForeground(), но не смог добиться успеха, поскольку у queryUsageStats были другие проблемы, не связанные с этим вопросом.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение