0%

Jetpack中LifeCycle

使用LifeCycles让控件感知活动的生命周期

在JetPack没有提出时,如何让控件感知所在活动的生命周期?可能回需要在Activity中重写各种生命周期函数:OnStart、OnCreate、OnResume、OnPause、OnStop、OnDestroy,导致Activity中的代码过于冗长、移植性不高

在JetPack没有提出时,如何让控件感知所在活动的生命周期?可能回需要在Activity中重写各种生命周期函数:OnStart、OnCreate、OnResume、OnPause、OnStop、OnDestroy,导致Activity中的代码过于冗长、移植性不高

视频教程

视频链接

具体逻辑

  1. 就是创建一个类,这个类继承自某个控件,

  2. 类要实现LifecycleObserver 接口

  3. 类内部就可以通过,在函数前加注解@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) 使得当Activity处于Pause时,执行这个函数

    例如

    image-20210428163600593

  4. 在Activity中添加这个观察者

实例代码

要求实现一个计时器,只记录APP可见的时间,且到后台后 停止记录,并且在切换语言,横竖屏 仍要保持即时,不丢失数据

6

ViewModel

1
2
3
4
5
6
7
8
9
10
11
public class MyViewModel extends ViewModel {
private long elapseTime;

public long getElapseTime() {
return elapseTime;
}

public void setElapseTime(long elapseTime) {
this.elapseTime = elapseTime;
}
}

MainActivity

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class MainActivity extends AppCompatActivity {
private MyChronometer myChronometer;
private final static String TAG = "LittleStone";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myChronometer = findViewById(R.id.meter);
//使用ViewModel是为了在改变手机横竖向、语言时,保存数据
MyViewModel myViewModel = new ViewModelProvider(this).get(MyViewModel.class);
myChronometer.setMyViewModel(myViewModel);
//添加观察者
getLifecycle().addObserver(myChronometer);

}

}

自定义一个定时器,Chronometer 其实也是Textview的子类,需要继承自Chronometer 并且实现观察者接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class MyChronometer extends Chronometer implements LifecycleObserver {
private MyViewModel myViewModel;
private final static String TAG = "LittleStone";

public MyChronometer(Context context, AttributeSet attrs) {
super(context, attrs);
}

public void setMyViewModel(MyViewModel myViewModel) {
this.myViewModel = myViewModel;
}

@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
private void pause(){
myViewModel.setElapseTime(SystemClock.elapsedRealtime()-getBase());
this.stop();
Log.i(TAG, "pause: ");
}

@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
private void resume(){
this.setBase(SystemClock.elapsedRealtime()-myViewModel.getElapseTime());
this.start();
Log.i(TAG, "resume: ");
}
}