在写完上篇 带着问题去看下ViewModel源码 之后,虽然将 ViewModel 都交代清楚了,不过最基础核心的 Lifecycle 组件 部分并没有进行说明,因此这篇就专门说一下 Lifecycle 组件,下面开始正文
Lifecycle组件 的使用
使用 Lifecycle 组件的话,我们可以相对轻松去响应指定组件( 通常都是 Activity )的生命周期变化,因此利用 Lifecycle 组件,我们可以避免在 Activity 等组件 的生命周期回调中写大量管理组件的代码,进一步精简了我们的项目代码
这里简单说一下 Lifecycle 组件 在 Activity 中的基本用法:
public class MainActivity extends AppCompatActivity {
private static final String TAG = "Lifecycle";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_lifecycle_test);
//这里进行注册,进行生命周期
getLifecycle().addObserver(new MyObserver());
}
@Override
protected void onResume() {
super.onResume();
Log.w(TAG, "onResume");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.w(TAG, "onDestroy");
}
private class MyObserver implements LifecycleObserver {
@OnLifecycleEvent(value = Lifecycle.Event.ON_RESUME)
public void resume(){
Log.e(TAG, "resume");
}
@OnLifecycleEvent(value = Lifecycle.Event.ON_DESTROY)
public void destroy(){
Log.e(TAG, "destroy");
}
}
}
使用起来就这么简单,只要实现了 LifecycleObserver
这个接口,然后使用 注解标记
想要观察的组件生命周期,只要注册就可以完成生命周期的监控了,可以从日志来验证这一点:
这时候问题就来了,Lifecycle 组件 是怎么做到这一点的?先别急,我们先来看下如果要自己实现一个 LifecycleOwner
,应该要怎么做
自己实现一个 LifecycleOwner
目前我们知道的,我们可以在 Activity 里面注册监控生命周期,那么如果是其他组件呢?假设现在我们有一个 Service,我们希望可以监听到这个 Service 的生命周期,在 Service 启动时加载某些资源,在 Service 结束时去释放某些资源:
那么,就需要我们自己来实现一个带有 LifecyclerOwner
的 Service:
public class MsgService extends Service implements LifecycleOwner {
private final LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);
@Override
public void onCreate() {
super.onCreate();
//发出create事件
mLifecycleRegistry.setCurrentState(Lifecycle.State.CREATED);
}
@NonNull
@Override
public Lifecycle getLifecycle() {
return mLifecycleRegistry;
}
@Override
public void onDestroy() {
super.onDestroy();
//发出destroy事件
mLifecycleRegistry.setCurrentState(Lifecycle.State.DESTROYED);
}
/**
* 返回一个Binder对象
*/
@Override
public IBinder onBind(Intent intent) {
return new MsgBinder();
}
public class MsgBinder extends Binder {
/**
* 获取当前Service的实例
*/
public MsgService getService() {
return MsgService.this;
}
}
}
然后下一步,就在一个 Activity 里面启动这个 Service ,并绑定 LifecycleObserver
去监听 Service 的生命周期变化:
public class MainActivity extends AppCompatActivity implements ServiceConnection {
private static final String TAG = "Lifecycle"