LifeCycle-01-解耦页面与组件------一个计时器的小例子
这个小demo的整体演示
假如我们打开程序用了10秒,现在程序显示的是10秒,
现在我们退出了5秒,但是再把程序呼叫出来之后程序从15秒开始跑
这就不应该了,应该从10秒开始跑,我们的数据跟页面的耦合度太高了,咋办?
这时候我们就应该使用lifecycle进行对activity或者fragment生命周期的观察
该demo有三个文件,两个class,一个视图文件
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout 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" tools:context=".MainActivity"> <Chronometer android:id="@+id/myChronometer" android:layout_width="137dp" android:layout_height="40dp" android:layout_marginTop="72dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" tools:ignore="MissingConstraints" /> <TextView android:id="@+id/textView" android:layout_width="197dp" android:layout_height="77dp" android:layout_marginTop="36dp" android:text="统计用户在线时间" android:textSize="24sp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/myChronometer" /> androidx.constraintlayout.widget.ConstraintLayout>
MyChronometerObserver.class
public class MyChronometerObserver implements LifecycleObserver { long liveTime; Chronometer chronometer; /*findviewbyid必须在activity中使用 所以必须要让他知道是哪个activity在用它 只需要加个参数就好了*/ public MyChronometerObserver(Activity context) { chronometer = context.findViewById(R.id.myChronometer); } /****************以下的方法要根据我们的activity生命周期来执行,用注解进行绑定***********/ @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) private void myStartMeter(){ //设置时间 //开机多长时间,是真的手机开机 SystemClock.elapsedRealtime() //用现在的总开机时间减去activity启动之前的时间就是上一次activity活跃的总时间 setBase就是设置现在的时间 chronometer.setBase(SystemClock.elapsedRealtime() - liveTime); //开始计时 chronometer.start(); } @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) private void mySopMeter(){ //当暂停时,用现在的开机总时长减去现在计时器的时间 (毫秒数) //这个差值就是这个activity启动之前的时间 liveTime = SystemClock.elapsedRealtime() - chronometer.getBase(); //停止计时 chronometer.stop(); } }
MainActivity.class
//lifecycle就是监听activity或者fragment的生命周期的 public class MainActivity extends AppCompatActivity { /*假如我们打开程序用了10秒,现在程序显示的是10秒, *现在我们退出了5秒,但是再把程序呼叫出来之后程序从15秒开始跑 * 这就不应该了,应该从10秒开始跑 所以应该剪掉中间退出的时间 * 但是减掉又太麻烦了,我们的数据跟页面的耦合度太高了,咋办? * */ MyChronometerObserver myChronometerObserver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); myChronometerObserver = new MyChronometerObserver(this); //添加生命周期的观察 getLifecycle().addObserver(myChronometerObserver); } }