Background and Foreground events with Android Architecture Components
Lately on 47 Degrees, I had the need to detect when an Android application goes to background or foreground to start or stop some services.
The usual way to do this is with an activity counter, incrementing or decrementing when an Activity starts or stops and reacting when the counter reaches some values.
Fortunately, you can use Android Architecture Components to get same behavior using only a few lines.
I am going to show you how to use Architecture Components to detect background and foreground events but I am not going to explain detailedly how it works, you can check the documentation if you need more information.
Show me the code
If you are still not using Architecture Components then you have to add the dependencies to your build.gradle file before using it:
kapt "android.arch.lifecycle:compiler:1.1.1"
implementation "android.arch.lifecycle:extensions:1.1.1"
Now it’s time to create your lifecycle aware component. You just need to implement the LifecycleObserver
interface and add annotations to those methods where you want to monitor the lifecycle statuses. Example:
class ApplicationObserver : LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun onForeground() {
// App goes to foreground
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
fun onBackground() {
// App goes to background
}
}
You need to subscribe this observer to a Lifecycle
from a LifecycleOwner
in order to start to receive lifecycle events. There are several available lifecycle owners ready to use for Activity
, Fragment
, etc. but, in this case, you only interested in one called ProcessLifecycleOwner
.
The easiest way to add your ApplicationObserver
to ProcessLifecycleOwner
is using your custom Android Application class:
class MyApplication : Application() {
override fun onCreate() {
super.onCreate() ProcessLifecycleOwner.get()
.lifecycle
.addObserver(ApplicationObserver())
}
}
That’s all. You don’t need count activities anymore, just a couple of lines! 🎉
Spoiler:
ProcessLifecycleOwner
counts activities internally
If you want to dig deeper, you can check ProcessLifecycleOwner documentation to know more details about when the events are being triggered by this lifecycle
This paragraph from the docs is specially important:
You can consider this LifecycleOwner as the composite of all of your Activities, except that
ON_CREATE
will be dispatched once andON_DESTROY
will never be dispatched. Other lifecycle events will be dispatched with following rules: ProcessLifecycleOwner will dispatchON_START
,ON_RESUME
events, as a first activity moves through these events.ON_PAUSE
,ON_STOP
, events will be dispatched with a delay after a last activity passed through them.