获取当前活动进程数量最近活跃应用数量等信息
前言
昨天学习了ams的基础概念,做了一个可以获取当前活动数量的demo
准备
我是安卓15的系统,因为安卓15有严格的限制,比如从activityManager中的getRunningTasks(); 不能正常的返回数据,所以先要给app打上系统签名。
至于怎么搞系统签名可以看https://blog.csdn.net/wenzhi20102321/article/details/134898404?ops_request_misc=%257B%2522request%255Fid%2522%253A%252295fe6873cc6b77993c2ff150a9278229%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=95fe6873cc6b77993c2ff150a9278229&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2blogfirst_rank_ecpm_v1~rank_v31_ecpm-1-134898404-null-null.nonecase&utm_term=%E7%B3%BB%E7%BB%9F%E7%AD%BE%E5%90%8D&spm=1018.2226.3001.4450
这篇博客,要注意在源码中生成系统签名
代码
1.在Manifest.xml文件声明下权限
<uses-permission android:name="android.permission.GET_TASKS" /><uses-permission android:name="android.permission.REAL_GET_TASKS" /><uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" /><uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" /><!-- 系统级权限 --><uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" /><uses-permission android:name="android.permission.MANAGE_ACTIVITY_STACKS" />
2.布局就是一个按钮和一个textview
3.MainActivity
package com.example.myapplication;
import android.app.ActivityManager;
import android.app.usage.UsageStats;
import android.app.usage.UsageStatsManager;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import java.util.List;
import java.util.Map;
import java.util.Calendar;
public class MainActivity extends AppCompatActivity {
private Button btnGetCount;
private TextView tvActivityCount;
private ActivityManager activityManager;
private UsageStatsManager usageStatsManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 初始化控件
btnGetCount = findViewById(R.id.btn_get_count);
tvActivityCount = findViewById(R.id.tv_activity_count);
// 获取系统服务
activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
usageStatsManager = (UsageStatsManager) getSystemService(Context.USAGE_STATS_SERVICE);
// 设置按钮点击事件
btnGetCount.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getActivityCount();
}
});
}
private void getActivityCount() {
StringBuilder result = new StringBuilder();
try {
// 方法1: 获取运行中的进程数
int processCount = getRunningProcessCount();
result.append("运行中的进程数: ").append(processCount).append("\n");
// 方法2: 尝试获取运行中的任务数(系统权限)
int taskCount = getRunningTaskCount();
if (taskCount >= 0) {
result.append("运行中的任务数: ").append(taskCount).append("\n");
} else {
result.append("任务信息: 权限不足\n");
}
// 方法3: 使用 UsageStatsManager 获取活跃应用
int activeAppCount = getActiveAppCount();
result.append("活跃应用数: ").append(activeAppCount).append("\n");
// 方法3.1: 使用标准的 queryUsageStats 方法
int dailyActiveApps = getDailyActiveAppCount();
result.append("今日活跃应用数: ").append(dailyActiveApps).append("\n");
// 方法4: 获取最近运行的应用数
int recentAppCount = getRecentAppCount();
result.append("最近运行应用数: ").append(recentAppCount).append("\n");
// 方法5: 系统级方法 - 获取所有运行中的服务
int serviceCount = getRunningServiceCount();
result.append("运行中的服务数: ").append(serviceCount);
tvActivityCount.setText(result.toString());
} catch (Exception e) {
tvActivityCount.setText("获取失败: " + e.getMessage());
}
}
private int getRunningProcessCount() {
try {
List<ActivityManager.RunningAppProcessInfo> runningProcesses =
activityManager.getRunningAppProcesses();
return runningProcesses != null ? runningProcesses.size() : 0;
} catch (Exception e) {
return -1;
}
}
private int getRunningTaskCount() {
try {
// 系统应用可能可以获取更多信息
List<ActivityManager.RunningTaskInfo> runningTasks =
activityManager.getRunningTasks(Integer.MAX_VALUE);
return runningTasks != null ? runningTasks.size() : 0;
} catch (SecurityException e) {
return -1;
}
}
private int getActiveAppCount() {
try {
// 获取今天的使用统计
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
long startTime = calendar.getTimeInMillis();
long endTime = System.currentTimeMillis();
// 修正方法调用 - queryAndAggregateUsageStats 只需要两个参数
Map<String, UsageStats> usageStatsMap = usageStatsManager.queryAndAggregateUsageStats(
startTime, endTime);
int activeCount = 0;
for (UsageStats usageStats : usageStatsMap.values()) {
if (usageStats.getLastTimeUsed() > (System.currentTimeMillis() - 3600000)) { // 1小时内
activeCount++;
}
}
return activeCount;
} catch (Exception e) {
return -1;
}
}
private int getDailyActiveAppCount() {
try {
// 使用标准的 queryUsageStats 方法
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
long startTime = calendar.getTimeInMillis();
long endTime = System.currentTimeMillis();
List<UsageStats> usageStatsList = usageStatsManager.queryUsageStats(
UsageStatsManager.INTERVAL_DAILY, startTime, endTime);
int activeCount = 0;
if (usageStatsList != null) {
for (UsageStats usageStats : usageStatsList) {
// 检查应用是否在今天有使用记录
if (usageStats.getTotalTimeInForeground() > 0) {
activeCount++;
}
}
}
return activeCount;
} catch (Exception e) {
return -1;
}
}
private int getRecentAppCount() {
try {
// 获取最近的任务信息(需要系统权限)
List<ActivityManager.RecentTaskInfo> recentTasks =
activityManager.getRecentTasks(100, ActivityManager.RECENT_WITH_EXCLUDED);
return recentTasks != null ? recentTasks.size() : 0;
} catch (SecurityException e) {
return -1;
}
}
private int getRunningServiceCount() {
try {
List<ActivityManager.RunningServiceInfo> runningServices =
activityManager.getRunningServices(Integer.MAX_VALUE);
return runningServices != null ? runningServices.size() : 0;
} catch (Exception e) {
return -1;
}
}
// 系统级方法:获取所有安装的应用中正在运行的
private int getRunningApplicationCount() {
try {
PackageManager pm = getPackageManager();
List<ApplicationInfo> installedApps = pm.getInstalledApplications(0);
int runningCount = 0;
for (ApplicationInfo app : installedApps) {
if (isAppRunning(app.packageName)) {
runningCount++;
}
}
return runningCount;
} catch (Exception e) {
return -1;
}
}
private boolean isAppRunning(String packageName) {
List<ActivityManager.RunningAppProcessInfo> runningProcesses =
activityManager.getRunningAppProcesses();
if (runningProcesses != null) {
for (ActivityManager.RunningAppProcessInfo processInfo : runningProcesses) {
if (processInfo.processName.equals(packageName)) {
return true;
}
}
}
return false;
}
}
getRunningProcessCount()
- 作用:获取当前运行中的进程数量
- 原理:使用
ActivityManager.getRunningAppProcesses()获取所有运行中的应用进程 - 权限:无需特殊权限
- 返回:正在运行的进程数量
getRunningTaskCount()
- 作用:获取运行中的任务数量
- 原理:使用
ActivityManager.getRunningTasks()获取任务信息 - 权限:需要系统级权限,普通应用通常会失败
- 返回:任务数量,如果权限不足返回-1
getActiveAppCount()
- 作用:获取活跃应用数量(1小时内使用过的应用)
- 原理
- 使用
UsageStatsManager.queryAndAggregateUsageStats()获取今日使用统计 - 过滤出最近1小时内使用过的应用
- 使用
- 权限:需要"使用情况访问"权限
- 返回:1小时内活跃的应用数量
getDailyActiveAppCount()
- 作用:获取今日活跃应用数量
- 原理
- 使用
UsageStatsManager.queryUsageStats()获取今日使用统计 - 统计前台使用时间大于0的应用
- 使用
- 权限:需要"使用情况访问"权限
- 返回:今日使用过的应用数量
getRecentAppCount()
- 作用:获取最近运行的应用数量
- 原理:使用
ActivityManager.getRecentTasks()获取最近任务列表 - 权限:需要系统级权限
- 返回:最近任务数量,权限不足时返回-1
getRunningServiceCount()
- 作用:获取运行中的服务数量
- 原理:使用
ActivityManager.getRunningServices()获取所有运行中的服务 - 权限:无需特殊权限
- 返回:正在运行的服务数量
getRunningApplicationCount()
- 作用:获取所有已安装应用中正在运行的数量
- 原理
- 获取所有已安装的应用列表
- 逐个检查每个应用是否正在运行
- 权限:无需特殊权限
- 返回:正在运行的已安装应用数量
isAppRunning(String packageName)
- 作用:检查指定包名的应用是否正在运行
- 原理:在运行进程列表中查找匹配的进程名
- 参数:应用包名
- 返回:true表示应用正在运行,false表示未运行

3996

被折叠的 条评论
为什么被折叠?



