判断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退到后台。


相关文章
|
6月前
|
架构师 Java
jvm性能调优实战 - 35电商APP后台系统如何对Full GC进行深度优化
jvm性能调优实战 - 35电商APP后台系统如何对Full GC进行深度优化
98 0
|
6月前
|
XML Java Android开发
Android Studio App开发之服务Service的讲解及实战(包括启动和停止,绑定与解绑,推送服务到前台实现音乐播放器,附源码)
Android Studio App开发之服务Service的讲解及实战(包括启动和停止,绑定与解绑,推送服务到前台实现音乐播放器,附源码)
868 0
|
3月前
|
小程序 API PHP
零成本搭建个人 APP 和小程序后台
虽然网上也有很多人介绍这俩平台的玩法,但都是 2024 年以前的文章,有些平台最新的修改,和自己踩到的坑而别人没提到的细节,我还是想记录一下。
63 9
|
4月前
|
监控 Android开发 开发者
Android经典面试题之实战经验分享:如何简单实现App的前后台监听判断
本文介绍在Android中判断应用前后台状态的两种方法:`ActivityLifecycleCallbacks`和`ProcessLifecycleOwner`。前者提供精细控制,适用于需针对每个Activity处理的场景;后者简化前后台检测,适用于多数应用。两者各有优劣:`ActivityLifecycleCallbacks`更精确但复杂度高;`ProcessLifecycleOwner`更简便但可能在极端场景下略有差异。根据应用需求选择合适方法。
41 2
|
5月前
|
存储 安全 前端开发
APP管理后台OSS技术改造
旨在记录之前使用的上传文件是放在服务器的现在改成了oss更加高效管理
|
6月前
|
定位技术 开发工具 iOS开发
ios9定位服务的app进入后台三分钟收不到经纬度,应用被挂起问题及解决方案
ios9定位服务的app进入后台三分钟收不到经纬度,应用被挂起问题及解决方案
59 0
|
6月前
|
前端开发 Android开发 iOS开发
应用研发平台EMAS使用 aliyun-react-native-push 库接入推送和辅助通道,推送都可以收到,但是在App切到后台或者杀掉进程之后就收不到推送了,是需要配置什么吗?
【2月更文挑战第31天】应用研发平台EMAS使用 aliyun-react-native-push 库接入推送和辅助通道,推送都可以收到,但是在App切到后台或者杀掉进程之后就收不到推送了,是需要配置什么吗?
119 2
|
iOS开发
scenePhase 的作用 -- 检测 APP 是否在后台
SwiftUI 提供了一个名为 `scenePhase` 的 环境变量,它在应用程序在前台、后台和非活动状态之间切换时会自动更新。你可以在 App 结构体本身或任何 SwiftUI 视图中观察这些状态的变化。
scenePhase 的作用 -- 检测 APP 是否在后台
|
小程序
微信小程序和uni.app后台播放
微信小程序和uni.app后台播放
|
1月前
|
JSON 小程序 JavaScript
uni-app开发微信小程序的报错[渲染层错误]排查及解决
uni-app开发微信小程序的报错[渲染层错误]排查及解决
507 7

热门文章

最新文章

下一篇
无影云桌面