官方文档
生命周期感知组件[Lifecycle-aware components]执行操作[perform actions]以响应另一个组件(例如活动和片段)的生命周期状态的更改。 这些组件可帮助您生成更易于组织[better-organized]且通常更轻量级[lighter-weight]的代码,并且这些代码更易于维护。
一种常见的模式是,在活动和片段的生命周期方法中实现依赖组件的操作[to implement the actions of the dependent components in the lifecycle methods of activities and fragments]。 但是,这种模式导致代码组织不良[poor organization]以及错误的增加[to the proliferation of errors]。 通过使用生命周期感知组件,您可以将依赖组件的代码移出生命周期方法、并移入组件本身。
android.arch.lifecycle 包提供了类和接口,使您可以构建生命周期感知组件,这些组件可以根据活动或片段的当前生命周期状态自动调整其行为[automatically adjust their behavior]。
Android框架中定义的大多数应用程序组件都附加了生命周期。生命周期由操作系统或流程中运行的框架代码所管理。它们是Android工作原理的核心,您的应用程序必须尊重它们。 不这样做可能会触发内存泄漏甚至应用程序崩溃。
想象一下,我们有一个活动,在屏幕上显示设备位置。 常见的实现可能如下所示:
class MyLocationListener {
public MyLocationListener(Context context, Callback callback) {...}
void start() {...} // connect to system location service
void stop() {...} // disconnect from system location service
}
5
5
1
class MyLocationListener {
2
public MyLocationListener(Context context, Callback callback) {...}
3
void start() {...} // connect to system location service
4
void stop() {...} // disconnect from system location service
5
}
class MyActivity extends AppCompatActivity {
private MyLocationListener myLocationListener;
@Override
public void onCreate(...) {
...
myLocationListener = new MyLocationListener(this, (location) -> {...});
}
@Override
public void onStart() {
super.onStart();
myLocationListener.start(); // manage other components that need to respond to the activity lifecycle
}
@Override
public void onStop() {
super.onStop();
myLocationListener.stop(); // manage other components that need to respond to the activity lifecycle
}
}
21
21
1
class MyActivity extends AppCompatActivity {
2
private MyLocationListener myLocationListener;
3
4
5
public void onCreate(...) {
6
...
7
myLocationListener = new MyLocationListener(this, (location) -> {...});
8
}
9
10
11
public void onStart() {
12
super.onStart();
13
myLocationListener.start(); // manage other components that need to respond to the activity lifecycle
14
}
15
16
17
public void onStop() {
18
super.onStop();
19
myLocationListener.stop(); // manage other components that need to respond to the activity lifecycle
20
}
21
}
即使这个示例看起来很好,但在真实的应用程序中,最终会有太多的调用来管理UI和其他组件以响应生命周期的当前状态[you end up having too many calls that manage the UI and other components in response to the current state of the lifecycle]。管理多个组件会在生命周期方法中放置大量代码,例如onStart()和onStop(),这使得它们难以维护。
此外[Moreover],无法保证[guarantee]组件在活动或片段停止之前启动。如果我们需要执行长时间运行的操作,尤其是 onStart() 中的某些配置检查,则尤其如此。 这可能会导致 onStop() 方法在 onStart() 之前完成的竞争条件[race condition],从而使组件保持活动的时间超过了其所需的时间[keeping the component alive longer than it's needed]。
@Override
public void onStart() {
super.onStart();
Util.checkUserStatus(result -> { //配置检查
if (result) {
myLocationListener.start(); // what if this callback is invoked AFTER activity is stopped?
}
});
}
@Override
public void onStop() {
super.onStop();
myLocationListener.stop();
}
15
15
1
2
public void onStart() {
3
super.onStart();
4
Util.checkUserStatus(result -> { //配置检查
5
if (result) {
6
myLocationListener.start(); // what if this callback is invoked AFTER activity is stopped?
7
}
8
});
9
}
10
11
12
public void onStop() {
13
super.onStop();
14
myLocationListener.stop();
15
}
android.arch.lifecycle 包提供了类和接口,可帮助您以弹性和隔离的方式[resilient and isolated way]解决这些问题。
Lifecycle
package android.arch.lifecycle;
public abstract class Lifecycle
2
2
1
package android.arch.lifecycle;
2
public abstract class Lifecycle
Lifecycle 是一个类,它包含有关组件
(如活动或片段)生命周期状态的信息,并允许其他对象观察此状态。
Lifecycle 使用两个主要枚举来跟踪其关联组件的生命周期状态:
- Event:由框架和Lifecycle类所调度的生命周期事件。这些事件映射到活动和片段中的回调事件。
- State:由Lifecycle对象所跟踪[tracked]的组件的当前状态。
将状态视为图形的节点[nodes],将事件视为这些节点之间的边缘[edges]。
public boolean isAtLeast(@NonNull State state) {
return compareTo(state) >= 0; //return true if this State is greater or equal to the given state
}
3
3
1
public boolean isAtLeast( State state) {
2
return compareTo(state) >= 0; //return true if this State is greater or equal to the given state
3
}
类可以通过向其方法添加注解来监视组件的生命周期状态。然后,您可以通过调用 Lifecycle 类的 addObserver() 方法并传递观察者的实例来添加观察者:
myLifecycleOwner.getLifecycle().addObserver(new MyObserver());
1
1
1
myLifecycleOwner.getLifecycle().addObserver(new MyObserver());
LifecycleOwner 和 LifecycleObserver
LifecycleOwner 是一个单一方法的接口,表示该类具有生命周期。
此接口从各个[
individual
]类(如Fragment和AppCompatActivity)中抽象出生命周期的所有权[
ownership
],并允许编写与其一起使用的组件。
任何自定义应用程序类都可以实现 LifecycleOwner 接口
。
/**
* A class that has an Android lifecycle. These events can be used by custom components to
* handle lifecycle changes without implementing any code inside the Activity or the Fragment.
*/
@SuppressWarnings({"WeakerAccess", "unused"})
public interface LifecycleOwner {
@NonNull
Lifecycle getLifecycle(); //Returns the Lifecycle of the provider.
}
9
9
1
/**
2
* A class that has an Android lifecycle. These events can be used by custom components to
3
* handle lifecycle changes without implementing any code inside the Activity or the Fragment.
4
*/
5
"WeakerAccess", "unused"}) ({
6
public interface LifecycleOwner {
7
8
Lifecycle getLifecycle(); //Returns the Lifecycle of the provider.
9
}
LifecycleObserver 接口是一个标记接口,它没有任何方法,而是依赖于 OnLifecycleEvent 带注解的方法。实现 LifecycleObserver 的组件与实现 LifecycleOwner 的组件无缝协作[work seamlessly],因为 Owner 可以提供生命周期,Observer 可以注册观察。
@SuppressWarnings("WeakerAccess")
public interface LifecycleObserver { }
2
2
1
"WeakerAccess") (
2
public interface LifecycleObserver { }
对于位置跟踪示例,我们可以使 MyLocationListener 类实现 LifecycleObserver,然后在 onCreate() 方法中
使用 activity 的 Lifecycle 初始化它。这允许 MyLocationListener 类自给自足[self-sufficient],这意味着响应生命周期状态变化的逻辑在 MyLocationListener 而不是 activity 中声明。通过让各个组件存储自己的逻辑,使得活动和片段的逻辑更易于管理。
myLocationListener = new MyLocationListener(this, getLifecycle(), location -> {...});
1
1
1
myLocationListener = new MyLocationListener(this, getLifecycle(), location -> {...});
一个常见的用例是,如果 Lifecycle 现在不处于良好状态[a good state],则应避免调用某些回调。 例如,如果在保存活动状态后执行
回调运行片段事务,则会触发崩溃,因此我们永远不会想要调用这种回调。
为了使这种情况下的使用更简洁[To make this use case easy],Lifecycle 类允许其他对象查询当前状态。
if (lifecycle.getCurrentState().isAtLeast(STARTED)) {
// connect if not connected
}
3
3
1
if (lifecycle.getCurrentState().isAtLeast(STARTED)) {
2
// connect if not connected
3
}
通过此实现,我们的 LocationListener 类完全可以识别生命周期。如果我们需要使用来自另一个活动或片段的 LocationListener,我们只需要初始化它。 所有设置和拆卸操作都由类本身管理。
如果库提供了需要使用Android生命周期的类,我们建议您使用生命周期感知组件。您的库客户端可以轻松地集成这些组件,而无需在客户端进行手动生命周期管理。
Support Library 26.1.0 及更高版本中的片段和活动已实现 LifecycleOwner 接口。
Activity 中的使用案例
Activity 需要为 FragmentActivity 或其子类才能使用:
getLifecycle().addObserver(new BaseActivityLifecycleObserver());
1
getLifecycle().addObserver(new BaseActivityLifecycleObserver());
注册后的日志:
Activity【onCreate】
Observer【onCreate】
Activity【onStart】
Observer【onStart】
Activity【onResume】
Observer【onResume】
Observer【onPause】
Activity【onPause】
Observer【onStop】
Activity【onStop】
Observer【onDestroy】
Activity【onDestroy】
13
13
1
Activity【onCreate】
2
Observer【onCreate】
3
Activity【onStart】
4
Observer【onStart】
5
Activity【onResume】
6
Observer【onResume】
7
8
Observer【onPause】
9
Activity【onPause】
10
Observer【onStop】
11
Activity【onStop】
12
Observer【onDestroy】
13
Activity【onDestroy】
监测Activity方式一
public class BaseActivityLifecycleObserver implements GenericLifecycleObserver {
@Override
public void onStateChanged(LifecycleOwner source, Lifecycle.Event event) {
switch (event) {
case ON_CREATE:
Log.i("bqt", "Observer【onCreate】");
break;
case ON_START:
Log.i("bqt", "Observer【onStart】");
break;
case ON_RESUME:
Log.i("bqt", "Observer【onResume】");
break;
case ON_PAUSE:
Log.i("bqt", "Observer【onPause】");
break;
case ON_STOP:
Log.i("bqt", "Observer【onStop】");
break;
case ON_DESTROY:
Log.i("bqt", "Observer【onDestroy】");
break;
default:
break;
}
}
}
28
28
1
public class BaseActivityLifecycleObserver implements GenericLifecycleObserver {
2
3
4
public void onStateChanged(LifecycleOwner source, Lifecycle.Event event) {
5
switch (event) {
6
case ON_CREATE:
7
Log.i("bqt", "Observer【onCreate】");
8
break;
9
case ON_START:
10
Log.i("bqt", "Observer【onStart】");
11
break;
12
case ON_RESUME:
13
Log.i("bqt", "Observer【onResume】");
14
break;
15
case ON_PAUSE:
16
Log.i("bqt", "Observer【onPause】");
17
break;
18
case ON_STOP:
19
Log.i("bqt", "Observer【onStop】");
20
break;
21
case ON_DESTROY:
22
Log.i("bqt", "Observer【onDestroy】");
23
break;
24
default:
25
break;
26
}
27
}
28
}
监测Activity方式二
public class BaseActivityLifecycleObserver implements LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
public void onCreate() {
Log.i("bqt", "Observer【onCreate】");
}
@OnLifecycleEvent(Lifecycle.Event.ON_START)
public void onStart() {
Log.i("bqt", "Observer【onStart】");
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public void onResume() {
Log.i("bqt", "Observer【onResume】");
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
public void onPause() {
Log.i("bqt", "Observer【onPause】");
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
public void onStop() {
Log.i("bqt", "Observer【onStop】");
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void onDestroy() {
Log.i("bqt", "Observer【onDestroy】");
}
@OnLifecycleEvent(Lifecycle.Event.ON_ANY)
public void onAnyStateChanged() {
//Log.i("bqt", "【onAnyStateChanged】");
}
}
36
36
1
public class BaseActivityLifecycleObserver implements LifecycleObserver {
2
(Lifecycle.Event.ON_CREATE)
3
public void onCreate() {
4
Log.i("bqt", "Observer【onCreate】");
5
}
6
7
(Lifecycle.Event.ON_START)
8
public void onStart() {
9
Log.i("bqt", "Observer【onStart】");
10
}
11
12
(Lifecycle.Event.ON_RESUME)
13
public void onResume() {
14
Log.i("bqt", "Observer【onResume】");
15
}
16
17
(Lifecycle.Event.ON_PAUSE)
18
public void onPause() {
19
Log.i("bqt", "Observer【onPause】");
20
}
21
22
(Lifecycle.Event.ON_STOP)
23
public void onStop() {
24
Log.i("bqt", "Observer【onStop】");
25
}
26
27
(Lifecycle.Event.ON_DESTROY)
28
public void onDestroy() {
29
Log.i("bqt", "Observer【onDestroy】");
30
}
31
32
(Lifecycle.Event.ON_ANY)
33
public void onAnyStateChanged() {
34
//Log.i("bqt", "【onAnyStateChanged】");
35
}
36
}
Fragment 中使用案例
使用方式和Activity完全一样:
public class MainFragment extends Fragment {
public MainFragment() {
getLifecycle().addObserver(new BaseActivityLifecycleObserver());
}
}
x
1
public class MainFragment extends Fragment {
2
public MainFragment() {
3
getLifecycle().addObserver(new BaseActivityLifecycleObserver());
4
}
5
}
注册后的日志:
Fragment【onAttach】
Fragment【onCreate】
Observer【onCreate】
Fragment【onViewCreated】
Fragment【onActivityCreated】
Fragment【onStart】
Observer【onStart】
Fragment【onResume】
Observer【onResume】
Observer【onPause】
Fragment【onPause】
Observer【onStop】
Fragment【onStop】
Fragment【onDestroyView】
Observer【onDestroy】
Fragment【onDestroy】
Fragment【onDetach】
x
1
Fragment【onAttach】
2
Fragment【onCreate】
3
Observer【onCreate】
4
Fragment【onViewCreated】
5
Fragment【onActivityCreated】
6
Fragment【onStart】
7
Observer【onStart】
8
Fragment【onResume】
9
Observer【onResume】
10
11
Observer【onPause】
12
Fragment【onPause】
13
Observer【onStop】
14
Fragment【onStop】
15
Fragment【onDestroyView】
16
Observer【onDestroy】
17
Fragment【onDestroy】
18
Fragment【onDetach】
2018-9-9