Lifecycle提供了可以用于构建生命周期感知组件的类和接口,生命周期感知型组件可执行操作来响应另一个组件(如 Activity 和 Fragment)的生命周期状态的变化。这些组件有助于您写出更有条理且往往更精简的代码,这样的代码更易于维护。
Google官方在2018年的I/O大会上正式推出JetPack组件,作为关于Android应用程序构架设计的标准。Lifecycle是最早亮相的组件之一,提供了可以用于构建生命周期感知组件的类和接口,而常用的两大JetPack成员LiveData和ViewModel也与此略有联系。
生命周期感知能力
Lifecycle提供了用于构造生命周期感知组件的类和接口,也就是让自定义组件具有了生命周期感知能力,那为什么这样做以及如何做到呢?
1.为什么要考虑生命周期
我们从两个角度考虑这个问题。
从需求层面:用户在生命周期活跃的时候使用某个功能,同样也想在生命周期死亡的时候结束某个功能。
从性能层面:大家都知道内存泄漏是因为长生命周期的对象持有短生命周期的对象引用而导致内存不能及时回收的现象,如果存在大量这种本该回收而不能回收的对象,很快就会OOM。
2.解决的思路
既然短生命周期的对象不能及时释放从而造成内存泄漏,那我们只要在对应的生命周期进行分配和释放资源就可以解决问题。这里定义一个播放资源类,里面含有开始播放和停止播放两个功能,在Activity的start、pause生命周期里进行调用,伪代码如下:
public class MainActivity extends AppCompatActivity {
private final String activityTag = getClass().getName();
//伪播放资源
private MusicService musicService = new MusicService();
@Override
protected void onStart() {
super.onStart();
musicService.playMusic();
Log.e(activityTag, "playMusic");
}
@Override
protected void onPause() {
super.onPause();
musicService.stopMusic();
Log.e(activityTag, "stopMusic");
}
}
3.Lifecycle更为优雅的实现
上面的方案可以在相应的生命周期进行资源的管理,但是试想如果每个activity都需要显式声明资源类,以及需要在对应的生命周期进行资源管理,样板代码不仅多且杂乱。因此Google推出了Lifecycle组件,可以在对应功能上追踪生命周期而取消样板代码。伪代码如下:
public class MusicService implements LifecycleObserver {
private final String activityTag = getClass().getName();
@OnLifecycleEvent(Lifecycle.Event.ON_START)
public void playMusic(){
Log.e(activityTag, "playMusic");
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
public void stopMusic(){
Log.e(activityTag, "stopMusic");
}
}
public class MainActivity extends AppCompatActivity {
private MusicService musicService;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
}
private void init(){
musicService = new MusicService();
getLifecycle().addObserver(musicService)