Android-MVVM之快速上手LifeCycle
什么是LifeCycle?
Lifecycle是Android中引入的主要用来观察和监听Activity、Fragment生命周期的一套观察者机制。
主要用来监听Activity和Fragment生命周期。
那为什么要用LifeCycle?
// 没有用LifeCycle之前是什么效果。
class MyActivity extends AppCompatActivity {
// 自己定义的播放器
private MyVideoPlay myVideoPlay;
// 在activity创建的时候,实例化播放器
public void onCreate() {
myVideoPlay= new MyVideoPlay();
myVideoPlay.create();
}
// 在activity销毁的时候,销毁播放器,防止内存溢出。
public void onDestroy() {
super.onDestroy();
presenter.destory();
}
}
- 没用LifeCycle的时候,在activity中,需要维护自定义组件的生命周期。以防内存溢出。那如果很多activity都用到了这个组件,就会造成代冗余。需要在多个activity中维护相同的组件创建和销毁的代码。
- 是否有组件,可以同步activity的生命周期呢,这样的话,就可以在组件内部自己维护了。
// 使用LifeCycle
// 第一步:实现LifecycleObserver接口
public class MyVideoPlay implements LifecycleObserver {
private static String TAG = "MyVideoPlay";
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
private void onCreate(){
Log.d(TAG,"createVideo");
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void onDestroy() {
Log.i(TAG, "destroyVideo: ");
}
}
// 第二步:实现注册观察者
class MyActivity extends AppCompatActivity {
// 自己定义的播放器
private MyVideoPlay myVideoPlay;
public void onCreate() {
myVideoPlay= new MyVideoPlay();
getLifecycle().addObserver(myVideoPlay);
}
}
LifeCycle的用法
记住两个关键的类:
- LifecycleObserver。 实现LifecycleObserver接口,作为观察者。
- LifecycleOwner。实现LifecycleOwner接口,使用getLifecycle()方法,作为被观察者。(Activity和Fragment中默认实现了)
// 简单的写法
public class MyObserver implements LifecycleObserver {
// 监听Activity和Fragment的resume方法
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public void resume(){
Log.e("tag","resume");
}
// 监听Activity和Fragment的pause方法
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
public void pause(){
Log.e("tag","pause");
}
}
// activity中或者fragment中。
getLifecycle().addObserver(new MyObserver());
// 补充:可以不用定义一个MyObserver类,而通过内置的LifecycleEventObserver来实现
getLifecycle().addObserver(new LifecycleEventObserver() {
@Override
public void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event) {
LogUtil.d(event.name());
Lifecycle.Event.ON_CREATE -> TODO()
Lifecycle.Event.ON_START -> TODO()
Lifecycle.Event.ON_RESUME -> TODO()
Lifecycle.Event.ON_PAUSE -> TODO()
Lifecycle.Event.ON_STOP -> TODO()
Lifecycle.Event.ON_DESTROY -> TODO()
Lifecycle.Event.ON_ANY -> TODO()
}
});