关于调研获取设备是否处在 launcher界面结果如下:
基本思路:获取到当前设备前台应用包名,再获取到当前设备launcher包名,然后进行比较确定是否处于launcher。
一.针对获取前台应用的整体分析如下
Android版本 | 获取方式 | 是否用户手动打开权限 | 优点 | 缺点 |
4.x及以下版本 | getRunningTask() | 否 | 系统api方式 稳定 | 只能适用4.x及以下版本 |
5.x版本 | 读取proc/文件方式 | 否 | 无需用户打开权限 | 读取文件方式耗时 |
5.0~8.0版本 | 使用量统计功能获取前台应用 | 是 | 系统api方式 稳定 | 需要用户手动打开权限 |
Adroid6.0以下版本可以通过系统api(getRunningTask)以及读取proc/文件方式获取到前台应用,
Android6.0到8.0版本需要通过用户手动“查看应用使用情况”权限获得(特殊厂商自己定制限制除外)
以下列出各种获取方式详细情况:(整理代码工具类附件中)
1.Android5.0版本以前通过系统API getRunningTasks获取
2.Android5.0到6.0之前版本,可以通过读取proc/下文件的进程相关信息,通过读取优先级文件(oom_adj)进而得到前台应用
(Android 6.0及之后版本对proc/下oom_adj可读权限进行了限制,所以之后版本无法通过此方式获取)
缺点:如果proc/进程文件过多会比较耗时
3.通过使用量统计功能获取前台应用
优点:Android系统推荐的方式,稳定性好从5.0到8.0版本都可以获取(特殊厂商定制除外)
缺点:需要用户手动打开权限
4.通过辅助服务获取前台应用
缺点:需要用户手动打开,并且辅助服务在一些手机(小米、魅族、华为等国产手机)上,一旦程序被清理后台,就会被关闭,需要用户频繁打开。
5.通过系统反射hook AMS相关服务方式,获取ActivityStack进而得到前台应用,系统未暴露AMS相关代理所以无法完成