JetPack学习笔记之LifeCyCle(一)
2020-08-05 本文已影响0人
秀儿2020
JetPack学习笔记之LifeCyCle(一)
1、为什么要用LifeCycle,是为了解决什么问题?
普通组件在使用过程中通常需要依赖于系统组件的生命周期,有时候,我们不得不在系统组件的生命周期回调方法中,主动去调用普通组件的方法,或者对其进行控制,因为普通组件无法获知系统组件生命周期事件。
我们希望我们自己定义的组件,不依赖于页面生命周期的“回调方法”,在页面生命周期变化的时候,就可以收到通知,这在组件化和架构设计中显得尤为重要。这就是谷歌提供LiftCycle的初衷。
2、使用LifeCycle解决问题的案例
假设有这样一个常见的需求:在用户打开某个页面时,获取用户当前的地理位置,面对该需求,之前的做法如下:
public class LocationActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_location);
//在页面创建时 初始化定位管理信息
initLocation();
}
@Override
protected void onResume() {
super.onResume();
///在页面显示时 开始定位
startLocation();
}
@Override
protected void onDestroy() {
super.onDestroy();
//在页面销毁时停止定位
stopLocation();
}
}
以上可以看出,在Activity中必须含有定位对象,才可以完成相关的调用,耦合度较高。而且除了定位对象,可能还会包含一些其他的对象,会导致在Activity的生命周期回调方法中添加了太多其他的组件管理,原因仅仅是组件不能感知Activity生命周期的变化。
下面是使用LifeCycle后的做法:
/**
* 项目名称 JetPackPro
* 创建人 xiaojinli
* 创建时间 2020/8/5 10:10 AM
**/
public class MyLocationListener implements LifecycleObserver {
public static final String TAG = "MyLocationListener";
//使用注解,使得在create时调用
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
public void initLocation(){
Log.d(TAG,"initLocation");
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public void startLocation(){
Log.d(TAG,"startLocation");
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void stopLocation(){
Log.d(TAG,"stopLocation");
}
}
Activity类修改为:
public class LocationActivity extends AppCompatActivity {
private static final String TAG = "LocationActivity";
public MyLocationListener myLocationListener;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_location);
//初始化定位对象
myLocationListener = new MyLocationListener();
getLifecycle().addObserver(myLocationListener);
Log.d(TAG,"onCreate");
}
@Override
protected void onResume() {
super.onResume();
Log.d(TAG,"onResume");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG,"onDestroy");
}
}
生命周期监听结果
2020-08-05 10:25:39.571 32500-32500/com.example.jetpackpro D/LocationActivity: onCreate
2020-08-05 10:25:39.571 32500-32500/com.example.jetpackpro D/MyLocationListener: initLocation
2020-08-05 10:25:39.577 32500-32500/com.example.jetpackpro D/LocationActivity: onResume
2020-08-05 10:25:39.577 32500-32500/com.example.jetpackpro D/MyLocationListener: startLocation
2020-08-05 10:25:55.582 32500-32500/com.example.jetpackpro D/MyLocationListener: stopLocation
2020-08-05 10:25:55.582 32500-32500/com.example.jetpackpro D/LocationActivity: onDestroy
可以看出,只需要在Activity中注册定位对象,就可以在定位对象中,接收到Activity生命周期的变化通知。
3、LifeCycle原理
本质是观察者模式,Activity作为被观察者,普通组件作为观察者。
查看源码可以发现,Activity中实现了LifecycleOwner接口,该接口中只有一个方法,即getLifecycle()方法。
public class ComponentActivity extends androidx.core.app.ComponentActivity implements
LifecycleOwner,
ViewModelStoreOwner,
SavedStateRegistryOwner,
OnBackPressedDispatcherOwner {
、、、、
}
public interface LifecycleOwner {
/**
* Returns the Lifecycle of the provider.
*
* @return The lifecycle of the provider.
*/
@NonNull
Lifecycle getLifecycle();
}
4、在Fragment中的使用方法与Activity中的使用方法相同,因为Fragment也实现了LifecycleOwner接口
public class Fragment implements ComponentCallbacks, OnCreateContextMenuListener, LifecycleOwner,
ViewModelStoreOwner, SavedStateRegistryOwner