一、前言
Android Architecture Components是谷歌在Google I/O 2017大會(huì)上發(fā)布一套幫助開(kāi)發(fā)者解決Android架構(gòu)設(shè)計(jì)的方案衡蚂。主要包括兩大塊內(nèi)容:
(1)生命周期相關(guān)的:Lifecycle-aware Components
(2)數(shù)據(jù)庫(kù)解決方案:Room
主要架構(gòu)如下圖:
其中有主要包含了以下幾大組件:
Lifecycle毛甲、LiveData具被、ViewModel、Room一姿。
下面逐一介紹每個(gè)組件:
二叮叹、Lifecycle 管理組件的生命周期
1.Lifecycle介紹
Lifecycle 是android.arch.lifecycle 包下各種類和相關(guān)接口,通過(guò)該Lifecycle 組件可以讓開(kāi)發(fā)者構(gòu)建能夠感知其他組件(主要是Activity,Fragment)的生命周期的變化衬横。也就是說(shuō)通過(guò)注冊(cè)Lifecycle的類,可以監(jiān)聽(tīng)Activity或者Fragment的生命周期的變化遥诉。
2.常規(guī)MVP的實(shí)現(xiàn)
在常規(guī)的MVP模式中我們監(jiān)聽(tīng)Activity的生命周期一般是這樣做的:
首先創(chuàng)建一個(gè)BaseActivityPresenter接口,定義相關(guān)生命周期需要回調(diào)的方法霉翔。
package com.jilian.androidarchitecture;
public interface BaseActivityPresenter {
void onCreate();
void onStart();
void onResume();
void onPause();
void onStop();
void onDestroy();
}
創(chuàng)建ActivityPresenter類實(shí)現(xiàn)BaseActivityPresenter 接口苞笨,在對(duì)應(yīng)的方法中打印。
package com.jilian.androidarchitecture;
import android.util.Log;
public class ActivityPresenter implements BaseActivityPresenter {
private static final String TAG = "ActivityPresenter";
@Override
public void onCreate() {
Log.e(TAG, "onCreate: " );
}
@Override
public void onStart() {
Log.e(TAG, "onStart: " );
}
@Override
public void onResume() {
Log.e(TAG, "onResume: " );
}
@Override
public void onPause() {
Log.e(TAG, "onPause: " );
}
@Override
public void onStop() {
Log.e(TAG, "onStop: " );
}
@Override
public void onDestroy() {
Log.e(TAG, "onDestroy: " );
}
}
創(chuàng)建需要監(jiān)聽(tīng)的生命周期的Activity——MyActivity
package com.jilian.androidarchitecture;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
public class MyActivity extends AppCompatActivity {
private BaseActivityPresenter presenter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
presenter = new ActivityPresenter();
presenter.onCreate();
}
@Override
protected void onResume() {
super.onResume();
presenter.onResume();
}
@Override
protected void onPause() {
super.onPause();
presenter.onPause();
}
@Override
protected void onStop() {
super.onStop();
presenter.onStop();
}
@Override
protected void onDestroy() {
super.onDestroy();
presenter.onDestroy();
}
}
然后在MyActivity的各個(gè)生命周期方法中 調(diào)用presenter中的對(duì)應(yīng)的方法,將數(shù)據(jù)進(jìn)行打印
02-21 14:12:47.739 4328-4328/com.jilian.androidarchitecture E/ActivityPresenter: onCreate:
02-21 14:12:47.744 4328-4328/com.jilian.androidarchitecture E/ActivityPresenter: onResume:
02-21 14:12:49.488 4328-4328/com.jilian.androidarchitecture E/ActivityPresenter: onPause:
02-21 14:12:49.903 4328-4328/com.jilian.androidarchitecture E/ActivityPresenter: onStop:
02-21 14:12:49.904 4328-4328/com.jilian.androidarchitecture E/ActivityPresenter: onDestroy:
以上的做法確實(shí)可以實(shí)現(xiàn)對(duì)Activity的生命周期進(jìn)行監(jiān)聽(tīng)谚中,但是當(dāng)我們需要監(jiān)聽(tīng)其他的Activity的時(shí)候寥枝,我們又需要在另外的一個(gè)Activity中的每一個(gè)生命周期方法調(diào)用presenter中的對(duì)應(yīng)的方法。這樣做會(huì)使得代碼比較冗余某筐。Lifecycle正是解決了該問(wèn)題冠跷。
3. 使用 Lifecycle
我們創(chuàng)建一個(gè)ActivityLifeObserver,實(shí)現(xiàn)BaseActivityPresenter和LifecycleObserver接口弟疆。在對(duì)應(yīng)方法中加上相應(yīng)的 @OnLifecycleEvent注解盗冷,如@OnLifecycleEvent(Lifecycle.Event.ON_CREATE),就是監(jiān)聽(tīng)Activity的onCreat方法仪糖。
package com.jilian.androidarchitecture;
import android.arch.lifecycle.Lifecycle;
import android.arch.lifecycle.LifecycleObserver;
import android.arch.lifecycle.OnLifecycleEvent;
import android.util.Log;
public class ActivityLifeObserver implements BaseActivityPresenter, LifecycleObserver {
private static final String TAG ="ActivityLifeObserver" ;
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
@Override
public void onCreate() {
Log.e(TAG, "onCreate: " );
}
@OnLifecycleEvent(Lifecycle.Event.ON_START)
@Override
public void onStart() {
Log.e(TAG, "onStart: " );
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
@Override
public void onResume() {
Log.e(TAG, "onResume: " );
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
@Override
public void onPause() {
Log.e(TAG, "onPause: " );
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
@Override
public void onStop() {
Log.e(TAG, "onStop: " );
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
@Override
public void onDestroy() {
Log.e(TAG, "onDestroy: " );
}
}
創(chuàng)建需要監(jiān)聽(tīng)的Activity——LifecycleActivity锅劝,實(shí)現(xiàn)LifecycleOwner接口。然后注冊(cè)我們創(chuàng)建的ActivityLifeObserver玻粪。
package com.jilian.androidarchitecture;
import android.arch.lifecycle.Lifecycle;
import android.arch.lifecycle.LifecycleOwner;
import android.arch.lifecycle.LifecycleRegistry;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
public class LifecycleActivity extends AppCompatActivity implements LifecycleOwner {
private LifecycleRegistry registry;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_lifecycle);
registry = new LifecycleRegistry(this);
//注冊(cè)需要監(jiān)聽(tīng)的 Observer
registry.addObserver(new ActivityLifeObserver());
}
@Override
public Lifecycle getLifecycle() {
return registry;
}
}
注冊(cè)完之后就可以完美的監(jiān)聽(tīng)LifecycleActivity 的生命周期的變化劲室。
02-21 14:44:33.965 4328-4328/com.jilian.androidarchitecture E/ActivityLifeObserver: onCreate:
02-21 14:44:33.966 4328-4328/com.jilian.androidarchitecture E/ActivityLifeObserver: onStart:
02-21 14:44:33.969 4328-4328/com.jilian.androidarchitecture E/ActivityLifeObserver: onResume:
02-21 14:44:38.895 4328-4328/com.jilian.androidarchitecture E/ActivityLifeObserver: onPause:
02-21 14:44:39.340 4328-4328/com.jilian.androidarchitecture E/ActivityLifeObserver: onStop:
02-21 14:44:39.341 4328-4328/com.jilian.androidarchitecture E/ActivityLifeObserver: onDestroy:
從上面我們可以看到Lifecycle主要使用步驟:
1.創(chuàng)建ActivityLifeObserver,并在相應(yīng)的方法中添加相應(yīng)的注解充蓝,表明需要監(jiān)聽(tīng)Activity生命周期的哪一個(gè)環(huán)節(jié)喉磁。
2.在Activity中注冊(cè)ActivityLifeObserver,這樣Activity生命周期的變化就能被ActivityLifeObserver感知协怒。