什么是生命周期观察器以及如何正确使用它?

Naz*_*kiy 4 java android mvvm android-lifecycle android-livedata

我已经阅读了有关Android中新的架构组件的信息。因此,我想问什么是生命周期观察者,为什么我们需要它们?在什么情况下有用?感谢您的回答!

ole*_*234 22

@OnLifecycleEvent被弃用,因此许多曾经在这里有用的答案不再有帮助。如果您当前尚未使用 Java 8,则需要build.gradle先更新。我们现在可以利用DefaultLifecycleObserveror LifecycleEventObserver。请参阅下面的示例。

首先,您可以使用以下方法ProcessLifecycleOwner获取应用程序的生命周期:

ProcessLifecycleOwner.get().getLifecycle()
Run Code Online (Sandbox Code Playgroud)

DefaultLifecycleObserver:

lifecycle.addObserver(object: DefaultLifecycleObserver {
    override fun onResume(owner: LifecycleOwner) {
        super.onResume(owner)
        TODO()
    }
    override fun onPause(owner: LifecycleOwner) {
        TODO()
        super.onPause(owner)
    }
})
Run Code Online (Sandbox Code Playgroud)

LifecycleEventObserver:

lifecycle.addObserver(object: LifecycleEventObserver {
    override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
        when (event) {
            Lifecycle.Event.ON_RESUME -> TODO()
            Lifecycle.Event.ON_PAUSE -> TODO()
            else -> { }
        }
    }
})
Run Code Online (Sandbox Code Playgroud)

如何更新到 Java 8 以及OnLifecycleEvent不推荐使用原因的解释:/sf/answers/4926895501/


Alo*_*pta 9

您可以将ProcessLifecycleOwner用于应用程序生命周期事件。您可以在应用程序类中实现Lifecycler Observer

public class MyApplication extends MultiDexApplication implements LifecycleObserver

@Override
public void onCreate() {
    super.onCreate();

    ProcessLifecycleOwner.get().getLifecycle().addObserver(this);

}
Run Code Online (Sandbox Code Playgroud)

//添加生命周期方法以查看应用程序背景和前景事件

@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public void appInResumeState() {
    Toast.makeText(this,"In Foreground",Toast.LENGTH_LONG).show();
}

@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
public void appInPauseState() {
    Toast.makeText(this,"In Background",Toast.LENGTH_LONG).show();
}
Run Code Online (Sandbox Code Playgroud)

//添加build.gradle文件

implementation 'android.arch.lifecycle:extensions:1.1.1'
Run Code Online (Sandbox Code Playgroud)

//也在活动或片段中

使用还可以通过创建实现生命周期观察器的不同组件,然后将活动的生命周期传递给这些组件,来降低代码的复杂性。这样,您可以将巨大的复杂性拆分为不同的组件。

class MainActivity : AppCompatActivity() ,LifecycleObserver{

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        ReduceComplexComponent().registerLifecycle(lifecycle)

    }
Run Code Online (Sandbox Code Playgroud)

}

class ReduceComplexComponent : LifecycleObserver{

    registerLifecycle(lifecycle : Lifecycle){
       lifecycle.addObserver(this)
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    fun resume() {
       Log.d("OnResume","ON_RESUME")
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    fun pause() {
       Log.d("onPause","ON_PAUSE")
    }
}
Run Code Online (Sandbox Code Playgroud)

这样,您可以在单独的组件中监听活动或片段生命周期事件。

我们还可以在Activity中手动获取生命周期实例的当前状态,并可以使用其getCurrentState()进行操作

State还具有isAtLeast()方法,可用于与当前生命周期状态进行比较

  • `@OnLifecycleEvent` 已弃用。https://developer.android.com/jetpack/androidx/releases/lifecycle#2.4.0-beta01 (7认同)
  • 如果有人正在寻找 Kotlin 解决方案来观察应用程序生命周期事件,可以查看此链接。https://handyopinion.com/easiest-way-to-observe-application-lifecycle-events-in-kotlin-android/ (2认同)
  • 当应用程序被销毁时,使用事件 Lifecycle.Event.ON_STOP 注册的方法是否会被调用?在我使用生命周期观察器的应用程序类中,使用 ON_START 和 ON_STOP 事件检测应用程序前台和应用程序后台。我怀疑当应用程序被销毁时 ON_STOP 事件没有被触发。检测应用程序前台和后台逻辑工作正常。我是否需要注册 ON_DESTROY 事件才能在应用程序被销毁时获取回调? (2认同)
  • 现在你不需要在主线程上调用 ProcessLifecycleOwner.get().getLifecycle().addObserver(this); 吗? (2认同)

Re'*_*'em 6

可能有点晚了,但生命周期的另一个很好的用例(除了明显的 ViewModel 东西)是让应用程序的许多组件在相关活动被破坏时自行取消注册,或者干脆退出屏幕。

\n\n

例如,我有一个创建对话框的静态工厂,并且使用生命周期我可以关闭这些对话框,而不会用诸如和之类的旧内容扰乱主机活动Dialog mDialog = ...void onPause(){ ... if (mDialog !null && mDialog.isShowing()) mDialog.cancel() }

\n\n

一些代码:

\n\n

DialogUtils.java:

\n\n
public static void showConfirmDialog(Lifecycle lifecycle, String title, String msg, Runnable okRunnable) {\n    AlertDialog dialog = AlertDialog.Builder(mAppContext)\n    /* configuration stuff ... */\n        .build();\n\n    dialog.show();\n\n    lifecycle.addObserver(new LifecycleObserver() {\n          @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)\n          public void cancelDialog() {\n            if (dialog.isShowing()) { // if not already dismissed by main-button tap \n              dialog.cancel();\n            }\n          }\n    });\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我的活动.java:

\n\n
public class MyActivity extends AppCompatActivity {\n\n    /* stuff... onCreate()... other stuff... */\n\n    private void confirmDeleteUser(User user){\n        DialogUtils.showConfirmDialog(\n            MyActivity.this.getLifecycle(), // all activities & fragment have lifecycles\n            "Confirm Delete",\n            "Action cannot be undone. Sure to continue?",\n            new Runnable() { /* stuff... */ }\n        );\n        // Voil\xc3\xa0! \n        // activity no needs to store reference to the dialog and cancel manually on pause\n        // it\'s a fire-and-forget action\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

  • 我不明白你的回答。AlertDialogs 在配置更改时被系统销毁。为什么要手动取消它们? (2认同)
  • bcs 即使它们正在被销毁,您的活动在进入 onDestory(...) 之前会收到异常,因此您可能无法运行您的实现 (2认同)