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

        项目需要在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,可对其进行移除等操作


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

你可能感兴趣的:(Android开发,android,kotlin,android,studio)