AndroidProcess

判断App是否处于后台/前台,使用ActivityLifecycleCallbacks稳得很! RunningAppProcessInfo.IMPORTANCE_FOREGROUND,或者RunningTask来判断过, 但是遇到过偶然失灵或者无法适配现在的android版本。原理其实就是利用activity的生命周期来判断,因为activity见不到了,都会调用onStop方法,所以它不但可以判断back监听,还可以判断Home退到后台。项目需要在App退到后台,再次进入App的时候,进入启屏页展示广告,记得之前用过。直接上代码:用的Kotlin,原理写在代码里的注释中了。 阅读详情

提供6种方法来判断App处于前台还是后台,并且封装成工具类供大家使用

最后一种方法堪称Android黑科技(非原创),既可以突破Android5.0以上的权限封锁,获取任意前台App的包名,又不需要权限,此方法并非我原创,原作者是国外的大神,GitHub项目在这里,也一并加入到工程中,供大家做全面的参考选择

预览图


用法

传入Context参数与想要判断是否位于前台的App的包名,会返回ture或者false表示App是否位于前台

//六种方法任选其一

//使用方法一
Boolean isForeground = BackgroundUtil.getRunningTask(context, packageName);
//使用方法二
Boolean isForeground = BackgroundUtil.getRunningAppProcesses(context, packageName);
//使用方法三
Boolean isForeground = BackgroundUtil.getApplicationValue(context);
//使用方法四
Boolean isForeground = BackgroundUtil.queryUsageStats(context, packageName);
//使用方法五
Boolean isForeground = BackgroundUtil.getFromAccessibilityService(context, packageName);
//使用方法六
Boolean isForeground = BackgroundUtil.getLinuxCoreInfo(context, packageName);

六种方法的区别

方法判断原理需要权限可以判断其他应用位于前台特点
方法一RunningTask否Android4.0系列可以,5.0以上机器不行5.0此方法被废弃
方法二RunningProcess否当App存在后台常驻的Service时失效无
方法三ActivityLifecycleCallbacks否否简单有效,代码最少
方法四UsageStatsManager是是需要用户手动授权
方法五通过Android无障碍功能实现否是需要用户手动授权
方法六读取/proc目录下的信息否是当proc目录下文件夹过多时,过多的IO操作会引起耗时

方法一:通过RunningTask


原理
当一个App处于前台的时候,会处于RunningTask的这个栈的栈顶,所以我们可以取出RunningTask的栈顶的任务进程,看他与我们的想要判断的App的包名是否相同,来达到效果

缺点
getRunningTask方法在Android5.0以上已经被废弃,只会返回自己和系统的一些不敏感的task,不再返回其他应用的task,用此方法来判断自身App是否处于后台,仍然是有效的,但是无法判断其他应用是否位于前台,因为不再能获取信息

方法二:通过RunningProcess


原理
通过runningProcess获取到一个当前正在运行的进程的List,我们遍历这个List中的每一个进程,判断这个进程的一个importance 属性是否是前台进程,并且包名是否与我们判断的APP的包名一样,如果这两个条件都符合,那么这个App就处于前台

缺点:
在聊天类型的App中,常常需要常驻后台来不间断的获取服务器的消息,这就需要我们把Service设置成START_STICKY,kill 后会被重启(等待5秒左右)来保证Service常驻后台。如果Service设置了这个属性,这个App的进程就会被判断是前台,代码上的表现就是appProcess.importance的值永远是 ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND,这样就永远无法判断出到底哪个是前台了。

方法三:通过ActivityLifecycleCallbacks


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

 public interface ActivityLifecycleCallbacks {
        void onActivityCreated(Activity activity, Bundle savedInstanceState);
        void onActivityStarted(Activity activity);
        void onActivityResumed(Activity activity);
        void onActivityPaused(Activity activity);
        void onActivityStopped(Activity activity);
        void onActivitySaveInstanceState(Activity activity, Bundle outState);
        void onActivityDestroyed(Activity activity);
    }


知道这些信息,我们就可以用更官方的办法来解决问题,当然还是利用方案二里的Activity生命周期的特性,我们只需要在Application的onCreate()里去注册上述接口,然后由Activity回调回来运行状态即可。

