使用生命周期感知型组件处理生命周期Lifecycles
本文为学习类文档,通过学习B站up主longway777的视频,如有侵权,请联系博主进行删除
使用生命周期感知型组件处理生命周期Lifecycles
关于使用生命周期感知型组件处理生命周期Lifecycles 文档中是这么写的:
生命周期感知型组件可执行操作来响应另一个组件(如 Activity 和 Fragment)的生命周期状态的变化。这些组件有助于您写出更有条理且往往更精简的代码,这样的代码更易于维护。
一种常见的模式是在 Activity 和 Fragment 的生命周期方法中实现依赖组件的操作。但是,这种模式会导致代码条理性很差而且会扩散错误。通过使用生命周期感知型组件,您可以将依赖组件的代码从生命周期方法移入组件本身中。
androidx.lifecycle 软件包提供了可用于构建生命周期感知型组件的类和接口 - 这些组件可以根据 Activity 或 Fragment 的当前生命周期状态自动调整其行为。
注意:要将 androidx.lifecycle 导入 Android 项目
简言之就是 自创的对象去观察项目的生命周期,根据观察结果的状态执行想要执行的响应功能。
创建项目
- 使用计时器Chronometer,属于TextView的一个子类,可直接将TextView改为Chronometer即可使用(默认为分:秒)
- 在MainActivity中添加响应代码实现进入界面时开始计时,退出界面时间停留,再次进入继续计数的功能:
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.os.SystemClock;
import android.widget.Chronometer;
public class MainActivity extends AppCompatActivity {
Chronometer chronometer;
private long elapsedTime;
@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 0:00至今)不同时区时间不同
* SystemClock.elapsedRealtime()——系统运行实时
*/
chronometer.setBase(SystemClock.elapsedRealtime());
//chronometer.start(); //开始计数,留在后台依然计数,下面有onResume()此处可省略保证成对出现
}
@Override
protected void onPause() {
super.onPause();
elapsedTime = SystemClock.elapsedRealtime() - chronometer.getBase(); //chronometer本次运行时间 = 系统运行实时-chronometer启动时起点时间
chronometer.stop(); //模拟切出后台时停止计数
}
@Override
protected void onResume() {
super.onResume();
chronometer.setBase(SystemClock.elapsedRealtime() - elapsedTime); //重新设置起点时间,以达到暂停效果
chronometer.start(); //回到界面中开启计数,但是由于chronometer创建后不会停止工作,无法实现后台停止再启动计数功能,需要添加一个变量
}
}
- 运行代码
增加系统维护性
创建MyChronometer类来继承系统chronometer来封装代码:
并根据提示创建constructor方法,选择带有属性列表的含参构造方法:
并实现一个接口——LifecycleObserver
import android.content.Context;
import android.os.SystemClock;
import android.util.AttributeSet;
import android.widget.Chronometer;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleObserver;
import androidx.lifecycle.OnLifecycleEvent;
public class MyChronometer extends Chronometer implements LifecycleObserver { //实现LifecycleObserver的接口来观察生命周期
private static long elapsedTime; //声明为静态对象以保证controller重新创建时不进行初始化(非正常方法,最好是存入ViewModel中或者是SavedState中)
public MyChronometer(Context context, AttributeSet attrs) {
super(context, attrs);
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
private void pauseMeter () {
elapsedTime = SystemClock.elapsedRealtime() - getBase();
stop();
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
private void resumeMeter () {
setBase(SystemClock.elapsedRealtime() - elapsedTime);
}
}
MainActivity.java中删除之前写的生命周期处理事件
package com.example.lifecycles;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.os.SystemClock;
import android.widget.Chronometer;
public class MainActivity extends AppCompatActivity {
MyChronometer chronometer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
chronometer = findViewById(R.id.meter);
getLifecycle().addObserver(chronometer); //将chronometer添加为观察者
}
}