LifeCycle
通过lifeCycle让我们自己创建的类的对象来观察activity的生命周期,根据观察的结果来执行对应的功能。
原先我们要在进入activity视图或者离开时对一些对象进行操作时都需要在activity的生命周期方法中进行响应的修改,例如一个简单的时钟计数器,如果离开这个界面就暂停计数,回到这个界面时恢复计数:
public class MainActivity extends AppCompatActivity {
Chronometer chronometer;
private long elapsedTime;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
chronometer=findViewById(R.id.meter);
chronometer.setBase(SystemClock.elapsedRealtime());
chronometer.start();
}
@Override
protected void onPause() {
super.onPause();
elapsedTime=SystemClock.elapsedRealtime()-chronometer.getBase();
chronometer.stop();
}
@Override
protected void onResume() {
super.onResume();
chronometer.setBase(SystemClock.elapsedRealtime()-elapsedTime);
chronometer.start();
}
}
如果一个activity中有很多个组件需要我们去处理生命周期切换时发生的动作,那么显然是极其臃肿的,利用LifeCycle可以将对生命周期的处理转移到组件本生中去。
自定义时钟类,继承LifecycleObserver接口
这个接口能够使得这个时钟类能感应到生命周期的变化,并在对应时刻做出相应地处理。
public class MyChronometer extends Chronometer implements LifecycleObserver {
public MyChronometer(Context context, AttributeSet attrs) {
super(context, attrs);
}
}
用注解来监听生命周期变化
public class MyChronometer extends Chronometer implements LifecycleObserver {
private long elapsedTime;
public MyChronometer(Context context, AttributeSet attrs) {
super(context, attrs);
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
private void pauseMeter(){
elapsedTime= SystemClock.elapsedRealtime()-getBase();
stop();
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
private void resumeMeter(){
setBase(SystemClock.elapsedRealtime()-elapsedTime);
start();
}
}
在activity中把该时钟添加观察者
public class MainActivity extends AppCompatActivity {
MyChronometer chronometer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
chronometer=findViewById(R.id.meter);
getLifecycle().addObserver(chronometer);
}
}