Andoid系统从Android5.0开始对获取前台进程接口进行相关限制。本文为对突破Android接口限制进行的一系列研究的总结。目前所有获取前台进程的接口有如下7种方式:
接下来将对每一种方案进行详细的阐述。
1. 通过RunningTask
1.1. 实现原理
当一个App处于前台的时候,会处于RunningTask的这个栈的栈顶,所以我们可以取出RunningTask的栈顶的任务进程,看他与我们的想要判断的App的包名是否相同,来达到效果。
代码实现如下:
1.2. 方案缺点
getRunningTask方法在Android5.0以上已经被废弃,只会返回自己和系统的一些不敏感的task,不再返回其他应用的task,用此方法来判断自身App是否处于后台,仍然是有效的,但是无法判断其他应用是否位于前台,因为不再能获取信息
2. 通过RunningProcess
2.1. 实现原理
通过runningProcess获取到一个当前正在运行的进程的List,我们遍历这个List中的每一个进程,判断这个进程的一个importance 属性是否是前台进程,并且包名是否与我们判断的APP的包名一样,如果这两个条件都符合,那么这个App就处于前台。
代码实现如下:
2.2. 方案缺点
1、 对于前台Service(通过setForeground接口设置)的进程会被误判判断是前台进程,代码上的表现就是appProcess.importance的值永远是ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND,这样就会存在误判的情况出现。
2、 该方案只在Android5.0之前有效,Android5.0以后也被系统废弃。而且基于Android5.0的小米开发版及部分基于Android5.0的华为版本该方案也会存在问题。
针对会在部分Android5.0的机型上存在问题的问题,我封装了一个测试接口用于判断,如果该接口返回为true则说明为问题机型,则RunningProcess方案不适用。测试接口的思想为:先通过getRunningAppProcesses获取到进程的List,然后判断如果进程数量非常少(这里设定的阈值为3个),或者进程列表中只有Launcher和应用自身存在,则认为接口存在问题。测试代码如下:
3. 通过ActivityLifecycleCallbacks
3.1. 实现原理
AndroidSDK14在Application类里增加了ActivityLifecycleCallbacks,我们可以通过这个Callback拿到App所有Activity的生命周期回调。
public interface ActivityLifecycleCallbacks {