Android 实时监听APP进入前台或后台

article/2025/10/8 4:23:45
下面已更新说明

前言

在我们开发的过程中,经常会遇到需要我们判断app进入后台,或者切换到前台的情况。比如我们想判断app切换到前台时,显示一个解锁界面,要求用户输入解锁密码才能继续进行操作;我们想判断app切换到后台,记录一下log;或者当用户切换回前台时,我们想刷新一下页面的数据等等…

android里面监听app前后台的方案很多(这还是得归根于安卓提供了丰富的api和强大的架构支撑,呵呵~),比如可以通过ActivityManager提供的getRunningAppProcesses()获取系统当前运行的app,从而判断app是否处于前台。或者通过监听点击Home键,判断app是否回到了后台。我列出下列几种方案,推荐方案三


方案一 利用ActivityManager的RunningAppProcessInfo类

ActivityManager在整个系统里面起着非常重要的作用,主要为系统中运行着的activity交互提供接口,其中 RunningAppProcessInfo类 则封装了正在运行着的进程信息,当然也包含了正在运行的app的包名,因此我们可以 activitymanager.getRunningAppProcesses() 获取当前运行的app列表,对比自身的包名,来判断本身app是否处于前台运行。

这打断一下,ActivityManager框架是Android系统十分重要的一部分,在以后有时间,笔者会好好学习整理ActivityManager框架的分析。

回到这里,下面给出部分关键代码。