可能还有人在纠结,我用back键切到后台和用Home键切到后台,一样吗?以上方法适用吗?在Android应用开发中一般认为back键是可以捕获的,而Home键是不能捕获的(除非修改framework),但是上述方法从Activity生命周期着手解决问题,虽然这两种方式的Activity生命周期并不相同,但是二者都会执行onStop();所以并不关心到底是触发了哪个键切入后台的。另外,Application是否被销毁,都不会影响判断的正确性

方法四:通过使用UsageStatsManager获取


原理
通过使用UsageStatsManager获取,此方法是Android5.0之后提供的新API,可以获取一个时间段内的应用统计信息,但是必须满足一下要求

使用前提

  1. 此方法只在android5.0以上有效
  2. AndroidManifest中加入此权限

<uses-permission  android:name="android.permission.PACKAGE_USAGE_STATS" />

  1. 打开手机设置,点击安全-高级,在有权查看使用情况的应用中,为这个App打上勾


方法五:通过Android自带的无障碍功能

非常感谢@EffectiveMatrix大神带来的新的判断前后台的方法

此方法属于他原创,具体的博文参照这里http://effmx.com/articles/tong-guo-android-fu-zhu-gong-neng-accessibility-service-jian-ce-ren-yi-qian-tai-jie-mian/

此方法无法直观的通过下拉通知视图来进行前后台的观察,请到LogCat中进行观察即可,以下是LogCat中打印的信息


原理
Android 辅助功能(AccessibilityService) 为我们提供了一系列的事件回调,帮助我们指示一些用户界面的状态变化。 我们可以派生辅助功能类,进而对不同的 AccessibilityEvent 进行处理。 同样的,这个服务就可以用来判断当前的前台应用

优势
1. AccessibilityService 有非常广泛的 ROM 覆盖,特别是非国产手机,从 Android API Level 8(Android 2.2) 到 Android Api Level 23(Android 6.0)
2. AccessibilityService 不再需要轮询的判断当前的应用是不是在前台,系统会在窗口状态发生变化的时候主动回调,耗时和资源消耗都极小
3. 不需要权限请求
4. 它是一个稳定的方法,与 “方法6”读取 /proc 目录不同,它并非利用 Android 一些设计上的漏洞,可以长期使用的可能很大
5. 可以用来判断任意应用甚至 Activity, PopupWindow, Dialog 对象是否处于前台

劣势
1. 需要要用户开启辅助功能
2. 辅助功能会伴随应用被“强行停止”而剥夺

方法六:读取Linux系统内核保存在/proc目录下的process进程信息


此方法并非我原创,原作者是国外的大神,GitHub项目在这里,也一并加入到工程中,供大家做全面的参考选择

原理
无意中看到乌云上有人提的一个漏洞,Linux系统内核会把process进程信息保存在/proc目录下,Shell命令去获取的他,再根据进程的属性判断是否为前台

优点
1. 不需要任何权限
2. 可以判断任意一个应用是否在前台,而不局限在自身应用

缺点
1. 当/proc下文件夹过多时,此方法是耗时操作

用法
获取一系列正在运行的App的进程

List<AndroidAppProcess> processes = ProcessManager.getRunningAppProcesses();

获取任一正在运行的App进程的详细信息

AndroidAppProcess process = processes.get(location);
String processName = process.name;

Stat stat = process.stat();
int pid = stat.getPid();
int parentProcessId = stat.ppid();
long startTime = stat.stime();
int policy = stat.policy();
char state = stat.state();

Statm statm = process.statm();
long totalSizeOfProcess = statm.getSize();
long residentSetSize = statm.getResidentSetSize();

PackageInfo packageInfo = process.getPackageInfo(context, 0);
String appName = packageInfo.applicationInfo.loadLabel(pm).toString();

判断是否在前台

if (ProcessManager.isMyProcessInTheForeground()) {
  // do stuff
}

获取一系列正在运行的App进程的详细信息

List<ActivityManager.RunningAppProcessInfo> processes = ProcessManager.getRunningAppProcessInfo(ctx);

