ProcessLifecycleOwner绑定的LifecycleObserver.onCreate未被调用问题咨询
问题
我们有一个在Application创建时执行的任务,正尝试将代码从Application对象的onCreate方法迁移到生命周期感知类中。在Application.onCreate()中,我们将ApplicationLifecycleAwareTaskRunner(一个LifecycleObserver)添加到ProcessLifecycleOwner的生命周期中,但其onCreate(owner: LifecycleOwner)方法从未被调用,不过onStart(..)和onStop()方法能按预期触发。
请问这是LifecycleObserver无法监听Application.onCreate()事件的已知限制,还是我们存在操作疏漏?
使用依赖:androidx.lifecycle:lifecycle-runtime-ktx:2.4.1
Application类代码:
class MyApplication : Application() { override fun onCreate() { super.onCreate() // DI and other init ProcessLifecycleOwner.get().lifecycle.addObserver(ApplicationLifecycleAwareTaskRunner(..)) } }
任务执行类代码:
class ApplicationLifecycleAwareTaskRunner( private val appCoroutineScope: CoroutineScope, private val myTask: MyTask ) : DefaultLifecycleObserver { // This is never called :( override fun onCreate(owner: LifecycleOwner) { appCoroutineScope.launch { myTask.invoke() } } ... }
解答
- 这是ProcessLifecycleOwner的设计限制,并非操作疏漏。
- ProcessLifecycleOwner的生命周期回调仅对应应用的前台/后台状态变化:从应用进入前台触发
onStart,退到后台触发onStop,它并不关联Application的onCreate事件。ProcessLifecycleOwner的初始状态为INITIALIZED,只有当应用首次启动进入前台时才会进入STARTED状态,因此onCreate回调不会被触发。 - 如果想在Application创建时机通过生命周期感知类执行任务,可以采用以下方案:
- 让任务类实现
Application.ActivityLifecycleCallbacks,在onApplicationCreated回调中执行任务; - 在
MyApplication.onCreate()中直接调用任务类的初始化方法; - 使用
LifecycleRegistry手动管理自定义生命周期,在Application.onCreate()中主动触发onCreate事件。
- 让任务类实现
自定义生命周期示例:
class MyApplication : Application() { private val appLifecycleRegistry = LifecycleRegistry(this) override fun onCreate() { super.onCreate() val taskRunner = ApplicationLifecycleAwareTaskRunner(...) appLifecycleRegistry.addObserver(taskRunner) appLifecycleRegistry.markState(Lifecycle.State.CREATED) // 若后续需要触发STARTED等状态,可在合适时机调用markState更新 } }
内容的提问来源于stack exchange,提问作者scottyab
相关产品推荐
相关产品推荐