/*** App前后台状态*/public boolean isForeground = false;@Overrideprotected void onResume() {......if (isForeground == false) {//由后台切换到前台isForeground = true;}}@Overrideprotected void onPause() {......if (!isAppOnForeground()) {//由前台切换到后台isForeground = false;}}/*** 判断app是否处于前台** @return*/public boolean isAppOnForeground() {ActivityManager activityManager = (ActivityManager) getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE);String packageName = getApplicationContext().getPackageName();/*** 获取Android设备中所有正在运行的App*/List<RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses();if (appProcesses == null)return false;for (RunningAppProcessInfo appProcess : appProcesses) {// The name of the process that this object is associated with.if (appProcess.processName.equals(packageName)&& appProcess.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {return true;}}return false;}

小结: 通过ActivityManager来获取当前运行的app列表,然后判断我们的app是否处于前台,能基本达到我们的预期需求。但如果将上面代码放到每一个activity,或者activity基类里面,这消耗还是挺大的。而且而且,ActivityManager通过.getRunningAppProcesses()获取当前运行列表这个方法,在5.0以后已经被deprecated掉了…(心中万马奔腾…)


方案二:监听Home键点击

说起home键的监听,也算是android里面的一个梗。这看上去简单的功能,实际上实现起来却十分的曲折,这跟android系统的设计有很大的关系。当home键被点击的时候,会发出一个系统广播,在系统收到这个广播以后,会在framework层做一系列操作将当前的app退到后台,然后把事件消费掉不传给应用层,所以这时候 onKeyDown事件也接收不到了…用官方的解释就是 ——“Home key. This key is handled by the framework and is never delivered to applications.”。实际上这也是为了安全性的考虑,不然每家的app都监听home键,然后禁掉响应,不都成了流氓软件了。

官方不支持,可是这难不到我们万能的攻城狮们的,毕竟有很多想我们正规的开发者,还是需要监听home键来做一些如写日志之类的操作的。网上谷歌百度会有很多类似的解决方案,在这里就不展开了。(不过这里可以推荐一下

小结: 我们能监听到home键点击,当然就知道app处于前台还是后台了。但毕竟这个方案是基于官方不支持的前提下的,而且home键的监听在很多设备都会有兼容性的问题,因此我们不大推荐这样做。


方案三:利用ActivityLifecycleCallbacks监听所有activity的生命周期

通过监听所有activity的onStart、onStop调用,然后统计当前是不是所有的activity都调用了onStop,确实可以判断app处于了后台,不过让我们重写每一个activity的onStop,并加这段奇怪的代码,实在不大优雅,即使在activity基类里面统一写,那天如果忘了或者不需要继承基类的activity,就不大好了。

因此,这里推荐一个新的接口ActivityLifecycleCallbacks,说新也不新,其实早在API 14 (android 4.0)就已经推出了。ActivityLifecycleCallbacks接口在Application类里面,因此需要我们自己继承Application,自定义一个MyApplication,然后注册接口。ActivityLifecycleCallbacks为application提供了对所有activity生命周期的监听,因此我们通过重写ActivityLifecycleCallbacks的onActivityStarted和onActivityStopped方法,定义一个变量,来统计当前有几个activity处于前台。

/*** 当前Acitity个数*/private int activityAount = 0;@Overridepublic void onCreate() {......registerActivityLifecycleCallbacks(activityLifecycleCallbacks);......}/*** Activity 生命周期监听,用于监控app前后台状态切换*/ActivityLifecycleCallbacks activityLifecycleCallbacks = new ActivityLifecycleCallbacks() {@Overridepublic void onActivityCreated(Activity activity, Bundle savedInstanceState) {}@Overridepublic void onActivityStarted(Activity activity) {
//            if (activityAount == 0) {
//                //app回到前台
//                isForeground = true;
//            }activityAount++;}@Overridepublic void onActivityResumed(Activity activity) {}@Overridepublic void onActivityPaused(Activity activity) {}@Overridepublic void onActivityStopped(Activity activity) {activityAount--;if (activityAount == 0) {isForeground = false;}}@Overridepublic void onActivitySaveInstanceState(Activity activity, Bundle outState) {}@Overridepublic void onActivityDestroyed(Activity activity) {}};

以上代码写在MyApplication里面。怎么样,是不是很简单快捷!而且准确无误。

总结:
1、利用ActivityManager的RunningAppProcessInfo类,直接粗暴,官方摒弃,不推荐;
2、监听Home键点击,官方不支持,兼容性差,不稳定,不推荐;
3、利用ActivityLifecycleCallbacks监听所有activity的生命周期,官方指定饮品,哦,不对,官方指定接口,大力推荐!我们举一反三,利用ActivityLifecycleCallbacks监听,我们还能控制我们的activity堆栈,甚至还可以在里面做日志统计…想想还是很强大的。

PS:虽则利用ActivityLifecycleCallbacks接口监听的方案最优,但这毕竟是4.0以后的产品,因此对于4.0以下的,可以考虑增加方案一判断。


这里提示一下
Android是在API14之后添加了用于监听应用Activity生命周期的回调接口ActivityLifecycleCallbacks,使用时需要在Application中进行注册。在Activity会报错
在这里插入图片描述
所以使用时,请自行转换或继承Application类来注册

参考:https://www.cnblogs.com/zhujiabin/p/9336663.html


更新一下:2019年11月20日 17:14:50

最近发现原来可以不用这么麻烦,直接监听andorid的onStart()onStop() 即可
也就是应用程序每次退到后代 或者被其他应用占据焦点的时候都会运行onStop()方法 然后再回到应用的时候 又会运行onStart()方法,自己搞复杂了,哈哈哈哈哈
写法如下:

  @Overrideprotected void onStop(){super.onStop();System.out.println("后台APP运行");}@Overrideprotected void onStart(){super.onStart();System.out.println("启动APP运行");}

http://chatgpt.dhexx.cn/article/TEaHTOY0.shtml

相关文章

什么是后台

什么是后台&#xff1f; 后台指的是运行在后台并且控制着前端的内容&#xff0c;它主要负责程序设计架构思想&#xff0c;管理数据库等。后台更多的是应用到数据库并且进行交互以处理相应的业务逻辑。它需要考虑的是如何实现功能、数据的存取、平台的稳定性与性能等方面。需要参…

Android后台应用开启前台服务---android8到android12梳理

以下内容都是针对start方式启动的service&#xff0c;而非bind启动的srevice。因为bind启动的服务生命周期始于Activity绑定在一起的&#xff0c;会随Activity的销毁而停止。但start方式启动的service独立的&#xff0c;即使应用销毁它也可以继续运行&#xff0c;故Android系统…

关闭后台App刷新后台应用刷新是做什么的

官方解释 “后台应用刷新” 是什么作用&#xff08;如图&#xff09; 关闭后台应用刷新&#xff0c;并不会影响到消息接收&#xff08;因为消息接收是通过Apple Push Notification机制来的&#xff09;省电模式默认全部应用都关闭刷新&#xff08;说明关闭可以省电&#xff09…

Android——后台服务

Android应用编程实验 实验名称&#xff1a;Android 后台服务 实验目的&#xff1a;通过Service设计后台服务程序&#xff0c;通过Broadcast实现信息广播机制 实验内容&#xff1a; 设计一个简单的后台音乐服务程序&#xff1b;设计一个简单的信息广播程序示例&#xff1b;利用B…

Android应用后台网络管控机制

应用后台网络管控机制 概述 在维护手管应用时&#xff0c;经常遇到与应用后台网络控制相关的问题&#xff0c;在解决这些问题的过程中&#xff0c;学习了下应用后台网络控制的流程以及一些日志的分析方法&#xff0c;现在把它总结一下&#xff0c;方便自己以及他人的学习。 网…

Android将后台应用唤起到前台的方法

在我们开发的过程中&#xff0c;经常遇到app进入后台&#xff0c;或者切换到前台的情况。 比如&#xff1a; 从后台切换到前台显示全屏广告实践来电显示从后台切换到前台 如图显示&#xff1a;压后台10秒钟&#xff0c;自动弹出 实现主要分为两个步骤&#xff1a; 第一步通…

后台功能

#&#x1f30c; 后台功能 后台功能模块&#xff0c;包含主控面板&#xff0c;开发管理&#xff0c;日志管理&#xff0c;系统监控&#xff0c;通知公告&#xff0c;文件管理&#xff0c;定时任务。 #1. 主控面饭 主控面板展示了系统的一些统计信息&#xff0c;采用默认的ant…

如何让应用保持后台运行,做到保活?

其实&#xff0c;我们无法做到真正意义上的保活&#xff0c;应为系统进程会自动杀死占用过大内存的某个应用。 但我们还有一种选择&#xff0c;就是过滤该应用的包名&#xff0c;做到后台任务键清理不掉它&#xff0c;单独去除不掉它&#xff0c;只有返回键才能做到真正的退出…

【已解决】Android 如何让应用在后台运行

应用在后台跑&#xff0c;这种说法可能不够准确&#xff0c;就是说应用没有finish退出&#xff0c;但也不在前台的状态&#xff0c;例如应用执行中点击了home键一样。如何实现呢&#xff1f; 要点&#xff1a; 退回后台是执行了home键&#xff0c;activity分别执行了onPause和…

如何让安卓APP一直在后台运行?

本文摘自微信公众号“android高心星的私塾” 一 声明 1 网上很多的保活手段&#xff0c;但是不靠谱的居多 2 本文只是进行保活知识的推广&#xff0c;不是在教你做永生不死的进程 二 保活手段 1 业界保活手段&#xff1a;黑色保活&#xff0c;灰色保活&#xff0c;白色保活 2…

Android | 判断App处于前台还是后台的方案

很多场景下&#xff0c;都需要判断某个App处于前台还是后台。本文集网上编写的前台判断方案于一体。 目前&#xff0c;有6种方案&#xff1a; 方 法 判断原理需要权限可以判断其他应用位于前台特点①RunningTask否Andorid4.0系列可以&#xff0c;5.0以上机器不行Android5.0此方…

fastapi_No.18_后台应用

文章目录 简介使用场景 创建后台应用步骤第一步&#xff1a;定义后台应用函数第二步&#xff1a;使用后台应用函数 在依赖项中的后台应用示例代码示例代码说明 简介 后台应用就是在发送响应后运行的函数。通常用在请求后需要耗费较长时间处理&#xff0c;且客户端不需要在接收…

win11如何禁用后台应用权限 Windows11禁用后台应用权限的设置方法

我在使用Win11系统的电脑时经常会遇到自动打开应用程序情况&#xff0c;很多小伙伴都不知道到如何关闭&#xff0c;那么遇到这种情况应该要如何解决呢?下面就和小编一起来看看Win11系统要如何去禁用软件的后台权限吧。更多windows11系统教程&#xff0c;可以参考小白一键重装网…

提高软件CPU占用率

案例&#xff1a; 独立线程以5ms一包的速率接收指令&#xff08;一共大概70-80种指令类型&#xff09;&#xff0c;并放入一个队列A 主线程中&#xff0c;根据定时器去队列A中取数据&#xff0c;并解析/计算/显示&#xff08;速率&#xff1a;200包/秒&#xff09; 现象&…

CPU使用率100%,如何解决

文章目录 CPU使用率概念CPU使用率的重要指标计算公式 查看CPU使用率CPU 使用率过高总结 CPU使用率 概念 单位时间内CPU使用情况的统计&#xff0c;以百分比方式显示 Linux是一个多任务操作系统&#xff0c;将每个CPU的时间划分为很短的时间片&#xff0c;通过调度器轮流分配…

解决 服务器cpu使用率100%,变成矿鸡之我与病毒crypto斗智斗勇,宝塔面板cpu使用率100%爆红

关于 简单解决宝塔面板显示CPU使用率 100%&#xff0c;但top却没找到相关进程这件事&#xff01;&#xff01;&#xff01; 如图&#xff1a; 作为一个小白&#xff0c;我只是想简单的搭建一个个人网站&#xff0c;结果碰到这个闹心的事。 服务器: 阿里云服务器 面板&#xff…

linux的mysql占用cpu过高_关于在Linux环境下,Mysql占用CPU使用率100%的优化

今天使用 MobaXterml 连接上一台物联网的Linux服务器的使用&#xff0c;发现该服务器的CPU使用率一直在100%左右。 使用top 命令发现Mysql占用了大量的CPU 用数据库工具 Navicat premium 以 root 的身份连接数据库&#xff0c;执行查询语句&#xff1a; show PROCESSLIST; 发现…

CPU使用率到100%,有哪些因素影响?

关注星标公众号&#xff0c;不错过精彩内容 转自 | 涛哥依旧 最近&#xff0c;一位同事急匆匆跑过来跟我说&#xff1a;糟糕了&#xff0c;服务器CPU的使用率达100%了。 我心想不可能啊&#xff0c;CPU有那么多核&#xff0c;怎会跑满&#xff1f;于是看了一眼&#xff0c;结果…

记一次golang cpu 占用100%

最近重新部署了下测试服务器&#xff0c;发现其负载达到了4.*&#xff0c; cpu 使用率达到了100%&#xff0c;吓的瑟瑟发抖&#xff0c;马上起来查看情况。 1&#xff0c; 想到了使用go性能查看工具&#xff1a; pprof&#xff0c;因为项目是用gin开发的&#xff0c;所在直接安…

Mysql CPU占用100%查询

这几天每天都会收到服务器负载报警&#xff0c;抽出时间查看一下原因。 进入到服务器使用top命令查看&#xff1a; 能够看到是mysql常年霸居榜首&#xff0c;导致服务器负载变高。理论上来讲&#xff0c;数据量没有那么大&#xff0c;因为很多数据都是没用的&#xff0c;前一段…