某一个组件感知包含他的activity的一些声明周期的变化 从而做出的一些相应的改变。
    传统的方式,
    直接在相对应的activity中写出相应的函数

    1. @Override
    2. protected void onCreate(Bundle savedInstanceState) {
    3. super.onCreate(savedInstanceState);
    4. setContentView(R.layout.activity_main);
    5. chronometer = findViewById(R.id.meter);
    6. chronometer.setBase(SystemClock.elapsedRealtime()); //UNIX 时间 1970 1-1
    7. // getLifecycle().addObserver(chronometer);
    8. }
    9. // //下面两个仅仅是视觉上的退出 那么在实际的功能上不会被停止
    10. // /* 退出当前页面 但是后台仍然在运行 */
    11. // @Override
    12. // protected void onPause() {
    13. // super.onPause();
    14. // time = SystemClock.elapsedRealtime() - chronometer.getBase();
    15. // //chronometer.stop();
    16. // }
    17. //
    18. // /* 后台正在运行的页面重新回到前台页面来 */
    19. // @Override
    20. // protected void onResume() {
    21. // super.onResume();
    22. // chronometer.setBase(SystemClock.elapsedRealtime() - time);
    23. // chronometer.start();
    24. // }

    其中解决了仅仅是视觉上的退出 后台上的计时器仍然是一直在运行的情况,就是通过一个媒介时间 来计算在后台运行的这个时间上的间隔,然后在唤醒的时候通过计算得到上次放置到后台的一个时间。重新设置就好。

    但是这种做法就是把代码绑定到相应的activity中 代码混合在一起 后续如果这种感知的东西多了的话 代码量会越来越大 不便于维护 代码的可用性及可读性会变差
    所以采用一种新的方式。

    public class MyChronometer extends Chronometer implements LifecycleObserver{ … }
    使用一个类继承这个组件 并实现 LifecycleObserver

    完整代码如下
    //MyChronometer.java

    1. public class MyChronometer extends Chronometer implements LifecycleObserver {
    2. /* 暂停的时间 */
    3. private static long time;
    4. /**
    5. * 使用这个构造函数的原因是:
    6. * 传递所使用的上下文
    7. * 传递这个计时器本身所需要设置的一些属性
    8. */
    9. public MyChronometer(Context context, AttributeSet attrs) {
    10. super(context, attrs);
    11. }
    12. @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    13. private void pauseMeter(){
    14. time = SystemClock.elapsedRealtime() -getBase();
    15. // stop();
    16. }
    17. @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    18. private void resumeMeter(){
    19. setBase(SystemClock.elapsedRealtime() - time);
    20. start();
    21. }
    22. }

    相对应的包含的activity上需要作出相应的改变
    代码如下:

    1. public class MainActivity extends AppCompatActivity {
    2. // Chronometer chronometer;
    3. MyChronometer chronometer;
    4. private long time;
    5. @Override
    6. protected void onCreate(Bundle savedInstanceState) {
    7. super.onCreate(savedInstanceState);
    8. setContentView(R.layout.activity_main);
    9. chronometer = findViewById(R.id.meter);
    10. // chronometer.setBase(SystemClock.elapsedRealtime()); //UNIX 时间 1970 1-1
    11. getLifecycle().addObserver(chronometer); //增加一个观察者
    12. }

    主要是在其生命周期中增加一个观察者,那么这个观察者就能够监听到此activity的变化 从而做出相应的改变。 改变的函数 就是在上面那个代码中的注解中标识的那样。