Gradle 构建

  • 版本
    • 最新 Android SDK
    • 最新 Gradle
  • 环境变量
    • ANDROID_HOME
    • GRADLE_HOME,同时把bin放入path变量
    • Android SDK 安装,都更新到最新
    • Android SDK Build-tools更新到最新
    • Google Repository更新到最新
    • Android Support Repository更新到最新
    • Android Support Library更新到最新
原文地址:https://github.com/wenmingvs/AndroidProcess

【Android面试八股文】如何判断一个APP在前台还是后台?有哪几种方法? 虽然通过查询运行中的进程来判断应用的前后台状态是一种早期的实现方式,但由于系统安全性和效率的考虑,现在更推荐使用或来监控应用的生命周期和内存状态变化。这些方法更加直接、高效,并且在更高版本的 Android 上仍然可靠。 阅读详情

相关推荐

中兴OLT配置实战:从零开始,手把手教你完成一个HGU的完整业务开通(含DBA模板、限速与远程升级)

本文详细介绍了中兴OLT配置实战,从零开始手把手教你完成HGU的完整业务开通,包括DBA模板设计、限速与远程升级等关键步骤。通过实际案例和详细命令,帮助工程师快速掌握GPON网络配置技巧,提升运维效率。

weixin_30599769的博客 348

如何判断Android应用置于前后台

记录两种获取应用程序置于前后台状态方法。第一种使用Android系统API;第二种使用Activity生命周期。

埋头苦干程序猿 5271

华为MA5626 ONU开局配置实战:从零到业务就绪的完整命令手册

本文详细介绍了华为MA5626 ONU设备的开局配置全流程,包括物理连接、命令行初始化、业务VLAN划分、PoE功能配置及故障排查。通过实战命令手册,帮助网络工程师快速完成从设备上电到业务就绪的完整配置,特别适合FTTB场景部署。

weixin_26934905的博客 561

判断指定App是否位于前台的方法

原文地址:http://p.codekk.com/detail/Android/wenmingvs/AndroidProcess 提供6种方法来判断App处于前台还是后台,并且封装成工具类供大家使用 最后一种方法堪称Android黑科技(非原创),既可以突破Android5.0以上的权限封锁,获取任意前台App的包名,又不需要权限,欢迎大家star我的新项目 Download L

6203

水文预报新手别怕!用Matlab 18小时搞定马斯京根法参数K和x(附完整代码)

本文详细介绍了如何使用Matlab在18小时内快速掌握水文预报中的马斯京根法参数K和x的求解方法。通过完整的代码示例和分步解析,帮助新手从理论到实践快速跨越,解决传统手工试算耗时耗力的问题,提升水文预报的效率和精度。

weixin_42573113的博客 255

几率大的网络安全面试题(含答案)

其他篇章:Java校招极大几率出的面试题(含答案)----汇总 本文面试题汇总: 防范常见的 Web 攻击 重要协议分布层 arp协议的工作原理 rip协议是什么?rip的工作原理 什么是RARP?工作原理 OSPF协议?OSPF的工作原理 TCP与UDP区别总结 什么是三次握手四次挥手? tcp为什么要三次握手? dns是什么?dns的工作原理 一次完整的HTTP请求过程 Cookies和ses...

睶 6万+

判断某App位于前台还是后台的6种方法

判断App位于前台或者后台的6种方法

yzwfeng的专栏 6810

在 PyCharm 中使用 Copilot

此外,要在 PyCharm 中使用 GitHub Copilot,您必须有效订阅 Copilot。在 PyCharm 中安装 GitHub Copilot 后,您现在可以将其用作项目的扩展。此外,它很容易安装在不同的 IDE 平台上,您还可以为特定编程语言启用 GitHub 插件。此外,按照以下步骤,您可以轻松地在 PyCharm 中安装 GitHub Copilot。此外,在 IDE 上使用 GitHub Copilot 时,您可以使用一些快捷方式。

一览无遗 1万+

AndroidProcess 使用教程

