JetPack之lifecycles

一般写组件的时候,例如一个获取位置的小组件,我们会这么写。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class MyActivity extends AppCompatActivity {
private MyLocationListener myLocationListener; public void onCreate(...) {
myLocationListener = new MyLocationListener(this, location -> {
// update UI
});
}
@Override
public void onStart() {
super.onStart();
Util.checkUserStatus(result -> {
// what if this callback is invoked AFTER activity is stopped?
if (result) {
myLocationListener.start();
}
});
}
@Override
public void onStop() {
super.onStop();
myLocationListener.stop();
}
}

我们会在onStartonResume的时候注入监听,在onPauseonDestory的时候移除监听。如果我们有很多这样的小组件,维护起来很是麻烦。而且如果要在
onStart的时候做配置回调,那么有可能onStoponStart会提前结束。这样就更麻烦了。

Lifecycle

Lifecycle是一个持有其他组件(例如activityfragment)的生命周期信息状态的一个类,它允许其他对象观察这个状态。

它有两个主要的成员和生命周期状态有联系。

  • Event。这个生命周期事件从frameworkLifecycle进行派发。这些事件对应activityfragment中的生命周期回调。

  • State。生命周期对象组件的当前状态。

一个类可以通过向其方法添加注解来监视组件的生命周期状态。然后,通过调用Lifecycle类的addObserver()方法来添加一个观察者。下面是示例代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
public class MyObserver implements LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public void connectListener() {
...
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
public void disconnectListener() {
...
}
}
myLifecycleOwner.getLifecycle().addObserver(new MyObserver());

在上面的示例中,myLifecycleOwner对象实现了LifecycleOwner接口。

LifecycleOwner

`Lifecycle``可以查看当前对象的生命周期。

1
2
3
if (lifecycle.getCurrentState().isAtLeast(STARTED)) {
// do something
}

FragmentActivitieSupport Library26.1.0之后就已经实现了LifecycleOwner接口。