更优雅的实现app进入前后台的判断

目前在android App中实现判断app进入后台或者回到前台有两种判断方法
方法一:通过.getRunningAppProcesses()获取当前运行列表这个方法
缺点:此方法在android5.0中被标记为deprecated
方法二:通过 registerActivityLifecycleCallbacks的回调方法来获取每个activity的状态,通过判断Activity的生命周期和计数和来判断是否进入后台
缺点:堆栈中有多个activity被启动时,判断不准确,而且不能准确判断app从后台返回到前台的状态

以上两种方法的具体实现代码在大部分博客中都能找到因此不在这里赘述。下面通过lifecycle来实现这一功能。
集成代码如下:

    // ViewModel
    implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.1'
    // LiveData
    implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.4.1'
    // Saved state module for ViewModel
    implementation 'androidx.lifecycle:lifecycle-viewmodel-savedstate:2.4.1'
    // optional - ProcessLifecycleOwner provides a lifecycle for the whole application process
    implementation 'androidx.lifecycle:lifecycle-process:2.4.1'

主要是通过lifecycle-process来实现的
在Application中添加 ProcessLifecycleOwner.get().lifecycle.addObserver(ApplicationObserver())

class AppApplication : MultiDexApplication() {
    override fun onCreate() {
        super.onCreate()
        ProcessLifecycleOwner.get().lifecycle.addObserver(ApplicationObserver())
    }
}

ApplicationObserver的内容如下:

class ApplicationObserver : LifecycleEventObserver {
    override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
        when (event) {
            Lifecycle.Event.ON_CREATE -> Log.d("event", "onCreate")
            Lifecycle.Event.ON_START -> Log.d("event", "onStart")
            Lifecycle.Event.ON_RESUME -> Log.d("event", "onResume")
            Lifecycle.Event.ON_PAUSE -> Log.d("event", "onPause")
            Lifecycle.Event.ON_STOP -> Log.d("event", "onStop")
            Lifecycle.Event.ON_DESTROY -> Log.d("event", "onDestory")
            Lifecycle.Event.ON_ANY->Log.d("event","onAny")
        }
    }


}

打印的log日志如下
在这里插入图片描述
这样就可以和判断Activity的生命周期一样来判断整个app的状态了,唯一不完美的地方就是在整个app被杀死的时候没有调用onDestory方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值