【问题标题】:What is lifecycle observer and how to use it correctly?什么是生命周期观察者以及如何正确使用它?
【发布时间】:2019-02-21 11:37:42
【问题描述】:

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

【问题讨论】:

标签: java android mvvm android-lifecycle android-livedata


【解决方案1】:

lifecycle-extensions API 已被弃用。

lifecycle-extensions Artifact Deprecation:使用上述弃用 的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

【讨论】:

    【解决方案2】:

    您可以使用 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() 方法,我们可以使用它来与当前生命周期状态进行比较

    【讨论】:

    • 如果有人正在寻找 Kotlin 解决方案来观察应用程序生命周期事件,可以查看此链接。 handyopinion.com/…
    • 当应用程序被销毁时,注册事件 Lifecycle.Event.ON_STOP 的方法会被调用吗?在我使用生命周期观察器的应用程序类中,使用 ON_START 和 ON_STOP 事件检测应用程序前台和应用程序后台。我怀疑应用程序被销毁时不会触发 ON_STOP 事件。检测应用程序前台和后台逻辑工作正常。当应用程序被销毁时,我是否需要注册 ON_DESTROY 事件以获取回调?
    • 这些天你不必在主线程上调用ProcessLifecycleOwner.get().getLifecycle().addObserver(this); 吗?
    • 又一个弃用的组件?!
    【解决方案3】:

    您使用它们是为了减少由于您的应用程序的Lifecycle events 而导致的回调和组件清理。例如,您有一个 Handler/Runnable 从某个地方的 Thread 运行,并且您需要有一些回调/接口以便在调用 onStop() 时停止和删除 listener;因此使用新的“Jetpack LifeCycle Architecture components”,您可以使您的组件/类“生命周期感知”,从而使用它轻松地从 Activity/Fragment 控制它!

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

    【讨论】:

      【解决方案4】:

      可能有点晚了,但另一个很好的生命周期用例(除了明显的 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();
                  }
                }
          });
      }
      

      MyActivity.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
          }
      }
      

      【讨论】:

      • 我不明白你的回答。 AlertDialogs 会在配置更改时被系统销毁。为什么要手动取消它们?
      • bcs 即使它们被销毁,您的活动也会在到达 onDestory(...) 之前收到异常,因此您可能无法让您的实现运行
      • 我不知道“bcs”是什么意思,但我的活动从未遇到任何异常,我不知道为什么我应该这样做。我这样使用它:stackoverflow.com/a/2115770/2523899
      【解决方案5】:

      LifeCycleObserver 是 Google 发布的 Android Jetpack LifeCycle Architecture 组件的一部分,它是一个接口,允许您观察 LifeCycle 感知的可观察组件,通常是 LifeCycleOwner(Activity/Fragment),以便进行交互与此组件关联的 LifeCycle eventsstates;这样您就可以监控前台和后台 lifeCycle 事件。

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

      【讨论】:

      • Android 架构的东西已被弃用。
      猜你喜欢
      • 2019-04-08
      • 1970-01-01
      • 2023-03-22
      • 2018-07-10
      • 1970-01-01
      • 2017-05-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多