记录学习
Lifecycle介绍
什么是Lifecycle?
LifeCycle是GoogleApp架构中推荐的一个组件。Lifecycles 包含有关Activity与Fragment生命周期状态的信息,并允许其他对象观察此状态。
Lifecycle组件包括LifecycleOwner、LifecycleObserver。
Lifecycle作用
简单的说就是用来监听Activity与Fragment的生命周期变化,在变化时能及时通知其他组件。
Lifecycle可以有效的避免内存泄漏和解决android生命周期的常见难题。
为什么要引进Lifecycle?
前面说了,Lifecycle能够让开发者构建能感知其他组件(主要指Activity 、Fragment)生命周期的类。在android开发的过程中,我们常常需要让一些操作能够感知Activity/Fragment的生命周期,从而实现在活动状态下允许操作,而在销毁状态下需要自动禁止操作,释放资源,防止内存泄露。
例如大名鼎鼎的图片加载框架 Glide 在 Acticiy/Fragment 处于前台的时候加载图片,而在不可见的状态下停止图片的加载,又例如我们希望 RxJava 的 Disposable 能够在Activity/Fragment 销毁是自动 dispose。Lifecycle 的出现,让开发者们能够轻易地实现上述的功能。
在我们的开发中,我们经常需要知道 activity 的生命周期,从而做一些资源释放或控制逻辑,Glide的做法,就是给activity添加一个 隐形的 fragment,从而感知 activity 的生命周期变化。
但Lifecycles 组件可以让任何一个类都能轻松感觉到 activity 的生命周期,但却不用编写太多逻辑。
场景
在使用mvp写页面时,p中需要感知Activity或Fragment的生命周期,以进行对应的处理。在这种情况下,Activity或Fragment会在各个生命周期的回调中调用p对应的方法,这是比较麻烦的。
自定义View需要对页面生命周期变化进行对应的处理,如动画的开始和结束,页面销毁时释放资源等。这种情况下,同样需要在Activity或Fragment的生命周期回调中调用View的各个方法。
在使用mvp时,p在收到某个通知时需要判断当前页面的生命周期状态,在这种情况下,需要维护一个记录当前生命状态的变量,也是比较麻烦的。
Lifecycle的使用方式
使用方式1:让要感知Activity生命周期的类实现DefaultLifecycleObserver接口
首先让MyPresenter实现DefaultLifecycleObserver接口,并重写7个生命周期方法
public class MyPresenter implements DefaultLifecycleObserver {
@Override
public void onCreate(@NonNull LifecycleOwner owner) {
Log.d("MyPresenter","onCreate");
}
@Override
public void onStart(@NonNull LifecycleOwner owner) {
Log.d("MyPresenter","onStart");
}
@Override
public void onResume(@NonNull LifecycleOwner owner) {
Log.d("MyPresenter","onResume");
}
@Override
public void onPause(@NonNull LifecycleOwner owner) {
Log.d("MyPresenter","onPause");
}
@Override
public void onStop(@NonNull LifecycleOwner owner) {
Log.d("MyPresenter","onStop");
}
@Override
public void onDestroy(@NonNull LifecycleOwner owner) {
Log.d("MyPresenter","onDestroy");
}
}
然后在需要监听的 Activity 中注册:
很简单,一行代码即可
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getLifecycle().addObserver(new MyPresenter());
}
这样Activity的生命周期就已经可以被MyPresenter观察到了
下面是日志打印:
2023-10-29 22:38:14.982 11952-11952 MyPresenter com.wang.test D onCreate
2023-10-29 22:38:14.985 11952-11952 MyPresenter com.wang.test D onStart
2023-10-29 22:38:14.986 11952-11952 MyPresenter com.wang.test D onResume
2023-10-29 22:38:16.297 11952-11952 MyPresenter com.wang.test D onPause
2023-10-29 22:38:16.887 11952-11952 MyPresenter com.wang.test D onStop
2023-10-29 22:38:16.889 11952-11952 MyPresenter com.wang.test D onDestroy
使用方式1:让要感知Activity生命周期的类实现LifecycleEventObserver接口
注意:(可以接收任何生命周期更改并将其调度给接收方的类。如果一个类同时实现了这个接口和 DefaultLifecycleObserver,那么首先会调用 DefaultLifecycleObserver 的方法,然后调用 onStateChanged
首先让MyObserver实现DefaultLifecycleObserver接口
public class MyObserver implements LifecycleEventObserver {
@Override
public void onStateChanged(@NonNull LifecycleOwner source, @NonNull
switch (event){
case ON_CREATE:
Log.d("MyObserver","ON_CREATE") ;
break;
case ON_START:
Log.d("MyObserver","ON_START") ;
break;
case ON_RESUME:
Log.d("MyObserver","ON_RESUME") ;
break;
case ON_PAUSE:
Log.d("MyObserver","ON_PAUSE") ;
break;
case ON_STOP:
Log.d("MyObserver","ON_STOP") ;
break;
case ON_DESTROY:
Log.d("MyObserver","ON_DESTROY") ;
break;
}
然后也是在Activity里注册即可,下面是日志打印
2023-10-29 22:46:21.088 12099-12099 MyObserver com.wang.test D ON_CREATE
2023-10-29 22:46:21.097 12099-12099 MyObserver com.wang.test D ON_START
2023-10-29 22:46:21.099 12099-12099 MyObserver com.wang.test D ON_RESUME
2023-10-29 22:47:58.836 12099-12099 MyObserver com.wang.test D ON_PAUSE
2023-10-29 22:47:59.987 12099-12099 MyObserver com.wang.test D ON_STOP
2023-10-29 22:47:59.989 12099-12099 MyObserver com.wang.test D ON_DESTROY