该项目的目录结构如下: ``` AndroidProcess/ ├── app/ // 主应用模块,包含源代码、资源文件和AndroidManifest.xml │ ├── src/ │ │ └── main/ // 主源码目录 │ │ ├── java/ // Java源代码 │ │ └── res/ // 资...

gitblog_01065的博客 565

嵌入式工程师成长之路(5)——板子调试

USB2514集线器调试总结说说USB连接线USB数据线上的“疙瘩”:原来有这么大用处!

云轩阁 4万+

ASPICE(Automotive SPICE)流程落地,研发管理工具自研,如何从量化数据体现研发效率提升的

摘要: ASPICE流程显著提升研发效率,主要体现在质量、成本和时间三个维度。关键量化指标包括:缺陷率降低30%-60%,维护工作量减少28%,研发周期缩短10%-20%,需求变更率降低58%,代码评审效率提升300%。初期开发成本虽增加9%,但长期回报率高。核心方法包括缺陷预防前移、需求精准管理和流程标准化与自动化。建立量化度量体系需覆盖缺陷密度、需求稳定性、进度偏差等指标,并依托工具链支持数据收集。实施ASPICE是短期投入换取长期质量提升和成本优化的高效投资。

汽车软件开发 183

AndroidProcess:6种方法精准判断App前后台状态的技术解析

在Android应用开发中,准确判断应用是否处于前台(Foreground)或后台(Background)是一个常见但极具挑战性的需求。无论是为了优化性能、节省电量,还是实现特定的业务逻辑(如消息推送、数据同步、权限控制等),前后台状态的准确判断都至关重要。 然而,Android系统在不同版本中不断改变进程管理策略,使得传统的检测方法逐渐失效。开发者常常面临以下痛点: - **版本兼容性问题*...

gitblog_01072的博客 1086

在 ABAP Push Channel 里玩转 Detached Client:用 Attach Handle 把 WebSocket 连接交接给业务逻辑

摘要:本文介绍了ABAP Push Channels (APC)中的Detached Client技术,该技术通过将WebSocket连接建立与后续处理分离,实现更高效的实时通信。核心流程包括创建连接、使用connect_and_detach交接连接、以及通过attach handle重新附着发送消息。文章还探讨了PCP协议和AMC技术在企业级推送场景中的应用,并通过示例代码展示了Detached Client的具体实现方式。这种设计解决了传统轮询的资源浪费问题,特别适用于生产线监控、客服系统等需要服务端主

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 2314

AndroidProcess无障碍服务实战:突破权限限制的终极方案

在Android应用开发中,**应用前后台检测**一直是开发者面临的重要挑战。随着Android系统版本的不断升级,传统的检测方法逐渐失效,权限限制日益严格。本文将深入探讨AndroidProcess项目中**无障碍服务(AccessibilityService)** 这一终极解决方案,帮助开发者突破权限限制,实现精准的应用状态检测。 ## 🔍 为什么需要无障碍服务进行应用检测? Andro

gitblog_00453的博客 371

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

查看小程序的androidProcess

1.手机连接电脑,杀掉手机所有应用进程,打开微信,pc端命令行输入命令:adb shell dumpsys activity top| grep ACTIVITY 2.打开目标小程序,继续执行上一条命令,结果如下 通过观察可以发现小程序的pid为30165 3.pc端执行命令:adb shell ps 上一步新增的pid号,查询出的NAME列即为小程序的androidProcess ...

doulihang的博客 963

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

AndroidProcess多版本兼容性解决方案:从Android 2.2到最新系统的完美适配

AndroidProcess是一款专注于判断应用前后台状态的工具库,支持从Android 2.2到最新系统的全版本适配,通过6种不同实现方法解决跨版本兼容性难题。无论是需要检测自身应用状态还是监控其他应用前台运行情况,该库都能提供稳定可靠的解决方案,帮助开发者轻松应对Android系统碎片化带来的挑战。 ## 📊 6种前后台判断方法全解析 AndroidProcess提供了6种判断应用前后台

gitblog_00189的博客 445

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

相同androidprocess,相同androidsharedUserId探索

不同包名,相同进程名 HelloWorld <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.crazyit.helloworld" android:versionCode="1" android:versionName="1.0" > <u

zhangmiaoping23的专栏 1203

AndroidProcess最佳实践:构建稳定可靠的前后台监控系统

在Android开发中,准确判断应用的前后台状态对于用户体验优化、性能管理和资源控制至关重要。AndroidProcess项目提供了6种不同的前后台监控方法,每种方法都有其独特的适用场景和限制条件。本文将深入探讨这些方法的原理、优缺点,并提供构建稳定可靠监控系统的最佳实践指南。 ## 🔍 为什么需要前后台监控? 在移动应用开发中,了解应用的前后台状态对于以下场景至关重要: 1. **用户体

gitblog_00591的博客 443

查看小程序/公众号androidProcess的命令

 1.在手机上先打开要查看的小程序,电脑cmd运行此命令 adb shell dumpsys activity top| findstr ACTIVITY 得到结果,记住最后这个数字 2.再运行如下命令: adb shell ps 24510(这是上面获得的数字) 得到结果,最后的com.tencent.mm就是androidProcess啦(PS:因为我没打开小程序,只打开了微...

dream_18的博客 935

AndroidProcess完全指南:6种方法精准判断App前后台状态

在Android开发中,准确判断应用的前后台状态是许多功能实现的基础需求。无论是实现推送消息的智能分发、优化应用性能、还是开发系统监控工具,都需要精确识别应用是否处于前台运行状态。AndroidProcess项目提供了**6种不同的方法**来精准判断App前后台状态,涵盖了从传统API到现代解决方案的完整方案。 ## 为什么需要判断App前后台状态? 🤔 在移动应用开发中,了解应用是否处于前

gitblog_00601的博客 768

如何判断当前 app 是否在前台运行。

https://github.com/wenmingvs/AndroidProcess

qq906786621的专栏 1322

python实现微信小程序的接口自动化_appium+python自动化56-微信小程序自动化(摩拜为例)...

前言最近微信的小程序越来越多了,随之带来的问题是:小程序如何做自动化测试?本篇以摩拜小程序为例,介绍如何定位小程序里面的元素运行环境:android 7.0appium v1.7.1webview进程1.小程序和微信公众号还不太一样,基本思路差不多,先配置:chromeOptions'chromeOptions': {'androidProcess': 'com.tencent.mm:appbra...

weixin_39574065的博客 311

python 自动化微信小程序_appium+python 微信小程序的自动化

前言最近微信的小程序越来越多了,随之带来的问题是:小程序如何做自动化测试?今天写一篇小程序该如何做自动化测试,如何定位,具体以膜拜为例子webview进程1.小程序和微信公众号还不太一样,基本思路差不多,先配置:chromeOptions'chromeOptions': {'androidProcess': 'com.tencent.mm:appbrand0'}2.androidProcess进程...

weixin_39644614的博客 1600

app自动化测试之Andriod微信小程序的自动化测试

随着微信小程序的功能和生态日益完善,很多公司的小程序项目页面结构越来越多,业务逻辑也越来越复杂。如何做好小程序的自动化测试就成为测试同学普遍面临的一大痛点难题。

软件测试技术资源分享官 149

android微信小程序自动填表_微信小程序自动化,记录趟过的坑!

项目思想:关键字+数据驱动混合测试基于Android-微信小程序自动化的关键是:webview的切换对于微信App来说如何从NATIVE切换到webview的过程测试版本信息1.微信版本:7.0.212.Android:7.03.appium引入依赖:6.1.04.testng引入依赖:6.14.3初始化实例配置信息1.配置参数如下:其中涉及到微信内置webview版本与chromedriver一...

weixin_34393451的博客 1496

微信小程序自动化,记录趟过的坑!

项目思想:关键字+数据驱动混合测试 基于Android-微信小程序自动化的关键是:webview的切换 对于微信App来说如何从NATIVE切换到webview的过程 测试版本信息 1.微信版本:7.0.21 2.Android:7.0 3.appium引入依赖:6.1.0 4.testng引入依赖:6.14.3 初始化实例配置信息 1.配置参数如下: 其中涉及到微信内置webview版本与chromedriver一致性设置,查看流程如下: 第一步:查看微信webview版本信息,这里通过uc-de.

tester_runing的博客 1956
上一篇: Android 判断应用前后台运行状态并获取当前 Activity 实例
下一篇: Android实现点击通知栏后,先启动应用再打开目标Activity
cbbbc
博客等级 码龄15年 609粉丝 37原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值