【发布时间】:2019-02-21 11:37:42
【问题描述】:
我已经阅读了有关 Android 中新架构组件的信息。所以,我想问什么是生命周期观察者,我们为什么需要它们?在什么情况下有用? 谢谢你的回答!
【问题讨论】:
标签: java android mvvm android-lifecycle android-livedata
我已经阅读了有关 Android 中新架构组件的信息。所以,我想问什么是生命周期观察者,我们为什么需要它们?在什么情况下有用? 谢谢你的回答!
【问题讨论】:
标签: java android mvvm android-lifecycle android-livedata
lifecycle-extensions API 已被弃用。
lifecycle-extensions Artifact Deprecation:使用上述弃用 的
ViewModelProviders.of(),此版本标志着弃用lifecycle-extensions中的最后一个 API,这个工件现在应该是 被认为已完全弃用。我们强烈建议根据 在您需要的特定生命周期工件上(例如lifecycle-service如果您使用的是LifecycleService和lifecycle-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
【讨论】:
您可以使用 ProcessLifecycleOwner 来获取应用程序的 LifeCycle 并添加一个类作为这些事件的观察者。您可以在应用程序类中实现 LifecycleObserver:
public class MyApplication extends MultiDexApplication implements LifecycleObserver
@Override
public void onCreate() {
super.onCreate();
ProcessLifecycleOwner.get().getLifecycle().addObserver(this);
}
// 添加这些 Lifecycle 方法以观察您的应用何时进入后台或前台:
@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'
//也在活动或片段中
您还可以使用它们来降低代码的复杂性,方法是创建实现 LifecycleObserver 的不同组件,然后将活动的生命周期传递给这些组件。通过这种方式,您可以将巨大的复杂性分解为不同的组件。
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()
State 还有一个 isAtLeast() 方法,我们可以使用它来与当前生命周期状态进行比较
【讨论】:
ProcessLifecycleOwner.get().getLifecycle().addObserver(this); 吗?
@OnLifecycleEvent 已弃用。 developer.android.com/jetpack/androidx/releases/…
您使用它们是为了减少由于您的应用程序的Lifecycle events 而导致的回调和组件清理。例如,您有一个 Handler/Runnable 从某个地方的 Thread 运行,并且您需要有一些回调/接口以便在调用 onStop() 时停止和删除 listener;因此使用新的“Jetpack LifeCycle Architecture components”,您可以使您的组件/类“生命周期感知”,从而使用它轻松地从 Activity/Fragment 控制它!
更多信息如上所述:https://developer.android.com/topic/libraries/architecture/lifecycle
【讨论】:
可能有点晚了,但另一个很好的生命周期用例(除了明显的 ViewModel 东西)是让应用程序的许多组件在相关活动被破坏时取消注册,或者只是在屏幕外。
例如,我有一个创建对话框的静态工厂,并且使用生命周期我可以关闭对话框不会使主机活动混乱像Dialog mDialog = ...和void onPause(){ ... if (mDialog !null && mDialog.isShowing()) mDialog.cancel() }这样的旧东西
一些代码:
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();
}
}
});
}
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
}
}
【讨论】:
LifeCycleObserver 是 Google 发布的 Android Jetpack LifeCycle Architecture 组件的一部分,它是一个接口,允许您观察 LifeCycle 感知的可观察组件,通常是 LifeCycleOwner(Activity/Fragment),以便进行交互与此组件关联的 LifeCycle events 和 states;这样您就可以监控前台和后台 lifeCycle 事件。
以下是一些典型用法的有用链接
【讨论】: