使用LifeCycles让控件感知活动的生命周期
在JetPack没有提出时,如何让控件感知所在活动的生命周期?可能回需要在Activity中重写各种生命周期函数:OnStart、OnCreate、OnResume、OnPause、OnStop、OnDestroy,导致Activity中的代码过于冗长、移植性不高
在JetPack没有提出时,如何让控件感知所在活动的生命周期?可能回需要在Activity中重写各种生命周期函数:OnStart、OnCreate、OnResume、OnPause、OnStop、OnDestroy,导致Activity中的代码过于冗长、移植性不高
视频教程
视频链接
具体逻辑
就是创建一个类,这个类继承自某个控件,
类要实现LifecycleObserver 接口
类内部就可以通过,在函数前加注解@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) 使得当Activity处于Pause时,执行这个函数
例如
在Activity中添加这个观察者
实例代码
要求实现一个计时器,只记录APP可见的时间,且到后台后 停止记录,并且在切换语言,横竖屏 仍要保持即时,不丢失数据
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); 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: "); } }
|