Lifecycle介紹
Lifecycle組件屬于Jetpack的架構(gòu)組件中晃听,它是一個(gè)生命周期感知組件安裝官方文檔的說(shuō)明,它可以感知Activity和Fragment生命周期的變化卷拘,這樣子可以讓Activity和Fragment的代碼更為的精簡(jiǎn),而且一些生命周期的處理就可以單獨(dú)的放在一個(gè)類里去處理了。
Lifecycle的基本使用
使用Lifecycle需要在app的build.gradle文件下進(jìn)行導(dǎo)入承匣,詳細(xì)請(qǐng)看Lifecycle導(dǎo)入說(shuō)明充尉。
//版本號(hào)請(qǐng)查看官方說(shuō)明
implementation "android.arch.lifecycle:extensions:2.1.0"
然后我們創(chuàng)建一個(gè)類繼承LifecycleObserver接口,這就是一個(gè)觀察生命周期的接口只盹,代碼如下所示:
public class MyObserver implements LifecycleObserver {
private static final String TAG = "MainActivity";
@OnLifecycleEvent(Lifecycle.Event.ON_START)
public void onStart() {
Log.i(TAG, "Lifecycle onStart生命周期");
}
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
public void onCreate() {
Log.i(TAG, "Lifecycle onCreate生命周期");
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public void onResume() {
Log.i(TAG, "Lifecycle onResume生命周期");
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
public void onPause() {
Log.i(TAG, "Lifecycle onPause生命周期");
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
protected void onStop() {
Log.i("MainActivity","Lifecycle onStop生命周期");
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void onDestory() {
Log.i(TAG, "Lifecycle onDestory生命周期");
}
}
我們可以使用注解在每個(gè)方法上標(biāo)記相應(yīng)的生命周期辣往,這樣就可以去調(diào)用了,接著我們要在需要監(jiān)聽的Activity和Fragment下去進(jìn)行添加監(jiān)聽(被觀察者):
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//添加監(jiān)聽
getLifecycle().addObserver(new MyObserver());
Log.i("MainActivity","Activity onCreate");
}
@Override
protected void onStart() {
super.onStart();
Log.i("MainActivity","Activity onStart");
}
@Override
protected void onResume() {
super.onResume();
Log.i("MainActivity","Activity onResume");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.i("MainActivity","Activity onDestroy");
}
@Override
protected void onPause() {
super.onPause();
Log.i("MainActivity","Activity onPause");
}
@Override
protected void onStop() {
super.onStop();
Log.i("MainActivity","Activity onStop");
}
}
在Android Support Library 26.1.0及其之后的版本殖卑,Activity和Fragment已經(jīng)默認(rèn)實(shí)現(xiàn)了LifecycleOwner接口站削,也就是被觀察者,所以我們可以直接調(diào)用getLifecycle()
來(lái)進(jìn)行添加觀察者孵稽。運(yùn)行結(jié)果如下:
我們會(huì)發(fā)現(xiàn)添加觀察者后當(dāng)Activity的生命周期被調(diào)用的時(shí)候MyObserver相關(guān)的方法也會(huì)被調(diào)用许起,這樣我們就可以在MyObserver類中做需要的業(yè)務(wù)邏輯了十偶,這里要注意一下,當(dāng)進(jìn)入
onPause()
及之后的生命周期回調(diào)的時(shí)候园细,是先調(diào)用監(jiān)聽者相關(guān)的方法的然后才去調(diào)用Activity相關(guān)的方法惦积。這里需要注意一下。關(guān)于自定義LifecycleOwner
剛剛也說(shuō)過(guò)了Activity和Fragment已經(jīng)默認(rèn)實(shí)現(xiàn)了LifecycleOwner接口猛频,但是我們也可以自定義一個(gè)LifecycleOwner狮崩,我們要通過(guò)LifecycleRegistry去進(jìn)行注冊(cè),LifecycleRegistry是Lifecycle的子類鹿寻。LifecycleRegistry主要是控制LifecycleOwner的狀態(tài)以及狀態(tài)切換睦柴,按照官方文檔的代碼如下:
public class TwoActivity extends AppCompatActivity {
private LifecycleRegistry lifecycleRegistry;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_two);
//注冊(cè)
lifecycleRegistry = new LifecycleRegistry(this);
lifecycleRegistry.markState(Lifecycle.State.CREATED);
}
@Override
protected void onStart() {
super.onStart();
lifecycleRegistry.markState(Lifecycle.State.STARTED);
Log.i("TwoActivity","Activity onStart");
}
@NonNull
@Override
public Lifecycle getLifecycle() {
return lifecycleRegistry;
}
}
但是你會(huì)發(fā)現(xiàn)一個(gè)問題lifecycleRegistry.markState()
竟然是一個(gè)廢棄方法,而且跑起來(lái)是會(huì)報(bào)錯(cuò)的毡熏。
報(bào)錯(cuò)提示說(shuō)第一次調(diào)用
getLifecycle()
坦敌,也就是自定義lifecycleRegistry的時(shí)候需要構(gòu)建它的生命周期,是的痢法,lifecycleRegistry也有自己的運(yùn)行狀態(tài)狱窘,我們可以通過(guò)getLifecycle().getCurrentState()
來(lái)進(jìn)行獲取,報(bào)錯(cuò)的原因是這個(gè)AppCompatActivity其實(shí)已經(jīng)有一個(gè)lifecycleRegistry了财搁,而且已經(jīng)構(gòu)建它的生命周期了训柴,而其他的一些自義定的類需成為L(zhǎng)ifecycleOwner,就需要繼承LifecycleOwner然后才能進(jìn)行自定義(比如Activity)妇拯。至于廢棄問題幻馁,官方文檔也沒說(shuō)明,Google一下是說(shuō)推薦使用setCurrentState()
方法來(lái)設(shè)置狀態(tài)越锈。
lifecycleRegistry.setCurrentState(Lifecycle.State.CREATED);