最近簡單看了下google推出的框架Jetpack,感受此框架的內容能夠對平時的開發有很大的幫助,也能夠解決不少開發中的問題,對代碼的邏輯和UI界面實現深層解耦,打造數據驅動型UI界面。java
Android Architecture組件是Android Jetpack的一部分,它們是一組庫,旨在幫助開發者設計健壯、可測試和可維護的應用程序,包含一下組件:react
本片文章簡單介紹其中一個組件Lifecycles,只是一個入門使用,後面會陸續介紹每一個組件的使用,但願對沒接觸的同窗有點幫助,共同窗習新的東西。android
Lifecycles是一個持有組件生命週期狀態(如活動或片斷)信息的類,並容許其餘對象觀察此狀態。生命週期使用兩個主要枚舉來跟蹤其關聯組件的生命週期狀態:bash
Lifecycles:生命週期感知組件,從名字中就能夠知道,這個方法是處理生命週期的相關的操做。在平時的開發過程當中,咱們不免有些邏輯的執行是和UI的生命週期相結合的,須要在特定的生命週期中執行相應的方法,咱們平時作的可能就是在View中的每一個週期調用Present中獲取數據的方法,而後在調用View的回調接口更新UI,但如今使用Lifecycles可使用註解和觀察的模式自動調用Observe中定義好的方法。架構
咱們看個簡單的例子,咱們須要在每一個週期Toast週期的名字,那咱們就要在每一個週期方法中調用:框架
override fun onResume() {
super.onResume()
toast("onResume")
}
override fun onPause() {
super.onPause()
toast("onPause")
}
override fun onDestroy() {
super.onDestroy()
toast("onDestroy")
}複製代碼
上述狀況屬於直接調用生命週期方法,當須要調用其餘類中的方法而且須要回調時,此時可能會想到使用接口實現,在相應的生命週期中調用方法,在處理完數據後使用接口回調數據:ide
class MyLocationListener {
public MyLocationListener(Context context, Callback callback) {
// ...
}
void start() {
// connect to system location service
}
void stop() {
// disconnect from system location service
}
}複製代碼
二、調用類中的方法並設置回調post
class MyActivity : AppCompatActivity {
var myLocationListener :MyLocationListener
override fun onCreate(...) {
myLocationListener = new MyLocationListener(this, location -> {
});
}
@Override
override fun onStart() {
super.onStart();
Util.checkUserStatus(result -> {
if (result) {
myLocationListener.start();
}
});
}
@Override
override fun onStop() {
super.onStop();
myLocationListener.stop();
}
}複製代碼
上述是咱們平時開發最經常使用的接口方法,這樣作雖然也很方便,但這種模式致使代碼的高度耦合,而且一般咱們但願實現重量更輕的代碼,這些代碼更易於維護,下面咱們來看看LifeCycles的使用。學習
// ViewModel and LiveData
implementation "android.arch.lifecycle:extensions:$lifecycle_version"
// alternatively - just ViewModel
implementation "android.arch.lifecycle:viewmodel:$lifecycle_version" // use -ktx for Kotlin
// 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"
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"複製代碼
class MyObserver(var lifecycle: Lifecycle, var callback: CallBack) : LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
public fun connectOnCreate() {
p("connectOnCreate")
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public fun connectOnResume() {
p("connectOnResume")
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public fun disConnectOnDestroy() {
p("disConnectOnDestroy")
}
fun p(string: String) {
callback.update(string)
}
}複製代碼
建立Activity並實現LifecyclesOwner,重寫方法:測試
class LifeCyclerActivity : AppCompatActivity(), LifecycleOwner {
}複製代碼
lateinit var lifecycleRegistry: LifecycleRegistry
lifecycleRegistry = LifecycleRegistry(this)
override fun getLifecycle(): Lifecycle {
return lifecycleRegistry
}複製代碼
var myObserver = MyObserver(lifecycle, object : CallBack {
override fun update(string: String) {
Toast.makeText(this@LifeCyclerActivity, string, Toast.LENGTH_SHORT).show()
}
})
lifecycle.addObserver(myObserver)複製代碼
在OnCreate中配置onCreate的標記
lifecycleRegistry.markState(Lifecycle.State.CREATED)複製代碼
添加其餘生命週期回調
override fun onResume() {
super.onResume()
lifecycleRegistry.markState(Lifecycle.State.RESUMED)
}
override fun onDestroy() {
super.onDestroy()
lifecycleRegistry.markState(Lifecycle.State.DESTROYED)
}複製代碼
若是你點擊到SupportActivity中查看的話,會發現SupportActivity自己就實現了LifecycleOwner,LifecyclerActivity中的不少操做都已經在SupportActivity中完成了,那麼上述的使用能夠直接更簡化爲:
class LifeCyclerActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_life_cycler)
var myObserver = MyObserver(lifecycle, object : CallBack {
override fun update() {
Toast.makeText(this@LifeCyclerActivity, "Toast", Toast.LENGTH_SHORT).show()
}
})
lifecycle.addObserver(myObserver)
}
}複製代碼