某一个组件感知包含他的activity的一些声明周期的变化 从而做出的一些相应的改变。
传统的方式,
直接在相对应的activity中写出相应的函数
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
chronometer = findViewById(R.id.meter);
chronometer.setBase(SystemClock.elapsedRealtime()); //UNIX 时间 1970 1-1
// getLifecycle().addObserver(chronometer);
}
// //下面两个仅仅是视觉上的退出 那么在实际的功能上不会被停止
// /* 退出当前页面 但是后台仍然在运行 */
// @Override
// protected void onPause() {
// super.onPause();
// time = SystemClock.elapsedRealtime() - chronometer.getBase();
// //chronometer.stop();
// }
//
// /* 后台正在运行的页面重新回到前台页面来 */
// @Override
// protected void onResume() {
// super.onResume();
// chronometer.setBase(SystemClock.elapsedRealtime() - time);
// chronometer.start();
// }
其中解决了仅仅是视觉上的退出 后台上的计时器仍然是一直在运行的情况,就是通过一个媒介时间 来计算在后台运行的这个时间上的间隔,然后在唤醒的时候通过计算得到上次放置到后台的一个时间。重新设置就好。
但是这种做法就是把代码绑定到相应的activity中 代码混合在一起 后续如果这种感知的东西多了的话 代码量会越来越大 不便于维护 代码的可用性及可读性会变差
所以采用一种新的方式。
public class MyChronometer extends Chronometer implements LifecycleObserver{ … }
使用一个类继承这个组件 并实现 LifecycleObserver
完整代码如下
//MyChronometer.java
public class MyChronometer extends Chronometer implements LifecycleObserver {
/* 暂停的时间 */
private static long time;
/**
* 使用这个构造函数的原因是:
* 传递所使用的上下文
* 传递这个计时器本身所需要设置的一些属性
*/
public MyChronometer(Context context, AttributeSet attrs) {
super(context, attrs);
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
private void pauseMeter(){
time = SystemClock.elapsedRealtime() -getBase();
// stop();
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
private void resumeMeter(){
setBase(SystemClock.elapsedRealtime() - time);
start();
}
}
相对应的包含的activity上需要作出相应的改变
代码如下:
public class MainActivity extends AppCompatActivity {
// Chronometer chronometer;
MyChronometer chronometer;
private long time;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
chronometer = findViewById(R.id.meter);
// chronometer.setBase(SystemClock.elapsedRealtime()); //UNIX 时间 1970 1-1
getLifecycle().addObserver(chronometer); //增加一个观察者
}
主要是在其生命周期中增加一个观察者,那么这个观察者就能够监听到此activity的变化 从而做出相应的改变。 改变的函数 就是在上面那个代码中的注解中标识的那样。