简化关于生命周期回调的代码;
计时器例子
package com.esdut.lifecycles;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.os.SystemClock;
import android.widget.Chronometer;
//stop() 只能停止视图刷新 不能影响时间的停留
public class MainActivity extends AppCompatActivity {
Chronometer chronometer;
private long esapsedTime;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
chronometer = findViewById(R.id.meter);
// chronometer.setBase(System.currentTimeMillis()); //UNIX 时间 1970 1-1 到现在为止的毫秒数
// chronometer.setBase(SystemClock.elapsedRealtime());//手机从上一次开机到现在, 只跟系统启动有关
//不写的话系统自动帮写SystemClock.elapsedRealtime()
chronometer.start();
}
@Override
protected void onPause() {
super.onPause();
esapsedTime = SystemClock.elapsedRealtime() - chronometer.getBase();
chronometer.stop();
}
@Override
protected void onResume() {
super.onResume();
chronometer.setBase(SystemClock.elapsedRealtime() - esapsedTime);
chronometer.start();
}
}
改进 —> 新建观察者类
package com.esdut.lifecycles;
import android.content.Context;
import android.os.SystemClock;
import android.util.AttributeSet;
import android.widget.Chronometer;
import androidx.annotation.NonNull;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleEventObserver;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.OnLifecycleEvent;
public class MyChronometer extends Chronometer implements LifecycleEventObserver {
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();
}
@Override
public void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event) {
}
}