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



我读过关于Android中新的架构组件的文章。所以,我想问什么是生命周期观察器,为什么我们需要它们?在什么情况下有用? 感谢您的回答!

您可以使用 ProcessLifecycleOwner 获取应用程序的生命周期,并添加一个类作为这些事件的观察者。您可以在应用程序类中实现生命周期观察器:

public class MyApplication extends MultiDexApplication implements LifecycleObserver
@Override
public void onCreate() {
super.onCreate();
ProcessLifecycleOwner.get().getLifecycle().addObserver(this);
}

添加以下生命周期方法以观察应用何时进入后台或前台:

@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();
}

在 build.gradle 文件中添加以下内容

implementation 'android.arch.lifecycle:extensions:1.1.1'

同样在活动或片段中

您还可以使用它们来降低代码的复杂性,方法是创建实现 Lifecycle Observer 的不同组件,然后将活动的生命周期传递给这些组件。通过这种方式,您可以将巨大的复杂性拆分为不同的组件。

class MainActivity : AppCompatActivity(), LifecycleObserver {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
ReduceComplexComponent().registerLifecycle(lifecycle)
}

}

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")
}
}

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

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

状态还有一个isAtMinimum((方法,我们可以用来与当前生命周期状态进行比较

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

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

ProcessLifecycleOwner.get().getLifecycle()

DefaultLifecycleObserver

lifecycle.addObserver(object: DefaultLifecycleObserver {
override fun onResume(owner: LifecycleOwner) {
super.onResume(owner)
TODO()
}
override fun onPause(owner: LifecycleOwner) {
TODO()
super.onPause(owner)
}
})

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 -> { }
}
}
})

如何更新到 Java 8 以及OnLifecycleEvent为何不推荐使用的说明:https://stackoverflow.com/a/70384221/3422470

可能有点晚了,但生命周期的另一个不错的用例(除了明显的 ViewModel 内容(是让应用程序的许多组件在相关活动被破坏或干脆退出屏幕时自行注销。

例如,我有一个创建对话框的静态工厂,使用生命周期,我可以关闭对话框,而不会用旧的东西(如Dialog mDialog = ...void onPause(){ ... if (mDialog !null && mDialog.isShowing()) mDialog.cancel() }

一些代码:

DialogUtils.java:

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

我的活动.java:

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

lifecycle-extensionsAPI 已被弃用。

生命周期扩展工件弃用:使用上述弃ViewModelProviders.of(),此版本标志着弃用lifecycle-extensions中的最后一个 API,此工件现在应该是 被视为已完全弃用。我们强烈建议根据 在您需要的特定生命周期工件上(例如lifecycle-service如果您使用的是LifecycleServicelifecycle-process如果您使用的是ProcessLifecycleOwner( 而不是lifecycle-extensions因为将来不会有2.3.0发布lifecycle-extensions.

如果要继续使用ProcessLifecycleOwner, 建议添加此依赖项:

implementation "androidx.lifecycle:lifecycle-process:2.2.0"

编号:
https://developer.android.com/jetpack/androidx/releases/lifecycle#version_220_3

https://androidx.tech/artifacts/lifecycle/lifecycle-extensions/

https://developer.android.com/reference/androidx/lifecycle/ProcessLifecycleOwner

LifeCycleObserver是Google发布的Android Jetpack LifeCycle Architecture组件的一部分,它是一个界面,允许您观察感知生命周期的可观察组件,通常是LifeCycleOwner(活动/片段(,以便与与此组件关联的生命周期事件和状态进行交互;因此您可以监视前台和后台生命周期事件。

以下是一些典型用法的有用链接

  • https://developer.android.com/reference/androidx/lifecycle/Lifecycle
  • https://medium.com/@MinaSamy/android-architecture-components-lifecycle-433ace1ec05d
  • https://riggaroo.co.za/android-architecture-components-looking-lifecycles-part-3/
  • https://proandroiddev.com/make-your-custom-view-lifecycle-aware-its-a-piece-of-cake-90b7c0498686

使用它们是为了减少由于应用Lifecycle events而导致的组件回调和清理。例如,您有一个从某处Thread运行的Handler/Runnable,您需要一些回调/接口才能在调用onStop()时停止和删除listener;因此,使用新的"Jetpack 生命周期架构组件",您可以使您的组件/类"生命周期感知",从而从使用它的活动/片段轻松控制它!

更多信息如上所述: https://developer.android.com/topic/libraries/architecture/lifecycle

最新更新