Kotlin开发Android应用如何获取系统最近打开的应用列表
Android 最近应用列表获取与批量清理实现说明
获取最近使用应用列表
不同Android版本的可用方案差异较大,和系统权限策略直接相关:
- API 21(Android 5.0)及更低版本
可直接调用ActivityManager.getRecentTasks()接口获取最近任务列表,仅需申请普通权限<uses-permission android:name="android.permission.GET_TASKS" />即可,该接口在API 21之后被官方废弃,高版本系统不再返回完整的第三方应用列表。 - API 22 ~ API 29(Android 5.1 ~ Android 10)
需使用UsageStatsManager实现,需要申请特殊权限<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" />,该权限无法通过动态权限申请获取,必须引导用户手动进入系统设置的「应用使用情况访问权限」页面授权后才能使用。
核心代码示例:UsageStatsManager statsManager = (UsageStatsManager) getSystemService(Context.USAGE_STATS_SERVICE); long end = System.currentTimeMillis(); long start = end - 24 * 60 * 60 * 1000; // 查询过去24小时的应用使用记录 List<UsageStats> statsList = statsManager.queryUsageStats(UsageStatsManager.INTERVAL_BEST, start, end); // 对查询结果按lastTimeUsed倒序排序,过滤系统应用后即可得到最近使用的第三方应用列表 - API 30(Android 11)及更高版本
系统进一步收紧权限,普通第三方应用即使获取了PACKAGE_USAGE_STATS权限,也只能查询自身的使用记录,无法获取其他应用的使用数据。仅系统预装应用、有ROOT权限、或者加入系统白名单的辅助类应用可以获取全量应用使用记录。
一键关闭全部应用实现限制
- Android 6.0之后,普通第三方应用不再拥有批量关闭其他应用的权限,
ActivityManager.killBackgroundProcesses()接口仅能杀死当前应用自身的后台进程,调用该接口杀其他应用的请求会被系统直接拦截。 - 仅以下场景可以实现批量关闭其他应用:
- 应用拥有系统签名,为ROM预装的手机管家类应用,拿到了系统级的
KILL_BACKGROUND_PROCESSES权限 - 设备已ROOT,应用获取ROOT权限后可通过执行shell命令杀死其他应用进程
- 部分国产定制ROM有私有开放的清理接口,仅面向合作的管家类应用开放,无通用公开API
- 应用拥有系统签名,为ROM预装的手机管家类应用,拿到了系统级的
补充说明
当前高版本Android系统对普通第三方应用的权限限制非常严格,除非是面向特定定制ROM、ROOT设备的场景,否则普通应用基本无法实现全系统的最近应用展示+一键清理功能。
内容的提问来源于stack exchange,提问作者Nikhil Thomas
相关产品推荐
相关产品推荐

