一、背景
我们在处理Activity或者Fragment组件的生命周期相关时,不可避免会遇到这样的问题:
我们在Activity的onCreate()中初始化某些成员(比如MVP架构中的Presenter,或者AudioManager、MediaPlayer等),然后在onStop中对这些成员进行对应处理,在onDestroy中释放这些资源,这样导致我们的代码也许会像这样:
class MyPresenter{
public MyPresenter() {
}
void create() {
//do something
}
void destroy() {
//do something
}
}
class MyActivity extends AppCompatActivity {
private MyPresenter presenter;
public void onCreate(...) {
presenter= new MyPresenter ();
presenter.create();
}
public void onDestroy() {
super.onDestroy();
presenter.destory();
}
}
复制代码
代码没有问题,关键问题是,实际生产环境中 ,这样的代码会非常复杂,你最终会有太多的类似调用并且会导致 onCreate() 和 onDestroy() 方法变的非常臃肿。
二、lifecycle使用
只需要2步:
-
Prestener继承LifecycleObserver接口
public class MyPresenter extends LifecycleObserver { @OnLifecycleEvent(Lifecycle.Event.ON_CREATE) void onCreate(@NotNull LifecycleOwner owner); @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) void onDestroy(@NotNull LifecycleOwner owner); @OnLifecycleEvent(Lifecycle.Event.ON_ANY) void onLifecycleChanged(@NotNull LifecycleOwner owner, @NotNull Lifecycle.Event event); } -
在Activity/Fragment容器中添加Observer
public class MainActivity extends AppCompatActivity { private IPresenter mPresenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d("tag", "onCreate" + this.getClass().toString()); setContentView(R.layout.activity_main); mPresenter = new MainPresenter(this); getLifecycle().addObserver(mPresenter);//添加LifecycleObserver } @Override protected void onDestroy() { Log.d("tag", "onDestroy" + this.getClass().toString()); super.onDestroy(); } }
如此,每当Activity发生了对应的生命周期改变,Presenter就会执行对应事件注解的方法。
三、原理
-
Activity(Fragment )实现LifecycleOwner接口,并实现其抽象方法getLifecycle,返回Lifecycle的子类实例LifecycleRegistry。
-
观察者实现LifecycleObserver接口,通过addObserver方法注册到被观察者里。
-
当Activity(Fragment )生命周期发生改变,LifecycleRegistry调用handleLifecycleEvent逐个遍历通知每一个注册的LifecycleObserver ,并执行对应生命周期的方法。
public class Fragment implements xxx, LifecycleOwner { //... void performCreate(Bundle savedInstanceState) { onCreate(savedInstanceState); //1.先执行生命周期方法 //...省略代码 //2.生命周期事件分发 mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE); } void performStart() { onStart(); //... mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START); } }