Lifecycle
Lifecycle 是一个类,用于存储有关组件(如 activity 或 fragment)的生命周期状态的信息,并允许其他对象观测此状态。
Lifecycle 使用两种主要枚举跟踪其关联组件的生命周期状态:
public class MyObserver implements DefaultLifecycleObserver { @Override public void onResume(LifecycleOwner owner) { connect() } @Override public void onPause(LifecycleOwner owner) { disconnect() } } myLifecycleOwner.getLifecycle().addObserver(new MyObserver());
LifecycleOwner
LifecycleOwner 是只包含一个方法的接口,指明类具有 Lifecycle。它包含一个方法(即 getLifecycle()),该方法必须由类实现。如果您要尝试管理整个应用进程的生命周期,请参阅 ProcessLifecycleOwner。
此接口从各个类(如 Fragment
和 AppCompatActivity
)抽象化 Lifecycle 的所有权,并允许编写与这些类搭配使用的组件。任何自定义应用类均可实现 LifecycleOwner 接口。
实现 DefaultLifecycleObserver 的组件可与实现 LifecycleOwner 的组件完美配合,因为所有者可以提供生命周期,而观测者可以注册以观测生命周期。
对于位置跟踪示例,我们可以让 MyLocationListener
类实现 DefaultLifecycleObserver,然后在 onCreate()
方法中使用 activity 的 Lifecycle 对其进行初始化。这样,MyLocationListener
类便可以“自给自足”,这意味着,对生命周期状态的变化做出响应的逻辑是在 MyLocationListener
(而不是在 activity)中声明的。让各个组件存储自己的逻辑,您便可以更轻松地管理 activity 和 fragment 逻辑。
class MyActivity extends AppCompatActivity { private MyLocationListener myLocationListener; public void onCreate(...) { myLocationListener = new MyLocationListener(this, getLifecycle(), location -> { // update UI }); Util.checkUserStatus(result -> { if (result) { myLocationListener.enable(); } }); } }
一个常见的用例是,如果 Lifecycle 现在未处于良好的状态,则应避免调用某些回调。例如,如果回调在 activity 状态保存后运行 fragment 事务,就会触发崩溃,因此我们绝不能调用该回调。
为简化此使用场景,Lifecycle 类允许其他对象查询当前状态。
class MyLocationListener implements DefaultLifecycleObserver { private boolean enabled = false; public MyLocationListener(Context context, Lifecycle lifecycle, Callback callback) { ... } @Override public void onStart(LifecycleOwner owner) { if (enabled) { // connect } } public void enable() { enabled = true; if (lifecycle.getCurrentState().isAtLeast(STARTED)) { // connect if not connected } } @Override public void onStop(LifecycleOwner owner) { // disconnect if connected } }