前言
因為公司要用到Jetpack缕允,所以這邊也就聊聊下Jetpack之一的Lifecycles,順便做下筆記來加深自己對這一塊的理解
Jetpack
Jetpack是什么呢掂恕?Jetpack就一個開發(fā)集合包(就是我們平時用到的庫那些)拖陆,用官方的話說就是
Android Jetpack 組件是庫的集合,這些庫是為協(xié)同工作而構(gòu)建的懊亡,不過也可以單獨采用依啰,同時利用 Kotlin 語言功能幫助您提高工作效率〉暝妫可全部使用速警,也可混合搭配叹誉!
Lifecycles
Lifecycles是Jetpack當中的一個來解決生命周期管理問題的組件通過監(jiān)聽生命周期的方式(Handling Lifecycles with Lifecycle-Aware Components)
常規(guī)來說,如果我們的類不是Activity的話(廣播\碎片另說)闷旧,那么它是沒有生命周期的长豁。但在開發(fā)過程中,如我們的MVP模式忙灼,我們需要在Presenter里回調(diào)View的接口來更新UI匠襟,如果不對Presenter進行生命周期做處理的話,是很容易發(fā)生內(nèi)存泄漏問題的该园,所以為了讓Presenter感知Activity的生命周期酸舍,通常會寫出如下代碼
public interface IPresenter {
void onCreate();
void onStart();
void onResume();
void onPause();
void onStop();
void onDestroy();
}
Presenter實現(xiàn)這些接口,然后在對應的Activity里回調(diào)這些接口里初,完成生命周期管理啃勉。這個方法通俗易懂,好不好用另說青瀑,但代碼量肯定多了璧亮,每個Presenter都要實現(xiàn)IPresenter 。
而Lifecycles就是實現(xiàn)這一功能而推出的斥难,它是一個可以被其他對象觀察其生命周期的類枝嘶,Lifecycles是基于觀察者模式實現(xiàn)的來對外響應生命周期的變化的,這里面有2個枚舉變量Event和Evenet來一一對應(到時候看用法就知道了)哑诊。
導入
正常情況下使用Android studio 3.2 以上的版本新建項目都是可以直接用的(這段可以直接跳過)
首先我們要依賴Google倉庫群扶,在project -> build.gradle里
repositories {
//一般來說自動生成的項目都會默認依賴Google和Jcenter倉庫的
google()
jcenter()
}
然后是Module -> build.gradle
dependencies {
def lifecycle_version = "2.0.0"
// ViewModel and LiveData
implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version"
// alternatively - just ViewModel
implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version" // For Kotlin use lifecycle-viewmodel-ktx
// alternatively - just LiveData
implementation "androidx.lifecycle:lifecycle-livedata:$lifecycle_version"
// alternatively - Lifecycles only (no ViewModel or LiveData). Some UI
// AndroidX libraries use this lightweight import for Lifecycle
implementation "androidx.lifecycle:lifecycle-runtime:$lifecycle_version"
annotationProcessor "androidx.lifecycle:lifecycle-compiler:$lifecycle_version" // For Kotlin use kapt instead of annotationProcessor
// alternately - if using Java8, use the following instead of lifecycle-compiler
implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"
// optional - ReactiveStreams support for LiveData
implementation "androidx.lifecycle:lifecycle-reactivestreams:$lifecycle_version" // For Kotlin use lifecycle-reactivestreams-ktx
// optional - Test helpers for LiveData
testImplementation "androidx.arch.core:core-testing:$lifecycle_version"
}
這個是Google官方文檔的導入說明,因為一般來說LiveData镀裤、ViewModel竞阐,Lifecycles都是會一起用到的,你可以看注釋按需導入暑劝。
使用
我們可以讓一個類實現(xiàn)LifecycleObserver接口后通過注解的方式來監(jiān)聽對應的生命周期
class MyObserver : LifecycleObserver{
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
fun lifecycleOnCreate(){
Log.e(TAG,"lifecycleOnCreate")
}
@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun lifecycleOnStart(){
Log.e(TAG,"lifecycleOnStart")
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
fun lifecycleOnResume(){
Log.e(TAG,"lifecycleOnResume")
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
fun lifecycleOnPause(){
Log.e(TAG,"lifecycleOnPause")
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
fun lifecycleOnStop(){
Log.e(TAG,"lifecycleOnStop")
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
fun lifecycleOnDestroy(){
Log.e(TAG,"lifecycleOnADestroy")
}
@OnLifecycleEvent(Lifecycle.Event.ON_ANY)
fun lifecycleOnAny(){
Log.e(TAG,"lifecycleOnAny")
}
}
然后通過在相應的Activity里addObserver()即可完成監(jiān)聽(在onResume之前)骆莹,方便觀察我們再在對應的生命周期打印log
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
lifecycle.addObserver(MyObserver())
Log.e(TAG,"onCreate")
}
override fun onStart() {
super.onStart()
Log.e(TAG,"onStart")
}
override fun onResume() {
super.onResume()
Log.e(TAG,"onResume")
}
override fun onPause() {
super.onPause()
Log.e(TAG,"onPause")
}
override fun onStop() {
super.onStop()
Log.e(TAG,"onStop")
}
override fun onDestroy() {
super.onDestroy()
Log.e(TAG,"onDestroy")
}
}
可以看到:
- onAny是在任何一個生命周期都會被調(diào)用
- Lifecycles的監(jiān)聽在onCreate()、onStart()担猛、onResume()之后調(diào)用的幕垦,而onPause()、onStop()傅联、onDestroy()則是之前調(diào)用
其實很容易理解Lifecycles如果在onPause()先改、onStop()、onDestroy()如果在之后調(diào)用的話蒸走,那我還有用他來干嘛仇奶,我就是要在那個時間段進行某些操作的,之后再調(diào)不就晚了比驻?
LifecycleOwner
簡單得說就是Activity需要實現(xiàn)LifecycleOwner才有剛剛上圖說展示的Lifecycles效果该溯,但是岛抄,如果你的Android Support 版本是v26.1.0以上,或者使用的是AndroidX狈茉,那么你可以不用理這個弦撩,因為谷歌已經(jīng)幫我們弄好了
LifecycleOwner是一個有生命周期的接口,與LifecycleObserver里面的生命周期相對應论皆,因為Lifecycles是基于觀察者模式實現(xiàn)的益楼,LifecycleObserver是觀察者,那么被觀察者就是LifecycleOwner点晴。
而LifecycleOwner里面有一個getLifecycle()方法且必須被實現(xiàn)感凤,是用來獲取到觀察者的。
在Activity里面使用Lifecycles時粒督,關(guān)鍵是這一句代碼
lifecycle.addObserver(MyObserver())
事實上lifecycle里調(diào)用的就是這個方法
/**
* Returns the Lifecycle of the provider.
*
* @return The lifecycle of the provider.
*/
@Override
public Lifecycle getLifecycle() {
return super.getLifecycle();
}
那么老版本的Activity要怎么實現(xiàn)LifecycleOwner呢陪竿?
實現(xiàn)LifecycleOwner接口,并在對應的生命周期進行操作(和IPresenter一模一樣)
class MainActivity : AppCompatActivity(),LifecycleOwner {
private lateinit var mLifecycleRegistry: LifecycleRegistry
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
mLifecycleRegistry = LifecycleRegistry(this)
mLifecycleRegistry.markState(Lifecycle.State.CREATED)
mLifecycleRegistry.addObserver(MyObserver())
}
override fun onStart() {
super.onStart()
mLifecycleRegistry.markState(Lifecycle.State.STARTED)
}
override fun onResume() {
super.onResume()
mLifecycleRegistry.markState(Lifecycle.State.RESUMED)
}
override fun onPause() {
super.onPause()
mLifecycleRegistry.markState(Lifecycle.State.STARTED)
}
override fun onStop() {
super.onStop()
mLifecycleRegistry.markState(Lifecycle.State.CREATED)
}
override fun onDestroy() {
super.onDestroy()
mLifecycleRegistry.markState(Lifecycle.State.DESTROYED)
}
override fun getLifecycle(): Lifecycle {
return mLifecycleRegistry
}
}
眼尖的小伙伴肯定看到了屠橄,onCreat()和onStop()共用了CREATED族跛,onStart()和onPause()公用了STARTED這個狀態(tài),因為在Activity的生命周期里锐墙,這4個生命周期也是互相對應了礁哄,為了節(jié)省內(nèi)存,谷歌干脆就共用了溪北。
結(jié)語
到這里桐绒,Lifecycles的用法也已經(jīng)說完了,如何用Lifecycles封裝基類相信不用說大家也有個思路了之拨,其實Lifecycles的用法不止這些茉继,而之后的LiveData和ViewModel才是更厲害的,但這3個是相輔相成的蚀乔,所以就先來講下Lifecycles烁竭。