某一个组件感知包含他的activity的一些声明周期的变化 从而做出的一些相应的改变。
传统的方式,
直接在相对应的activity中写出相应的函数
@Overrideprotected 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;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);chronometer = findViewById(R.id.meter);// chronometer.setBase(SystemClock.elapsedRealtime()); //UNIX 时间 1970 1-1getLifecycle().addObserver(chronometer); //增加一个观察者}
主要是在其生命周期中增加一个观察者,那么这个观察者就能够监听到此activity的变化 从而做出相应的改变。 改变的函数 就是在上面那个代码中的注解中标识的那样。
