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'