本文首發於微信公衆號「Android開發之旅」,歡迎關注 ,獲取更多技術乾貨java
上一篇文章咱們主要是介紹了Jetpack的由來以及四大組件各包含的組件庫。本篇文章咱們未來學習架構組件中的Lifecycle組件。Lifecycle組件是幫忙咱們管理Activity和Fragment的生命週期,也就是說,當Activity或者Fragment的生命週期發送變化的時候咱們能夠獲得通知。咱們一般會在生命週期方法中調用各類方法或者初始化一些組件亦或是在某個生命週期中調用一些回調,這就致使生命週期相關方法代碼比較臃腫,且耦合性高,不易維護。react
我來來看下官方文檔給出的回調例子:android
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(),這樣就會使代碼難以維護。bash
基於以上種種緣由,Lifecycle正式登場了。微信
Lifecycle管理生命週期也是觀察者模式,其中主要涉及到如下幾個類:LifecycleObserver、LifecycleOwner、Lifecycle、State、Event。架構
Event枚舉:ide
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的對應關係:post
如何項目已經遷移到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接口,因此不須要咱們在從新設置。
當咱們有些類沒有實現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的使用。