Android获取前台进程技术方案

本文详细介绍了在Android系统中获取前台进程的7种方法,包括通过RunningTask、RunningProcess、ActivityLifecycleCallbacks、UsageStatsManager、AccessibilityService、自解析/process以及作为系统进程的获取方式。每种方法的实现原理、优缺点以及适用场景都有详细阐述,特别提到在不同Android版本和厂商设备上的兼容性问题。
摘要由CSDN通过智能技术生成

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.  实现原理

AndroidSDK14Application类里增加了ActivityLifecycleCallbacks,我们可以通过这个Callback拿到App所有Activity的生命周期回调。

public interface ActivityLifecycleCallbacks {

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值