怎样统计Android手机各个应用的使用时间以及使用次数

思路是这样:
1.新建一个service,里面开启一个TimeTask去计数,可以每半分钟,或者没一秒钟去确认当前运行的app
2.对于api level大于等于24的机器,用如下方法获取当前运行app:
public static String getTopApp(Context context) {
if (Build.VERSION.SDK_INT \u0026gt;= Build.VERSION_CODES.N) {
UsageStatsManager m = (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE);
if (m != null) {
long now = System.currentTimeMillis();
//获取60秒之内的应用数据
List\u0026lt;UsageStats\u0026gt; stats = m.queryUsageStats(UsageStatsManager.INTERVAL_BEST, now - 60 * 1000, now);
【怎样统计Android手机各个应用的使用时间以及使用次数】 // Log.i(TAG, "Running app number in last 60 seconds : " + stats.size());
String topActivity = "";
//取得最近运行的一个app,即当前运行的app
if ((stats != null) \u0026amp;\u0026amp; (!stats.isEmpty())) {
int j = 0;
for (int i = 0; i \u0026lt; stats.size(); i++) {
if (stats.get(i).getLastTimeUsed() \u0026gt; stats.get(j).getLastTimeUsed()) {
j = i;
}
}
topActivity = stats.get(j).getPackageName();
return topActivity;
}
// Log.i(TAG, "top running app is : "+topActivity);
}
}
return null;
}

对于api level大于21小于等于23的机器,使用以下方法:
/** first app user */
public static final int AID_APP = 10000;
/** offset for uid ranges for each user */
public static final int AID_USER = 100000;
public static String getForegroundApp() {
// LogManager.LogEWithTag(TAG,"getForegroundApp******");
File files = new File("/proc").listFiles();
int lowestOomScore = Integer.MAX_VALUE;
String foregroundProcess = null;
// LogManager.LogEWithTag("DDDDD","files size = "+ files.length);
for (File file : files) {
// LogManager.LogEWithTag("DDDDD","files name = "+ file.getName());
if (!file.isDirectory()) {
continue;
}
int pid;
try {
pid = Integer.parseInt(file.getName());
} catch (NumberFormatException e) {
continue;
}
//LogManager.LogEWithTag("DDDDD","pid = "+ pid);
try {
String cgroup = read(String.format("/proc/%d/cgroup", pid));
String lines = cgroup.split("\");
String cpuSubsystem;
String cpuaccctSubsystem;
// LogManager.LogEWithTag("DDDDD","cgroup = "+ cgroup+" lines.length = "+lines.length);


推荐阅读