Lifecycle 是官方提供的架构组件之一,目前已是稳定版;与它一块儿提供出来的组件还有ViewModel、LiveData、Roomhtml
在平常开发中,咱们常常须要封装一些自定义的View或者组件,咱们有时后须要它们的生命周期随Activity或Fragment的生命周期发生变化,例如:咱们实现了一个循环播放的轮播广告图组件Banner,在使用该组件时,咱们但愿Activity在onPause时,轮播也中止(这个需求多是产品提出的,也多是出于性能考虑),咱们之前的实现方式以下:android
class MyActivity extends AppCompatActivity {
private Banner mBanner;
public void onCreate(...) {
...
mBanner = new Banner();
}
@Override
public void onStart() {
super.onStart();
mBanner.onStart(); }
@Override
public void onPause() {
super.onPause();
mBanner.onPause();
}
}
复制代码
这里咱们要在Activity的生命周期方法里调用一些Banner的方法,当业务逻辑很复杂时,咱们还会有一些其余组件,好比说定位等,这时Activity等生命周期方法里就会调用更多的方法,这不利于咱们维护。LifeCycle的出现为咱们提供了一种简单的维护方式。bash
// ViewModel and LiveData
implementation "android.arch.lifecycle:extensions:1.1.0"
// alternatively, just ViewModel
implementation "android.arch.lifecycle:viewmodel:1.1.0"
// alternatively, just LiveData
implementation "android.arch.lifecycle:livedata:1.1.0"
annotationProcessor "android.arch.lifecycle:compiler:1.1.0"
复制代码
public class MainActivity extends Activity implements LifecycleOwner{
private LifecycleRegistry mLifecycleRegistry;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mLifecycleRegistry = new LifecycleRegistry(this);
mLifecycleRegistry.markState(Lifecycle.State.CREATED);
}
@Override
public void onStart() {
super.onStart();
mLifecycleRegistry.markState(Lifecycle.State.STARTED);
}
... //还须要实现其余生命周期方法,这里为了简单忽略了
@NonNull
@Override
public Lifecycle getLifecycle() {
return mLifecycleRegistry;
}
}
复制代码
public class MainActivity extends AppCompatActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Banner banner = new Banner();
getLifecycle().addObserver(banner);
}
}
class Banner implements LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_START)
public void test(){
Log.e("banner","start");
}
}
复制代码
if (lifecycle.getCurrentState().isAtLeast(STARTED)) {
// connect if not connected
}
复制代码