本文首發于微信公衆号「Android開發之旅」,歡迎關注 ,擷取更多技術幹貨
Jetpack版Wan-Android項目位址:Android Jetpack架構開發元件化應用實戰 歡迎star
Flutter版Wan-Android項目位址:Flutter版Wan-Android 歡迎star
背景介紹
上一篇文章我們主要是介紹了Jetpack的由來以及四大元件各包含的元件庫。本篇文章我們将來學習架構元件中的Lifecycle元件。Lifecycle元件是幫忙我們管理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();
// manage other components that need to respond
// to the activity lifecycle
}
@Override
public void onStop() {
super.onStop();
myLocationListener.stop();
// manage other components that need to respond
// to the activity lifecycle
}
}
這些代碼看起來還不錯甚至是我們平常也是這麼做的,但是我在響應生命周期的目前狀态而進行過多的調用了管理UI和其他元件,這樣會在生命周期的方法中書寫大量代碼,例如onStart()和onStop(),這樣就會使代碼難以維護。
基于以上種種原因,Lifecycle正式登場了。
Lifecycle介紹
Lifecycle管理生命周期也是觀察者模式,其中主要涉及到以下幾個類:LifecycleObserver、LifecycleOwner、Lifecycle、State、Event。
- LifecycleObserver:Lifecycle觀察者。我們需要自定義類實作LifecycleObserver,通過注解的方式可觀察生命周期方法。
- LifecycleOwner:Lifecycle持有者。讓Activity或者fragment實作該接口,當生命周期改變是事件會被LifecycleObserver接收到。
- Lifecycle:生命周期抽象類。持有添加和移除監聽方法。定義State和Event枚舉。
- LifecycleRegistry:Lifecycle的實作類。
- State:目前生命周期所處狀态。Lifecycle 将 Activity 的生命周期函數對應成 State .
- Event:目前生命周期變化所對應的事件。State 變化觸發 Event 事件,事件會被注冊的觀察者LifecycleObserver 接收處理。
Event枚舉:
public enum Event {
ON_CREATE,
ON_START,
ON_RESUME,
ON_PAUSE,
ON_STOP,
ON_DESTROY,
ON_ANY
}
State枚舉:
public enum State {
DESTROYED,
INITIALIZED,
CREATED,
STARTED,
RESUMED;
public boolean isAtLeast(@NonNull State state) {
return compareTo(state) >= 0;
}
}
State和Event的對應關系:
Lifecycle使用
如何項目已經遷移到AndroidX了,那麼就不需要額外導包,因為AndroidX已經包含了Jetpack相關元件了。如果沒有遷移,則在build.gradle中配置如下:
dependencies {
def lifecycle_version = "1.1.1"
// ViewModel and LiveData
implementation "android.arch.lifecycle:extensions:$lifecycle_version"
// alternatively - just ViewModel // For Kotlin use viewmodel-ktx
implementation "android.arch.lifecycle:viewmodel:$lifecycle_version"
// alternatively - just LiveData
implementation "android.arch.lifecycle:livedata:$lifecycle_version"
// alternatively - Lifecycles only (no ViewModel or LiveData).
// Support library depends on this lightweight import
implementation "android.arch.lifecycle:runtime:$lifecycle_version"
// For Kotlin use kapt instead of annotationProcessor
annotationProcessor "android.arch.lifecycle:compiler:$lifecycle_version"
// alternately - if using Java8, use the following instead of compiler
implementation "android.arch.lifecycle:common-java8:$lifecycle_version"
// optional - ReactiveStreams support for LiveData
implementation "android.arch.lifecycle:reactivestreams:$lifecycle_version"
// optional - Test helpers for LiveData
testImplementation "android.arch.core:core-testing:$lifecycle_version"
配置完成後我們先定義一個類實作LifecycleObserver:
class MyObserver : LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
fun connectListener() {
Log.e("MyObserver","==ON_RESUME==")
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
fun disconnectListener() {
Log.e("MyObserver","==ON_PAUSE==")
}
}
接受事件是通過注解OnLifecycleEvent來完成的,參數即為上文中的Event枚舉。
接下來我們在Activity中添加這個觀察者:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
lifecycle.addObserver(MyObserver())
}
}
這就是最簡單的使用,這個時候我們其實已經可以監聽到Activity的生命周期變化了。
com.jetpack.jetpackdemo E/MyObserver: ==ON_RESUME==
com.jetpack.jetpackdemo E/MyObserver: ==ON_PAUSE==
這樣使用,會不會有個疑問呢?我們在Observer中注冊了Event事件,但是在Activity的生命周期方法中并沒有指定State狀态。這是如何做到關聯的呢?在Android Support Library 26.1.0 及其之後的版本,Activity和Fragment已經預設實作了LifecycleOwner接口,是以不需要我們在重新設定。
自定義Lifecycle
當我們有些類沒有實作AppCompatActivity的時候我們也想使用Lifecycle,那麼就需要自定義了,也就是需要我們自己實作
LifecycleOwner接口。MyObserver類不變,MainActivity類改變如下:
class MainActivity : Activity(), LifecycleOwner {
private lateinit var lifecycleRegistry: LifecycleRegistry
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
lifecycleRegistry = LifecycleRegistry(this)
lifecycle.addObserver(MyObserver())
}
override fun onResume() {
super.onResume()
lifecycleRegistry.currentState = Lifecycle.State.RESUMED
}
override fun onPause() {
super.onPause()
lifecycleRegistry.currentState = Lifecycle.State.DESTROYED
}
override fun getLifecycle(): Lifecycle {
return lifecycleRegistry
}
}
這樣就是所有的設定必須由我們自己來完成。列印結果還是一樣的,如下:
com.jetpack.jetpackdemo E/MyObserver: ==ON_RESUME==
com.jetpack.jetpackdemo E/MyObserver: ==ON_PAUSE==
總結
本文主要是介紹了Lifecycle相關的API以及簡單的使用。在實際項目中還是要結合ViewModel和LiveData來使用。通過ViewModel來擷取所需資料,并通過觀察LiveData對象将資料變化反映到視圖中。後續文章我們将繼續介紹ViewModel和LiveData的使用。
推薦閱讀
還不知道Android Jetpack是什麼?你就out了
Jetpack架構元件 — LiveData與ViewModel入坑詳解
Android Jetpack架構元件 — Room入坑詳解