Android应用处于后台时如何获取当前正在运行的应用
Android 后台场景下获取当前运行应用信息的实现方案
从Android 5.0开始getRunningTasks(1)被官方标记为废弃,后续系统版本出于隐私安全考虑,逐步收紧了跨进程应用信息的访问权限,不存在全版本通用、无需权限的完美方案,可按系统版本分情况适配合规实现:
分版本可行方案
Android 10(API 29)及更高版本
官方唯一合规的实现是使用UsageStatsManager查询前台应用信息,该方案不要求应用处于前台,后台状态下可正常返回结果。
实现步骤:- 在清单文件
AndroidManifest.xml中声明特殊权限:
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" />- 由于该权限属于用户手动授权的特殊权限,无法通过常规动态权限弹窗申请,需要引导用户跳转至系统设置页手动开启「查看应用使用情况」开关:
// 跳转应用使用统计授权页 val intent = Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS) startActivity(intent)- 用户授权完成后,通过查询近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
相关产品推荐
相关产品推荐

