判断App是否处于后台/前台,使用ActivityLifecycleCallbacks稳得很!

简介: RunningAppProcessInfo.IMPORTANCE_FOREGROUND,或者RunningTask来判断过, 但是遇到过偶然失灵或者无法适配现在的android版本。毕竟太老了,现在用点进去经常会有@Deprecated注解,表示废弃了。

项目需要在App退到后台,再次进入App的时候,进入启屏页展示广告,记得之前用过


RunningAppProcessInfo.IMPORTANCE_FOREGROUND,或者RunningTask来判断过, 但是遇到过偶然失灵或者无法适配现在的android版本。毕竟太老了,现在用点进去经常会有@Deprecated注解,表示废弃了。


       例如Im聊天时的常驻Service,Service设置成START_STICKY,杀死后这个属性会重启服务,导致App的进程就会被判断是前台,appProcess.importance的值永远是 ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND,这就没得玩了。


       于是想到了是否可以利用Activity页面切换和前后台切换的生命周期来判断是否处于后台。就用到了ActivityLifecycleCallbacks。


直接上代码:用的Kotlin,原理写在代码里的注释中了


package com.example.kotlinlaunch.base
import android.app.Activity
import android.app.Application
import android.os.Bundle
import android.util.Log
import androidx.lifecycle.*
/**
 *  lixiang
 *  2023.03.08
 */
