目前在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方法。