1.首先我们拿计时器控件Chronometer来举例说明,先不使用生命周期观察者,而是在对应的生命周期方法中实现相应的功能
首先创建xml文件
之后创建对应的Activity文件
public class LifeCycleActivity extends AppCompatActivity {
private MyChronometer chronometer;
private long elapsedTime;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_life_cycle);
chronometer = findViewById(R.id.chronometer);
getLifecycle().addObserver(chronometer);
//系统开机时间到现在所经历的毫秒数,包括睡眠时间
chronometer.setbase(SystemClock.elapsedRealtime());
chronometer.start();
}
@Override
protected void onPause() {
super.onPause();
//用户按住home键切到其他页面, elapsedTime记录进入当前页面后计时器所经过的时间
elapsedTime = SystemClock.elapsedRealtime()-chronometer.getbase();
}
@Override
protected void onResume() {
super.onResume();
//用户按住home键后再次进入页面后调用此方法
//设置计数器(chronometer)定时所参考的时间减去上一次切出去时所经历的时间
//用户再次按home键进入页面时 从上次退出时的时间开始计时
chronometer.setbase(SystemClock.elapsedRealtime()-elapsedTime);
}
}
接下来我们用生命周期观察者这个接口,实现组件感知生命周期。
首先自定义Chronometer控件,实现LifecycleObserver这个接口
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();
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
private void resumeMeter() {
setbase(SystemClock.elapsedRealtime() - elapsedTime);
start();
}
}
LifecycleObserver 这个接口本身没有方法,而是依赖于OnLifecycleEvent注释方法,来实现感知生命周期。
之后在xml文件引入这个自定义的View控件
那么这个时候Activity文件中的代码就变得非常简洁了,不用再重写里面的生命周期方法。
public class LifeCycleActivity extends AppCompatActivity {
private MyChronometer chronometer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_life_cycle);
chronometer = findViewById(R.id.chronometer);
//添加生命周期观察者chronometer,当生命周期更改状态时将收到通知。
getLifecycle().addObserver(chronometer);
}
}
最后需要的依赖为:
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'



