1.Lifecycle
Lifecycle是Jetpack中的一个生命周期感知型组件 ,可执行操作来感知响应其他组件(如Activity和Fragment)的生命周期状态的变化。
activity和fragment是有生命周期的,有时候很多操作需要写在生命周期方法中,比如下载文件操作等,这样会导致在生命周期方法中写越来越多的代码,activity/fragment越来越臃肿,代码维护困难。 使用Lifecycle就可以解决这类问题。
Lifecycle的出现就是为了解耦系统组件的生命周期与自定义组件之间的耦合,比如以前如果自定义组件需要在Activity对应的生命周期做处理时,就需要重写Activity的生命周期然后在生命周期方法里做相应的处理,而现在通过Lifecycle就可以省略掉重写生命周期方法这个步骤。
Lifecycle使用了观察者模式,通过Owner和Observer的配合实现了生命周期的解耦。Lifecycle通过实现LifecycleObserver接口来监听生命周期,然后在activity/fragment中注册监听。
注:Lifecycle需要在AndroidX的环境里才能使用。
几个重要的类和接口:
①Lifecycle:Lifecycle是一个持有组件生命周期状态信息的类,并允许其他对象观察此状态。
②Event:从框架和Lifecycle类派发的生命周期事件。这些事件会映射到Activity/Fragment的回调事件中。
③State:由Lifecycle对象跟踪的组件的当前状态。
④LifecycleOwner:生命周期持有者接口。实现该接口的类持有生命周期(Lifecycle对象),并且它的生命周期的改变会被其注册的观察者LifecycleObserver观察到并触发观察者对应的事件。LifecycleOwner接口有一个getLifecycle()方法,该方法必须由这个类来实现。任何自定义应用程序类都可以实现LifecycleOwner接口。
⑤LifecycleObserver:生命周期观察者接口。实现该接口的类就可以被LifecycleOwner类的addObserver(LifecycleObserver o)方法注册,只要在持有Lifecycle的类中注册了它,当LifecycleOwner的生命周期发生变化时,LifecycleObserver就能收到,从而进行自定义的操作。
实现LifecycleObserver的组件与实现LifecycleOwner的组件无缝协作,因为所有者可以提供生命周期,观察者可以注册以观看。
简单来说,LifecycleOwner就是一个接口,谁继承了它谁就持有了Lifecycle对象,然后就可以调用getLifecycle()方法获取继承了抽象类Lifecycle的LifecycleRegistry,然后调用addObserver方法来注册监听。这样,该接口的生命周期的改变会被其注册的观察者LifecycleObserver观察到并触发其对应的事件。
注意:Support Library 26.1.0及以后的版本,Activity和Fragment已经实现了LifecycleOwner接口,所以可以直接在Activity和Fragment中使用getLifecycle()方法来获取Lifecycle对象,并添加观察者监听。
LifecycleObserver有两种实现方式:
1)实现DefultLifecyceObserver接口,然后重写里面生命周期方法;
2)直接实现LifecycleObserver接口,然后通过注解的方式来接收生命周期的变化;
官方文档建议使用第一种方式,因为文档中说明了,随着Java8成为主流,注解的方式会被弃用。
2.LifeCycle的用法
(1)Activity中使用
首先Activity需要继承自AppCompatActivity,因为它继承了FragmentActivity,而FragmentActivity继承自ComponentActivity,ComponentActivity实现了LifecycleOwner接口,LifecycleOwner接口就是实现生命周期解耦的关键。
然后需要在自定义组件中实现LifecycleObserver接口或DefultLifecycleObserver接口。
举例:以Activity跳转为例,有两个Activity,FirstActivity和SecondActivity,实现单纯的一个跳转。
先写一个需要拥有生命周期的类。正常自定义控件或做其他逻辑的类是没有生命周期的,现在有了LifecycleObserver,就可以让一个普通的类拥有感知生命周期变化的能力。比如现在自定义一个MyObserver类。
public class MyObserver implements DefaultLifecycleObserver{
@Override
public void onCreate(LifecycleOwner owner){
Log.d(TAG,"onCreate()");
Log.d(TAG,"当前生命周期状态= " + owner.getLifecycle.getCurrentState().name());
}
@Override
public void onStart(LifecycleOwner owner) {
Log.d(TAG,"onStart()");
Log.d(TAG,"当前生命周期状态=" + owner.getLifecycle.getCurrentState().name());
}
@Override
public void onResume(LifecycleOwner owner){
Log.d(TAG,"onResume()");
Log.d(TAG,"当前生命周期状态=" + owner.getLifecycle.getCurrentState().name());
}
@Override
public void onPause(LifecycleOwner owner){
Log.d(TAG,"onPause()");
Log.d(TAG,"当前生命周期状态=" + owner.getLifecycle.getCurrentState().name());
}
@Override
public void onStop(LifecycleOwner owner) {
Log.d(TAG,"onStop()");
Log.d(TAG,"当前生命周期状态=" + owner.getLifecycle.getCurrentState().name());
}
@Override
public void onDestroy(LifecycleOwner owner) {
Log.d(TAG,"onDestroy() ");
Log.d(TAG,"当前生命周期状态=" + owner.getLifecycle.getCurrentState().name());
}
}
采取直接继承DefaultLifecycleObserver接口的方式,并实现它所有方法。在每个方法里打了log来查看这个类是否能收到activity生命周期的变化。
接下来就是注册监听:
在Activity的OnCreate方法中调用getLifecycle()方法:
public class FirstActivity extends AppCompatActivity {
private Button firstBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView( R.layout.first_layout);
initView();
initListener();
//注册监听
getLifecycle().addObserver(new MyObserver());
}
private void initListener() {
firstBtn.setOnClickListener(new View.OnClic