项目需要在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退到后台。