Lifecycles其实从名字看肯定是与生命周期相关,那它与生命周期又有什么联系?
先参考一下官方文档:
Lifecycles是一个生命周期感知组件,当Activity或者Fragment的生命周期发生改变的时会,Lifecycles也会做出相应的生命周期状态的改变,它保存关于组件生命周期状态的信息(比如活动或片段),并允许其他对象观察这种状态。
可以看出Lifecycles是一个组件,具有感知生命周期的功能,既然是个组件,那就说明可以嵌入到其他地方,比如VewModel便是其中之一。
当我们需要处理与生命周期相关的组件的时候,在没有Lifecycles提供的时候,需要设置各种回调,如下所示:
package com.example.lifecycle; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; public class MainActivity extends AppCompatActivity { String TAG = "myTag"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.d(TAG, "onCreate: "); } @Override protected void onStart() { super.onStart(); Log.d(TAG, "onStart: "); } @Override protected void onResume() { super.onResume(); Log.d(TAG, "onResume: "); } @Override protected void onPause() { super.onPause(); Log.d(TAG, "onPause: "); } @Override protected void onStop() { super.onStop(); Log.d(TAG, "onStop: "); } @Override protected void onRestart() { super.onRestart(); Log.d(TAG, "onRestart: "); } @Override protected void onDestroy() { super.onDestroy(); Log.d(TAG, "onDestroy: "); } }
当组件数目过多的时候,便会需要在生命周期回调中管理多个组件从而徒增代码量,使得项目难以维护,而且在生命周期中执行过多的耗时操作极易引起内存泄漏,而这些问题都可以通过Lifecycles来解决。
使用示例
以Chronometer为例子来示范生命周期监听
public class MyChronometer extends Chronometer implements LifecycleObserver { private long time; public MyChronometer(Context context) { super(context); } public MyChronometer(Context context, AttributeSet attrs) { super(context, attrs); } public MyChronometer(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } //以注解的形式完成监听 @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) private void stopMeter(){ time = SystemClock.elapsedRealtime() - getBase(); stop(); } @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) private void resumeMeter(){ setBase(SystemClock.elapsedRealtime() - time); start(); } }
然后Activity只需要添加观察者即可
public class LifecyclesActivity extends AppCompatActivity { MyChronometer chronometer; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_lifecycles); chronometer = findViewById(R.id.meter); getLifecycle().addObserver(chronometer); } }
这样就使得Activity与Chronometer之间解耦了,Chrononmeter自我实现了良好的封装,也方便了代码的移植。
这也就是使用Lifecycles所带来的好处。