利用ActivityLifecycleCallbacks判断APP是否在后台运行

简介: 在开发的时候,我们时常有这样一个需求:判断APP是否在后台运行? 常见的方式是这样的: 或者是这样的:如上的这两种方式都可以满足我们的需求 。

在开发的时候,我们时常有这样一个需求:判断APP是否在后台运行?
常见的方式是这样的:

这里写图片描述

或者是这样的:

这里写图片描述

如上的这两种方式都可以满足我们的需求 。

但是这么做效率高么?不!请注意,这里是一个大写的
这很像我们平时用瘟到死操作系统去打开任务管理器的感觉;或者写了一个看上去金光闪闪,牛叉哄哄的for循环挨个遍历一遍。

我们可以不这么鲁莽么?我们可以换一种优雅的方式来实现这个功能么?我们可以用Android系统的API来实现么?可以!请注意,这里是一个大写的可以

Android在SDK 14提供了一个Callback即ActivityLifecycleCallbacks,通过这个Callback可拿到App所有Activity的生命周期回调

这里写图片描述

从这个接口里的几个方法名你大概猜到了:在这个回调中可以监测App中所有Activity的生命周期,它们都赤果果地站在你面前了。嗯哼,是不是有一种类似的感觉:公司妹子们的手机号都搞到手了?都到这份上了,下面该干什么了……….

当然是看看这个回调怎么用,不要想歪了…….

首先自定义一个Application在其onCreate( )方法中注册ActivityLifecycleCallbacks.

public class MyApplication extends Application {
    private static MyApplication mApplicationInstance;
    private ActivityLifecycleCallbacksImpl mActivityLifecycleCallbacksImpl;
    @Override
    public void onCreate() {
        super.onCreate();
        mApplicationInstance=new MyApplication();
        mActivityLifecycleCallbacksImpl=new ActivityLifecycleCallbacksImpl();
        this.registerActivityLifecycleCallbacks(mActivityLifecycleCallbacksImpl);
    }
    public static MyApplication getInstance() {
        if (null==mApplicationInstance) {
            mApplicationInstance=new MyApplication();
        }
        return mApplicationInstance;
    }
    private class ActivityLifecycleCallbacksImpl implements ActivityLifecycleCallbacks{
        @Override
        public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
        }
        @Override
        public void onActivityStarted(Activity activity) {
        }
        @Override
        public void onActivityResumed(Activity activity) {
        }
        @Override
        public void onActivityPaused(Activity activity) {
        }
        @Override
        public void onActivityStopped(Activity activity) {
        }
        @Override
        public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
        }
        @Override
        public void onActivityDestroyed(Activity activity) {
        }
    }
}


这个时候我们就要考虑了:怎么判断APP是否运行在后台?
从Activity的生命周期我们可知:
Activity调用onResume(),那么该Activity是可见的,即它在前台。
Activity调用onPause(),那么该Activity就到了后台。
顺着这个思路往下走,我们可以在ActivityLifecycleCallbacks中利用一个计数器activityCounter来判断是否有Activity运行在前台。
1 在onActivityResumed()方法中使activityCounter+1
2 在onActivityPaused()方法使activityCounter-1

所以:
当activityCounter=0的时候我们可以判定APP运行在后台
当activityCounter=1的时候我们可以判定APP运行在前台

这么做是不是觉得挺nice的?嗯哼。
这么做有瑕疵么?有遗漏的地方么?
我们来看这么一种常见的场景:
假设存在两个界面Activity A和Activity B
在Activity A启动后activityCounter=1;这个是没有疑问的。
在某一时刻App需要从Activity A跳转到Activity B,此时这两个Activity的生命周期如下:
A.onPause()->B.onCreate()->B.onStart()-> B.onResume()-> A.onStop()
假若按照我们的处理方式:
此时Activity A会执行到onPause(),那么在ActivityLifecycleCallbacks中使activityCounter-1,此时activityCounter=0;表示该APP运行在后台.
这当然是错的:两个界面切换的过程中APP怎么可能是运行在后台的呢?
我们错在哪里了?!?
我们平常不就是习惯性地在onPause()和onResume()做操作么?
是的,平常那么做没啥做,因为那是单个的Activity,但是这里涉及到了两个Activity的跳转。我们错就错在惯性思维,错在了想当然。

当我们冷静一下,回头再瞅瞅两个Activity跳转时两者的生命周期就可发现,只需很小的修改就可以纠正这个问题:
1 在onActivityStarted()中对于activityCounter+1
2 在onActivityStopped()中对于activityCounter-1
这样就解决了刚才的问题。

ActivityLifecycleCallbacks除了可以帮助我们判断App是否运行在后台?还能帮我们做什么呢?有时候项目是不是要求:退出应用时关闭所有的Activity呢?嗯哼,利用ActivityLifecycleCallbacks也可以做到.我们可以采用一个LinkedList管理应用中的界面
1 在ActivityLifecycleCallbacks的onActivityCreated()将Activity添加到 LinkedList中
2 在ActivityLifecycleCallbacks的onActivityDestroyed()将Activity从LinkedList中移除
3 退出应用时销毁LinkedList中所有Activity

在最前面我们也提到了ActivityLifecycleCallbacks是在API 14及其以上才有的。那么在Android4.0以下又可以怎么做呢?
其实不难,我们在应用的BaseActivity中按照该思路实现即可。


