Google推荐架构之LifeCycle组件

LifeCycle是Google最新App架构中推荐的一个组件

作用

简单的说就是用来监听Activity与Fragment的生命周期变化。
  • 生命周期拥有者生命周期的观察者之间快速方便的建立一种联系。在生命周期拥有者的生命周期变化时,观察者会收到对应的通知。
  • 可以方便的判断当前生命周期拥有者所处在的生命周期状态。

场景

  • 在使用mvp写页面时,p中需要感知Activity或Fragment的生命周期,以进行对应的处理。在这种情况下,Activity或Fragment会在各个生命周期的回调中调用p对应的方法,这是比较麻烦的。
  • 自定义View需要对页面生命周期变化进行对应的处理,如动画的开始和结束,页面销毁时释放资源等。这种情况下,同样需要在Activity或Fragment的生命周期回调中调用View的各个方法。
  • 在使用mvp时,p在收到某个通知时需要判断当前页面的生命周期状态,在这种情况下,需要维护一个记录当前生命状态的变量,也是比较麻烦的。

LifeCycle的两个角色

  • LifeCycleOwner 生命周期拥有者,即Activity与Fragment(也可自定义,但局限性大)
  • LifeCycleObserver 生命周期观察者,可以是任何类,常见的有mvp的p,自定义View等

如何使用

LifeCycleOwner

AppCompatActivity与V4中的Fragment都已默认实现了LifeCyclerOwner接口,所以可以直接使用。LifeCyclerOwner接口很简单,如下:

1
2
3
4
public interface LifecycleOwner {
Lifecycle getLifecycle();
}
LifeCycleObserver

生命周期观察者需要实现LifeCycleObserver接口,这个接口没有任何方法。那他如何对生命周期进行观察呢?答案是依赖注解–>OnLifecycleEvent

1
2
3
4
5
6
7
8
9
10
/**
* Marks a class as a LifecycleObserver. It does not have any methods, instead, relies on
* {@link OnLifecycleEvent} annotated methods.
* <p>
* @see Lifecycle Lifecycle - for samples and usage patterns.
*/
@SuppressWarnings("WeakerAccess")
public interface LifecycleObserver {
}

这个修饰方法的注解定义了一个Lifecycle.Event类型的值

1
2
3
4
5
6
@SuppressWarnings("unused")
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface OnLifecycleEvent {
Lifecycle.Event value();
}

最终LifeCycleObserver的实现类如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class MyLifeCycleObserver implements LifecycleObserver{
private static final String TAG="MyLifeCycleObserver";
public MyLifeCycleObserver() {
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public void onActivityResume(){
Log.d(TAG,"onActivityResume");
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
public void onActivityPause(){
Log.d(TAG,"onActivityPause");
}
}

这里LifeCycleObserver对LifeCycleOwner的ON_RESUME和ON_PAUSE方法进行了观察,在LifeCycleOwner的生命周期产生变化的时候会调用LifeCycleObserver中注解修饰的方法。

两个角色定义好后,需要让他们之间建立联系

很简单,一行代码即可。上面说过了AppCompatActivity已经实现了LifeCycleOwner接口。

1
2
3
4
5
6
7
8
9
10
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getLifecycle().addObserver(new MyLifeCycleObserver());
}
}

运行过后,在Activity OnResume和OnPause的时候,就会Log出对应的信息。

判断当前处在的生命周期

Lifecycle允许其他的对象判断当前的生命周期状态。方法如下

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

这个方法不是用来判断是否处于某个状态,而且用来判断是否到达了某个状态。

自定义LifecycleOwner

上面说了,AppCompatActivity与V4中的Fragment都已默认实现了LifeCyclerOwner接口,基本上可以应对所有的情况了,并且,自定义LifecycleOwner方法也比较简单,就直接贴代码了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class MyActivity extends Activity implements LifecycleOwner {
private LifecycleRegistry mLifecycleRegistry;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mLifecycleRegistry = new LifecycleRegistry(this);
mLifecycleRegistry.markState(Lifecycle.State.CREATED);
}
@Override
public void onStart() {
super.onStart();
mLifecycleRegistry.markState(Lifecycle.State.STARTED);
}
@NonNull
@Override
public Lifecycle getLifecycle() {
return mLifecycleRegistry;
}
}

其实就是两步走,先注册,然后在各个生命周期内做标记。

总结

LifeCycle组件实际上并没有带来什么新的功能,他通过观察者模式+注解来让我们更方便的监听Activity和Fragment的生命周期变化。