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
}
複製代碼