获取当前活动进程数量最近活跃应用数量等信息

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

获取当前活动进程数量最近活跃应用数量等信息

前言

昨天学习了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表示未运行

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值