Android Architecture Components是google官方提供的一套架构组件,用于设计构建更加稳健,可测试和易维护的应用,在Android Architecture Components中包括如下几个组件:
-
LifeCycle
:是一个用于定义Android组件生命周期的对象; -
LifeCycleOwner
:拥有生命周期的组件所实现的接口; -
LifeCycleObserver
:订阅组件生命周期变化的类所实现的接口; -
ViewModal
:旨在以一种具有生命周期的数据存储方式来管理界面相关的数据,在ViewModal
中存储的数据在屏幕旋转过程中并不会发生改变; -
LiveData
:是一个可观察的数据持有者,当数据变化时通知观察者,同时也可以观察组件生命周期变化; -
Room
:数据库操作的框架;
LifeCycle简介
关于LifeCycle,官网的说明如下:
Defines an object that has an Android Lifecycle. Fragment and FragmentActivity classes implement LifecycleOwner interface which has the getLifecycle method to access the Lifecycle. You can also implement LifecycleOwner in your own classes.
由此可以看出LifeCycle是用来定义一个具有Android生命周期的类或者对象的接口,支持库中的Fragment和FragmentActivity实现了LifeCycleOwener接口并可以通过getLifeCycle方法获取LifeCycle对象,你也可以在你的类中自己实现LifeCycle接口。
ON_CREATE,ON_START,ON_RESUME事件会在LifeCycleOwner对应的事件结束后回调,ON_PAUSE_ON_STOP<ON_DESTROY会在LifeCycleOwner对应的函数执行之前回调(PS:一定要注意回调顺序,回调顺序能保证你确定LifeCycleOwner当前所处的状态)。
LifeCycleOwner简介
如下图所示
一般情况下,我们认为Activity/Fragment/Service等这些有严格生命周期函数的组件为LifeCycleOwner,而ViewModal,LiveData则可以做为观察者,订阅这些组件的生命周期变化,在生命周期变化时更新UI。
其中在源码中有些生命周期组件都已经实现了LifeCycleOwner接口,并不需要我们自己去实现,例如AppCompactActivity,下面是他的继承关系图:
具体在使用过程中,可查看源码,如果源码内没有实现LifeCycleOwner接口,就需要自己实现了。
自己实现LifeCycleOwner
上面讲到了,系统中的部分组件已经实现了LifeCycleOwner 接口,那对于系统没有实现的,我们应该怎么做呢?(这里以android.app.Fragment为例说明)。
在自己实现LifeCycleOwner过程中,需要LifecycleRegistry类打辅助:
LifeCycleRegistry的官网说明如下:
An implementation of Lifecycle that can handle multiple observers.
It is used by Fragments and Support Library Activities. You can also directly use it if you have a custom LifecycleOwner.
意思是说它是LifeCycle接口的一个实现,其可以处理多个观察者同时监听的情况,通常情况下,是被支持库中的Activity和Fragment使用的,当然当你需要自己实现一个LifeCycleOwner时,也可以直接使用它(引用英文并非为了装13,而是希望大家能够养成阅读官方文档的习惯。)
Ok,那么接下来让我们一起实现吧,一般有如下三步:
- 实现LifeCycleOwner接口
- 初始化LifeCycleRegistry对象并返回
- 注入生命周期状态
实现LifeCycleOwner接口
首先新建一个类,继承自android.app.Fragment 并实现LifeCycleOwner接口
如下所示:
public class LifeCycleFragment extends Fragment implements LifecycleOwner {
@NonNull
@Override
public Lifecycle getLifecycle() {
return null;
}
}
初始化LifeCycleRegistry对象并返回
public class LifeCycleFragment extends Fragment implements LifecycleOwner {
private LifecycleRegistry mLifecycleRegistry;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mLifecycleRegistry = new LifecycleRegistry(this);
}
@NonNull
@Override
public Lifecycle getLifecycle() {
return mLifecycleRegistry;
}
}
注入生命周期状态
public class LifeCycleFragment extends Fragment implements LifecycleOwner {
private LifecycleRegistry mLifecycleRegistry;
public LifeCycleFragment(){
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mLifecycleRegistry = new LifecycleRegistry(this);
mLifecycleRegistry.markState(State.CREATED);
}
@Override
public void onStart() {
super.onStart();
mLifecycleRegistry.markState(State.STARTED);
}
@Override
public void onResume() {
super.onResume();
mLifecycleRegistry.markState(State.RESUMED);
}
@Override
public void onDestroy() {
super.onDestroy();
mLifecycleRegistry.markState(State.DESTROYED);
}
@NonNull
@Override
public Lifecycle getLifecycle() {
return mLifecycleRegistry;
}
}
LifeCycleObserver简介
上面说过LifeCycleObserver是监听组件生命周期变化的接口,关于它的官网说明如下:
Marks a class as a LifecycleObserver. It does not have any methods, instead, relies on {OnLifecycleEvent} annotated methods.
从上可以看出它是一个标记接口,只是用来标记这个类是一个监听生命周期变化的类,并不具有任何函数,而要真正监听生命周期变化,需要依赖于OnLifecycleEvent注解来实现。
编码实现LifeCycleObserver
编写一个LifeCycleObserver大概有两步:
1.根据Java版本实现LifeCycleObserver接口,添加OnLifecycleEvent注解回调
2.绑定Observer到LifeCycleOwner
根据Java版本实现LifeCycleObserver接口,添加OnLifecycleEvent注解回调
对于LifeCycleObserver而言,不同的Java版本实现不同,Java 8可用如下方式实现:
class TestObserver implements DefaultLifecycleObserver {
@Override
public void onCreate(LifecycleOwner owner) {
// your code
}
}
Java 8以下用注解方式实现
class MyLifeCycleObserver implements LifecycleObserver{
private Context context;
private CallBack callBack;
MyLifeCycleObserver(Context context,CallBack callBack){
this.context = context;
this.callBack = callBack;
}
@OnLifecycleEvent(Lifecycle.Event.ON_START)
void start(){
Log.e("LifeCycleObserverDemo","Activity started,do init things");
callBack.start();
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
void stop(){
Log.e("LifeCycleObserverDemo","Activity stoped,do stop things");
callBack.stop();
}
}
上述代码中CallBack为执行完Observer内部事件的回调,内容如下:
interface CallBack{
void start();
void stop();
}
绑定Observer到LifeCycleOwner
使用如下方式绑定LifeCycleObserver到LifeCycleOwner
myLifeCycleObserver = new MyLifeCycleObserver(this, new CallBack() {
@Override
public void start() {
Log.e("LifeCycleObserverDemo","Activity started,do init things end,update ui");
}
@Override
public void stop() {
Log.e("LifeCycleObserverDemo","Activity stoped,do stop things end,update ui");
}
});
getLifecycle().addObserver(myLifeCycleObserver);
在LifeCycleOwner Destory时记得解绑:
@Override
protected void onDestroy() {
super.onDestroy();
getLifecycle().removeObserver(myLifeCycleObserver);
}
根据上文编写Observer绑定到Owner的log输出如下:
[图片上传失败...(image-ad64a9-1512484508738)]
最新文章会更新在我的公众号上,欢迎大家关注
[图片上传失败...(image-abeded-1512484508738)]