class BaseApplication : Application(), Application.ActivityLifecycleCallbacks,
    LifecycleEventObserver {
    private var activityCount = 0 //activity计数
    private var currentActivity: Activity? = null //当前activity
    private var activityList = mutableListOf<Activity>() //activity列表 可用来判断是不是指定Activity,可对其进行移除等操作
    override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
        activityList.add(activity)
    }
    /**

    * 原理:Activity的生命周期

    * 一般的页面跳转的生命周期为 进入A页面 A-onCreated A-onStart A-onResume 进入B界面后 B-onCrete B-onStart B-onResume A-onStop

    * 但是 A界面直接退到后台 会直接调A-onStop(无论back退出还是home退出)

    * 所以我们可以利用这个原理,activityCount 在 onStart+1 在 onStop-1 ,所以在界面跳转时会是1+1再-1等于1

    * 在切换后台时则是1-1=0 所以便可以

    * 根据这个数来判断是否在后台

    * 然后定义一个全局变量 isBackGround来保存,当从后台切换时,可用当前的activity进行操作

    * isHomeBack这个变量是用来在主页onKeyDown触发返回键时,moveTaskToBack(boolean) 退到后台时,此时isBackGround为true,这样也可以区分

    * 是home上滑返回,还是主页back返回

    * AppVariable里面放的全是全局静态变量

    *

/
    override fun onActivityStarted(activity: Activity) {
        if (AppVariable.isBackGround) {
            AppVariable.isBackGround = false
            //home退出App
            if ((System.currentTimeMillis() - AppVariable.exitAppTime) / 1000 > 3) {//exitAppTime是我退到后台时记录的时间,可以根据用户退到后台多少秒进行不同的操作
                jump(activity)
            } else if (AppVariable.isHomeBack) { //主页back 退出
                jump(activity)
                AppVariable.isHomeBack = false
            }
        }
        activityCount++
    }
    private fun jump(activity: Activity) {
        //跳转操作
    }
    override fun onActivityResumed(activity: Activity) {
        currentActivity = activity
    }
    override fun onActivityPaused(activity: Activity) {
        currentActivity = activity
    }
    override fun onActivityStopped(activity: Activity) {
        currentActivity = activity
        activityCount--
        if (activityCount == 0) {
            AppVariable.isBackGround = true
            AppVariable.exitAppTime = System.currentTimeMillis()
        }
    }
    override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {
    }
    override fun onActivityDestroyed(activity: Activity) {
        activityList.remove(activity)
    }
    override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
        Log.e("lixiang", event.name)
        when (event) {
            Lifecycle.Event.ON_CREATE -> {}
            Lifecycle.Event.ON_START -> {}
            else -> {}
        }
    }
}


原理其实就是利用activity的生命周期来判断,因为activity见不到了,都会调用onStop方法,所以它不但可以判断back监听,还可以判断Home退到后台。


相关文章
|
1月前
|
架构师 Java
jvm性能调优实战 - 35电商APP后台系统如何对Full GC进行深度优化
jvm性能调优实战 - 35电商APP后台系统如何对Full GC进行深度优化
62 0
|
1月前
|
XML Java Android开发
Android Studio App开发之服务Service的讲解及实战(包括启动和停止,绑定与解绑,推送服务到前台实现音乐播放器,附源码)
Android Studio App开发之服务Service的讲解及实战(包括启动和停止,绑定与解绑,推送服务到前台实现音乐播放器,附源码)
343 0
|
1月前
|
定位技术 开发工具 iOS开发
ios9定位服务的app进入后台三分钟收不到经纬度,应用被挂起问题及解决方案
ios9定位服务的app进入后台三分钟收不到经纬度,应用被挂起问题及解决方案
24 0
|
1月前
|
前端开发 Android开发 iOS开发
应用研发平台EMAS使用 aliyun-react-native-push 库接入推送和辅助通道,推送都可以收到,但是在App切到后台或者杀掉进程之后就收不到推送了,是需要配置什么吗?
【2月更文挑战第31天】应用研发平台EMAS使用 aliyun-react-native-push 库接入推送和辅助通道,推送都可以收到,但是在App切到后台或者杀掉进程之后就收不到推送了,是需要配置什么吗?
47 2
|
10月前
|
iOS开发
scenePhase 的作用 -- 检测 APP 是否在后台
SwiftUI 提供了一个名为 `scenePhase` 的 环境变量,它在应用程序在前台、后台和非活动状态之间切换时会自动更新。你可以在 App 结构体本身或任何 SwiftUI 视图中观察这些状态的变化。
scenePhase 的作用 -- 检测 APP 是否在后台
|
11月前
|
小程序
微信小程序和uni.app后台播放
微信小程序和uni.app后台播放
|
Android开发
Android 音乐APP(五)音乐通知栏、后台播放音乐
Android 音乐APP(五)音乐通知栏、后台播放音乐
1065 0
Android 音乐APP(五)音乐通知栏、后台播放音乐
微信支付:app端提示微信签名失败,errCode=-2;后台服务端返回成功
微信支付:app端提示微信签名失败,errCode=-2;后台服务端返回成功
227 0
|
Web App开发 安全 数据安全/隐私保护
app与后台交互之间的几种安全认证机制
1、HTTP简单基本认证方式     这个是早期交互用得比较多的一种方式,主要是使用用户名和密码来交互,由于在每次的交互中,用户名和密码都会暴露给第三方,那么这么做是不可取的,风险十分大,所以这种认证方式并没有流传开来  2、OAuth(OAuth2)     这个就是开放平台的概念,就像你登录第三方网站或者app的时候可以使用qq或者微信登录,那么登录后第三方可以获取你的个人信息,这就是开放授权的概念,理念是通过token来实现。
1118 0
|
3天前
|
编解码 Java Android开发
FFmpeg开发笔记(三十一)使用RTMP Streamer开启APP直播推流
RTMP Streamer是一款开源的安卓直播推流框架,支持RTMP、RTSP和SRT协议,适用于各种直播场景。它支持H264、H265、AV1视频编码和AAC、G711、OPUS音频编码。本文档介绍了如何使用Java版的RTMP Streamer,建议使用小海豚版本的Android Studio (Dolphin)。加载项目时,可添加国内仓库加速依赖下载。RTMP Streamer包含五个模块:app、encoder、rtmp、rtplibrary和rtsp。完成加载后,可以在手机上安装并运行APP,提供多种直播方式。开发者可以从《FFmpeg开发实战:从零基础到短视频上线》获取更多信息。
27 7
FFmpeg开发笔记(三十一)使用RTMP Streamer开启APP直播推流