UsageStatsUtil

package com.android.demo.lileidemo.utils;

import android.app.usage.UsageEvents;
import android.app.usage.UsageStats;
import android.app.usage.UsageStatsManager;
import android.content.Context;

import com.android.demo.lileidemo.constant.AppConstants;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

/**
* date: 03/25/2020.
* author: lilei.
*/
public class UsageStatsUtil {
private static final String TAG = AppConstants.APP_TAG + "UsageStatsUtil ";
private static volatile UsageStatsUtil mInstance;
private static final boolean DEBUG = false;
private static List<UsageStats> mListUsageStats;
private static UsageStats mUsageStats;

/**
* getUsageStatsList.
*
* @param context context.
* @param beginTime beginTime.
* @param endTime endTime.
* @return Get UsageStats list.
*/
public static synchronized List<UsageStats> getUsageStatsList(Context context, long beginTime,
long endTime) {
UsageStatsManager usageStatsManager = (UsageStatsManager) context.getSystemService(
Context.USAGE_STATS_SERVICE);
List<UsageStats> listUsageStats = usageStatsManager.queryUsageStats(
UsageStatsManager.INTERVAL_BEST, beginTime, endTime);
if (null == mListUsageStats) {
mListUsageStats = new ArrayList<UsageStats>();
}
mListUsageStats.clear();

for (int i = 0; i < listUsageStats.size(); i++) {
mUsageStats = listUsageStats.get(i);
String packageName = mUsageStats.getPackageName();
long totalTimeInForeground = mUsageStats.getTotalTimeInForeground();
long getLastTimeUsed = mUsageStats.getLastTimeUsed();
long getFirstTimeStamp = mUsageStats.getFirstTimeStamp();
int lastEvent = getLastEvent(mUsageStats);
int launchCount = getLaunchCount(mUsageStats);
int recentLaunchCount = getRecentPackageLaunchCount(packageName);
if (DEBUG) {
LogUtil.d(TAG + "* getUsageStatsList i:" + i + " packageName:" + packageName
+ " launchCount:" + launchCount + " recentLaunchCount:" + recentLaunchCount
+ " totalTimeInForeground:" + totalTimeInForeground
+ " lastEvent:" + lastEvent
+ " getFirstTimeStamp:" + getFirstTimeStamp
+ " getLastTimeUsed:" + getLastTimeUsed + " beginTime:" + beginTime);
}
if ((totalTimeInForeground > 0 || UsageEvents.Event.MOVE_TO_FOREGROUND == lastEvent)
&& !inOpenAppStatsIgnorePackages(packageName)
&& (getLastTimeUsed > beginTime || getFirstTimeStamp > beginTime)
&& (launchCount == 0 || launchCount > recentLaunchCount)) {
LogUtil.d(TAG + "* getUsageStatsList add "
+ " packageName:" + packageName + " lastEvent:" + lastEvent
+ " launchCount:" + launchCount + " recentLaunchCount:" + recentLaunchCount
+ " totalTimeInForeground:" + totalTimeInForeground);
mListUsageStats.add(mUsageStats);
}
setRecentPackageLaunchCount(packageName, launchCount);
}
if (DEBUG) {
LogUtil.d(TAG + "getUsageStatsList mListUsageStats.size():"
+ (null == mListUsageStats ? null : mListUsageStats.size()));
}
return mListUsageStats;
}

private static int getRecentPackageLaunchCount(String packageName) {
int launchCount =0;//todo
return launchCount;
}

private static void setRecentPackageLaunchCount(String packageName, int launchCount) {
if (DEBUG) {
LogUtil.d(TAG + "setRecentPackageLaunchCount packageName:" + packageName
+ " launchCount:" + launchCount);
}
//todo
}

/**
* get LaunchCount by reflect.
* hint: this function can only used before android 8.1.
* android 8.1 can not use reflect any more.
*
* @param usageStats usageStats.
* @return
*/
public static int getLaunchCount(UsageStats usageStats) {
int launchCount = 0;
try {
Class c = usageStats.getClass();
Field field = c.getDeclaredField("mLaunchCount");
field.setAccessible(true);
launchCount = field.getInt(usageStats);
} catch (Exception e) {
LogUtil.d(TAG + "getLaunchCount() error:" + e.toString());
e.printStackTrace();
}
return launchCount;
}

/**
* get LastEvent by reflect.
* hint: this function can only used before android 8.1.
* android 8.1 can not use reflect any more.
*
* @param usageStats usageStats.
* @return
*/
private static int getLastEvent(UsageStats usageStats) {
int lastEvent = 0;
try {
Class c = usageStats.getClass();
Field field = c.getDeclaredField("mLastEvent");
field.setAccessible(true);
lastEvent = field.getInt(usageStats);
} catch (Exception e) {
LogUtil.d(TAG + "getLastEvent() error:" + e.toString());
e.printStackTrace();
}
return lastEvent;
}

/**
* To check package whether in OpenAppStatsIgnorePackages.
*
* @param packageName packageName.
* @return boolean.
*/
public static boolean inOpenAppStatsIgnorePackages(String packageName) {
int length = AppConstants.OPEN_APP_STATS_IGNORE_PACKAGES.length;
for (int i = 0; i < length; i++) {
if (AppConstants.OPEN_APP_STATS_IGNORE_PACKAGES[i].equals(packageName)) {
return true;
}
}
return false;
}

/**
* Check whether packageName in UsageStats List.
*
* @param packageName Package name.
* @param listUsageStats List of UsageStats.
* @return boolean.
*/
public static boolean checkInUsageStatsList(String packageName,
List<UsageStats> listUsageStats) {
for (int i = 0; i < listUsageStats.size(); i++) {
UsageStats usageStats = listUsageStats.get(i);
if (packageName.equals(usageStats.getPackageName())) {
return true;
}
}
return false;
}

}
posted @ 2020-06-16 11:07  adam.li  阅读(266)  评论(1编辑  收藏  举报