1.首先我们拿计时器控件Chronometer来举例说明,先不使用生命周期观察者,而是在对应的生命周期方法中实现相应的功能 首先创建xml文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
tools:context=".LifeCycleActivity">
<Chronometer
android:id="@+id/chronometer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp" />
</LinearLayout>
之后创建对应的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控件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
tools:context=".LifeCycleActivity">
<com.example.audiovisualdemo.entity.MyChronometer
android:id="@+id/chronometer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp" />
</LinearLayout>
那么这个时候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'
|