备注说明:
1 源码下载
2 大家可加QQ群: 183899857讨论技术问题
3 亦可在博文下方留言或者评论

相关文章
|
3月前
|
JavaScript Android开发
Cordova 后台运行 Android APP
Cordova 后台运行 Android APP
81 0
|
JavaScript Android开发
Cordova 后台运行 Android APP
在 Vue 项目中的主页(Home.vue)设置返回键,点击返回后 APP 自动后台运行,在 Home.vue created() 中设置回退按钮监听事件。
299 0
|
3天前
|
Web App开发 Android开发
FFmpeg开发笔记(四十六)利用SRT协议构建手机APP的直播Demo
实时数据传输在互联网中至关重要,不仅支持即时通讯如QQ、微信的文字与图片传输,还包括音视频通信。一对一通信常采用WebRTC技术,如《Android Studio开发实战》中的App集成示例;而一对多的在线直播则需部署独立的流媒体服务器,使用如SRT等协议。SRT因其优越的直播质量正逐渐成为主流。本文档概述了SRT协议的使用,包括通过OBS Studio和SRT Streamer进行SRT直播推流的方法,并展示了推流与拉流的成功实例。更多细节参见《FFmpeg开发实战》一书。
11 1
FFmpeg开发笔记(四十六)利用SRT协议构建手机APP的直播Demo
|
10天前
|
Web App开发 5G Linux
FFmpeg开发笔记(四十四)毕业设计可做的几个拉满颜值的音视频APP
一年一度的毕业季来临,计算机专业的毕业设计尤为重要,不仅关乎学业评价还积累实战经验。选择紧跟5G技术趋势的音视频APP作为课题极具吸引力。这里推荐三类应用:一是融合WebRTC技术实现视频通话的即时通信APP;二是具备在线直播功能的短视频分享平台,涉及RTMP/SRT等直播技术;三是具有自定义动画特效及卡拉OK歌词字幕功能的视频剪辑工具。这些项目不仅技术含量高,也符合市场需求,是毕业设计的理想选择。
32 6
FFmpeg开发笔记(四十四)毕业设计可做的几个拉满颜值的音视频APP
|
9天前
|
编解码 Java Android开发
FFmpeg开发笔记(四十五)使用SRT Streamer开启APP直播推流
​SRT Streamer是一个安卓手机端的开源SRT协议直播推流框架,可用于RTMP直播和SRT直播。SRT Streamer支持的视频编码包括H264、H265等等,支持的音频编码包括AAC、OPUS等等,可谓功能强大的APP直播框架。另一款APP直播框架RTMP Streamer支持RTMP直播和RTSP直播,不支持SRT协议的直播。而本文讲述的SRT Streamer支持RTMP直播和SRT直播,不支持RTSP协议的直播。有关RTMP Streamer的说明参见之前的文章《使用RTMP Streamer开启APP直播推流》,下面介绍如何使用SRT Streamer开启手机直播。
30 4
FFmpeg开发笔记(四十五)使用SRT Streamer开启APP直播推流
|
21天前
|
存储 开发框架 安全
鸿蒙 HarmonyOS NEXT星河版APP应用开发-阶段一
HarmonyOS NEXT星河版的应用开发标志着华为分布式操作系统的全新篇章,它聚焦于打造原生精致、易用、流畅、安全、智能和互联的极致体验。开发者可以利用其先进的API和工具集,如DevEco Studio,构建高性能、跨设备无缝协同的应用程序,从而充分利用HarmonyOS的分布式能力,为用户带来一致且丰富的多场景数字生活体验。随着“学习强国”、岚图汽车、中国电信等知名企业和应用的加入,鸿蒙生态正迅速扩展,引领着原生应用开发的新趋势。
39 3
鸿蒙 HarmonyOS NEXT星河版APP应用开发-阶段一
|
17天前
|
XML Android开发 UED
"掌握安卓开发新境界:深度解析AndroidManifest.xml中的Intent-filter配置,让你的App轻松响应scheme_url,开启无限交互可能!"
【8月更文挑战第2天】在安卓开发中,scheme_url 通过在`AndroidManifest.xml`中配置`Intent-filter`,使应用能响应特定URL启动或执行操作。基本配置下,应用可通过定义特定URL模式的`Intent-filter`响应相应链接。
46 12
|
1月前
|
Web App开发 缓存 编解码
FFmpeg开发笔记(三十八)APP如何访问SRS推流的RTMP直播地址
《FFmpeg开发实战》书中介绍了轻量级流媒体服务器MediaMTX,适合测试RTSP/RTMP协议,但不适用于复杂直播场景。SRS是一款强大的开源流媒体服务器,支持多种协议,起初为RTMP,现扩展至HLS、SRT等。在FFmpeg 6.1之前,推送给SRS的HEVC流不受支持。要播放RTMP流,Android应用可使用ExoPlayer,需在`build.gradle`导入ExoPlayer及RTMP扩展,并根据URL类型创建MediaSource。若SRS播放黑屏,需在配置文件中开启`gop_cache`以缓存关键帧。
92 2
FFmpeg开发笔记(三十八)APP如何访问SRS推流的RTMP直播地址

热门文章

最新文章