前言
為什麼要讓元件感覺生命周期?
Android中大多數應用程式元件都附帶有生命周期。 生命周期由作業系統或你使用的架構管理。 生命周期是Android核心而基礎的東西,如果不按照生命周期寫代碼,可能會觸發記憶體洩漏甚至是應用程式崩潰。
而在
Api26.1.0
之前,自定義UI控件或其他的元件的生命周期都是由我們手動管理的。如果我們讓這些元件和Activity/Fragment 一樣具有生命周期。那麼我們将不用在Activity/Fragment中同步元件的生命周期事件。
例子
舉個例子。如果我們想要擷取位置資訊,常見的寫法是這個樣子的:
class MyLocationListener {
public MyLocationListener(Context context, Callback callback) {
// ...
}
void start() {
// connect to system location service
}
void stop() {
// disconnect from system location service
}
}
class MyActivity extends AppCompatActivity {
private MyLocationListener myLocationListener;
@Override
public void onCreate(...) {
myLocationListener = new MyLocationListener(this, (location) -> {
// update UI
});
}
@Override
public void onStart() {
super.onStart();
myLocationListener.start();
// 管理其他依賴生命周期的元件 ...
}
@Override
public void onStop() {
super.onStop();
myLocationListener.stop();
// 管理其他依賴生命周期的元件 ...
}
}
這樣寫沒毛病。但是如果有很多元件,Activity中會有大量維護生命周期的代碼。使代碼難以維護。
而使用
Lifecycle
後,代碼是這樣子的:
class MyLocationListener implements LifecycleObserver {
public MyLocationListener(Context context, Lifecycle lifecycle, Callback callback) {
...
}
@OnLifecycleEvent(Lifecycle.Event.ON_START)
void start() {
// connect to system location service
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
void stop() {
// disconnect if connected
}
}
class MyActivity extends AppCompatActivity {
private MyLocationListener myLocationListener;
public void onCreate(...) {
myLocationListener = new MyLocationListener(this, getLifecycle(), location -> {
// update UI
});
getLifecycle().addObserver(myLocationListener)
}
}
Activity裡将不再處理mLocationListener的生命周期,mLocationListener的生命周期将由Lifecycle來管理。現在我們隻需要在
onCreate()
時把需要感覺生命周期的元件添加到Lifecycle中,Lifecycle将根據注解在Activity生命周期改變時自行回調我們對應的方法。
Lifecycle
Lifecycle
是一個持有元件生命周期狀态(如Activity/Fragment)的類,并允許其他對象觀察此狀态。
Lifecycle
主要使用兩個枚舉來跟蹤其關聯元件的生命周期狀态:
- Event
事件 從Lifecycle.Event
和framework
分發。這些事件和Lifecycle
中的生命周期對應。Activity/Fragment
-
State
根據
對象來擷取目前狀态Lifecycle
在上面的例子中,我們寫的
MyLocationListener
實作了
LifecycleObserver
接口,并且使用了
@OnLifecycleEvent
注解。在
Activity
裡面我們把
myLocationListener
添加到了 觀察者清單。
-
LifecycleObserver 接口
這是一個空接口,就标記一下這個類是具有生命周期意識的。
- OnLifecycleEvent注解
@OnLifecycleEvent(Lifecycle.Event.ON_START)
注解參數為@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
枚舉,這些枚舉和Lifecycle.Event
生命周期對應。被注解的方法将在對應生命周期被回調。Activity/Fragment
-
Activity 添加生命周期觀察
自
起,Api26.1.0
預設實作 了SupportActivity
接口。也就是說,如果我們使用LifecycleOwner
或以上的版本,我們可以直接使用Api26.1.0
從Activity的繼承關系看,我們預設使用的AppCompatActivity也是可以直接使用的。如果你的Activity直接繼承自getLifecycle().addObserver()
,那麼通過實作Activity
LifecycleOwner
來達到相同的效果:
“`java
public class MyActivity extends Activity implements LifecycleOwner {
private LifecycleRegistry mLifecycleRegistry;
}@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); 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; }