You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android应用处于后台时如何获取当前正在运行的应用

Android 后台场景下获取当前运行应用信息的实现方案

从Android 5.0开始getRunningTasks(1)被官方标记为废弃,后续系统版本出于隐私安全考虑,逐步收紧了跨进程应用信息的访问权限,不存在全版本通用、无需权限的完美方案,可按系统版本分情况适配合规实现:

分版本可行方案

  • Android 10(API 29)及更高版本
    官方唯一合规的实现是使用UsageStatsManager查询前台应用信息,该方案不要求应用处于前台,后台状态下可正常返回结果。
    实现步骤:

    1. 在清单文件AndroidManifest.xml中声明特殊权限:
    <uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" />
    
    1. 由于该权限属于用户手动授权的特殊权限,无法通过常规动态权限弹窗申请,需要引导用户跳转至系统设置页手动开启「查看应用使用情况」开关:
    // 跳转应用使用统计授权页
    val intent = Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS)
    startActivity(intent)
    
    1. 用户授权完成后,通过查询近1秒内的应用活动事件,获取当前处于前台的应用包名:
    fun getCurrentForegroundApp(context: Context): String? {
        val usageStatsManager = context.getSystemService(Context.USAGE_STATS_SERVICE) as UsageStatsManager
        val queryEndTime = System.currentTimeMillis()
        val queryStartTime = queryEndTime - 1000
        val events = usageStatsManager.queryEvents(queryStartTime, queryEndTime)
        val event = UsageEvents.Event()
        var foregroundPackage: String? = null
        while (events.hasNextEvent()) {
            events.getNextEvent(event)
            if (event.eventType == UsageEvents.Event.ACTIVITY_RESUMED) {
                foregroundPackage = event.packageName
            }
        }
        return foregroundPackage
    }
    

    注意:Android 11引入了包可见性限制,需要在清单文件中补充以下配置,否则会出现查询不到第三方应用信息的问题:

    <queries>
        <intent>
            <action android:name="android.intent.action.MAIN" />
        </intent>
    </queries>
    
  • Android 5.0(API 21)~ Android 9.0(API 28)版本
    除上述UsageStatsManager方案外,还可以直接通过ActivityManager获取运行中进程信息,无需申请特殊权限:

    fun getForegroundAppBelowQ(context: Context): String? {
        val activityManager = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
        val processList = activityManager.runningAppProcesses ?: return null
        for (process in processList) {
            if (process.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
                return process.processName
            }
        }
        return null
    }
    

    该方案在Android 10及以上版本完全失效,高版本系统下调用该接口仅会返回应用自身的进程信息,无法获取其他应用数据。

不推荐使用的方案

  • 不要尝试反射调用系统隐藏API:Android 9开始系统新增了隐藏API黑名单机制,高版本下直接调用隐藏接口会抛出异常,同时这类实现会被各大应用市场判定为违规,无法正常上架。
  • 不要滥用无障碍服务获取前台应用信息:无障碍服务的设计定位是协助残障用户操作设备,若应用核心功能不依赖无障碍能力,仅通过该服务采集前台应用信息,上架审核时会被直接拒绝。
  • 不要在Android 10及以上版本依赖getRunningAppProcesses接口查询其他应用信息,如前所述,该接口在高版本已做权限隔离,无法返回第三方应用数据。

内容的提问来源于stack exchange,提问作者Sk-Saidul Alam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 21:57:23