*本篇文章已授權(quán)微信公眾號 guolin_blog (郭霖)獨家發(fā)布
Lifecycle是Android Architecture Components的一員,這玩意兒挺方便的,它是能感知Activity和Fragment的生命周期的.
一、使用Lifecycle
1. 引入Lifecycle
我們來看一下如何引入:
- 非androidX項目引入:
//運行時
implementation "android.arch.lifecycle:runtime:1.1.1"
// 編譯期
annotationProcessor "android.arch.lifecycle:compiler:1.1.1"
- androidX項目引入:
androidX是support庫的新時代,Google正在將support遷移到androidx中.
implementation "androidx.lifecycle:lifecycle-runtime:2.0.0"
implementation "androidx.lifecycle:lifecycle-extensions:2.0.0"
implementation "androidx.lifecycle:lifecycle-common-java8:2.0.0"
annotationProcessor "androidx.lifecycle:lifecycle-compiler:2.0.0"
2. 創(chuàng)建生命周期觀察者
public class MyObserver implements LifecycleObserver {
private static final String TAG = "MyObserver";
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
public void onCreate() {
Log.w(TAG, "onCreate: ");
}
@OnLifecycleEvent(Lifecycle.Event.ON_START)
public void onStart() {
Log.w(TAG, "onStart: ");
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public void onResume() {
Log.w(TAG, "onResume: ");
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
public void onPause() {
Log.w(TAG, "onPause: ");
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
public void onStop() {
Log.w(TAG, "onStop: ");
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void onDestroy() {
Log.w(TAG, "onDestroy: ");
}
}
我們首先創(chuàng)建了一個類,它實現(xiàn)了LifecycleObserver接口,并且我寫了幾個模擬生命周期的方法,并在每個方法上加上了注解.
3. 觀察生命周期
然后我在Activity中這樣寫:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//添加一個生命周期觀察者 getLifecycle()是FragmentActivity中的方法
MyObserver observer = new MyObserver();
getLifecycle().addObserver(observer);
}
}
我們將項目運行起來,觀察結(jié)果:
2019-03-12 22:14:26.672 15790-15790/? W/MyObserver: onCreate:
2019-03-12 22:14:26.676 15790-15790/? W/MyObserver: onStart:
2019-03-12 22:14:26.679 15790-15790/? W/MyObserver: onResume:
2019-03-12 22:15:13.054 15790-15790/? W/MyObserver: onPause:
2019-03-12 22:15:13.234 15790-15790/? W/MyObserver: onStop:
2019-03-12 22:15:13.241 15790-15790/? W/MyObserver: onDestroy:
我們發(fā)現(xiàn),不管Activity的生命周期如何變化,我創(chuàng)建的觀察者總是能夠監(jiān)聽到響應(yīng)的生命周期變化,并且變化時還會回調(diào)我寫的生命周期方法(比如:public void onDestroy()).
方不方便? 你可能會問,這有啥用? 用處大了,比如我現(xiàn)在Presenter中就可以很方便的監(jiān)聽Activity中的生命周期,從而進行一些相應(yīng)的操作和處理.
二、Lifecycle原理解析
1. 從使用處入手
我們從使用的地方入手
MyObserver observer = new MyObserver();
getLifecycle().addObserver(observer);
getLifecycle()方法點進去是FragmentActivity,看注釋意思是返回生命周期提供者的Lifecycle
/**
* Returns the Lifecycle of the provider.
*/
@Override
public Lifecycle getLifecycle() {
return super.getLifecycle();
}
再跟著super.getLifecycle();進入,來到了androidx.core.app.ComponentActivity,可以看到,ComponentActivity是繼承自Activity并實現(xiàn)了LifecycleOwner(該接口的作用是標記類有Android的生命周期的,比如Activity和Fragment)接口.
public class ComponentActivity extends Activity
implements LifecycleOwner, KeyEventDispatcher.Component {
private LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);
@Override
public Lifecycle getLifecycle() {
return mLifecycleRegistry;
}
}
/**
* A class that has an Android lifecycle
*/
public interface LifecycleOwner {
@NonNull
Lifecycle getLifecycle();
}
那么其實最終是返回的LifecycleRegistry,它是Lifecycle的子類
Lifecycle是一個抽象類,里面有3個方法(添加觀察者和移除觀察者,獲取當前的狀態(tài)),還有一些狀態(tài)的枚舉定義.
public abstract class Lifecycle {
@MainThread
public abstract void addObserver(@NonNull LifecycleObserver observer);
@MainThread
public abstract void removeObserver(@NonNull LifecycleObserver observer);
@MainThread
@NonNull
public abstract State getCurrentState();
@SuppressWarnings("WeakerAccess")
public enum Event {
/**
* Constant for onCreate event of the {@link LifecycleOwner}.
*/
ON_CREATE,
/**
* Constant for onStart event of the {@link LifecycleOwner}.
*/
ON_START,
/**
* Constant for onResume event of the {@link LifecycleOwner}.
*/
ON_RESUME,
/**
* Constant for onPause event of the {@link LifecycleOwner}.
*/
ON_PAUSE,
/**
* Constant for onStop event of the {@link LifecycleOwner}.
*/
ON_STOP,
/**
* Constant for onDestroy event of the {@link LifecycleOwner}.
*/
ON_DESTROY,
/**
* An {@link Event Event} constant that can be used to match all events.
*/
ON_ANY
}
@SuppressWarnings("WeakerAccess")
public enum State {
DESTROYED,
INITIALIZED,
CREATED,
STARTED,
RESUMED;
public boolean isAtLeast(@NonNull State state) {
return compareTo(state) >= 0;
}
}
}
LifecycleRegistry是Lifecycle的一個實現(xiàn),它是用在Fragment和Activity上的,它可以處理多個生命周期觀察者. 具體它有什么作用,后面再講.
2. ReportFragment的由來
下面是ComponentActivity的onCreate()方法.
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ReportFragment.injectIfNeededIn(this);
}
可以看到,在上面搞了一句,注入一個ReportFragment(報告Fragment? 紀檢委員? 打小報告的? 當然,我只是猜測).
有一點眉目了,其實就是在Activity中搞了一個Fragment,Fragment的生命周期我們知道了,當然就知道了Activity的生命周期,接著通知相關(guān)的觀察者即可.當然,這個Fragment是沒有界面的. 我們來看看,這個注入的方法干了啥.
public class ReportFragment extends Fragment {
private static final String REPORT_FRAGMENT_TAG = "androidx.lifecycle"
+ ".LifecycleDispatcher.report_fragment_tag";
public static void injectIfNeededIn(Activity activity) {
// ProcessLifecycleOwner should always correctly work and some activities may not extend
// FragmentActivity from support lib, so we use framework fragments for activities
android.app.FragmentManager manager = activity.getFragmentManager();
if (manager.findFragmentByTag(REPORT_FRAGMENT_TAG) == null) {
manager.beginTransaction().add(new ReportFragment(), REPORT_FRAGMENT_TAG).commit();
// Hopefully, we are the first to make a transaction.
manager.executePendingTransactions();
}
}
其實這個injectIfNeededIn()看起來像是注入的方法干的就是將Fragment添加到Activity中,
來看看這個ReportFragment的生命周期方法都干了些啥,
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
dispatchCreate(mProcessListener);
dispatch(Lifecycle.Event.ON_CREATE);
}
@Override
public void onStart() {
super.onStart();
dispatchStart(mProcessListener);
dispatch(Lifecycle.Event.ON_START);
}
private void dispatchCreate(ActivityInitializationListener listener) {
if (listener != null) {
listener.onCreate();
}
}
- 通過調(diào)用dispatchCreate(mProcessListener)方法,感覺從命名上(是不是有點像
dispatchTouchEvent())看就知道是在干啥了: 分發(fā)當前的生命周期事件. - dispatch(Lifecycle.Event.ON_START); 感覺這個方法也像是在分發(fā)事件.
我們跟著這個mProcessListener來看看是在哪里設(shè)置的
/**
* Class that provides lifecycle for the whole application process.
*/
public class ProcessLifecycleOwner implements LifecycleOwner {
//注意,我是一個單例
private static final ProcessLifecycleOwner sInstance = new ProcessLifecycleOwner();
static void init(Context context) {
sInstance.attach(context);
}
void attach(Context context) {
mHandler = new Handler();
mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE);
Application app = (Application) context.getApplicationContext();
app.registerActivityLifecycleCallbacks(new EmptyActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
ReportFragment.get(activity).setProcessListener(mInitializationListener);
}
@Override
public void onActivityPaused(Activity activity) {
activityPaused();
}
@Override
public void onActivityStopped(Activity activity) {
activityStopped();
}
});
}
}
//Activity的監(jiān)聽器
ActivityInitializationListener mInitializationListener =
new ActivityInitializationListener() {
@Override
public void onCreate() {
}
@Override
public void onStart() {
activityStarted();
}
@Override
public void onResume() {
activityResumed();
}
private final LifecycleRegistry mRegistry = new LifecycleRegistry(this);
//Activity創(chuàng)建的時候,分發(fā)Lifecycle.Event.ON_START事件
void activityStarted() {
mStartedCounter++;
if (mStartedCounter == 1 && mStopSent) {
mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START);
mStopSent = false;
}
}
ReportFragment.java
static ReportFragment get(Activity activity) {
return (ReportFragment) activity.getFragmentManager().findFragmentByTag(
REPORT_FRAGMENT_TAG);
}
ProcessLifecycleOwner看起來就像是老大哥,給整個APP提供lifecycle的,也就是說通過它我們可以觀察到整個應(yīng)用程序的生命周期. 如何做到的? ProcessLifecycleOwner的attach()中registerActivityLifecycleCallbacks()注冊了一個監(jiān)聽器,一旦有Activity創(chuàng)建就給它設(shè)置一個Listener.這樣就保證了每個ReportFragment都有Listener.
既然是一個全局的單例,并且可以監(jiān)聽整個應(yīng)用程序的生命周期,那么,肯定一開始就需要初始化.
既然沒有讓我們在Application里面初始化,那么肯定就是在ContentProvider里面初始化的.
3. 初始化
ps: 這里穿插一個小知識點: ContentProvider的onCreate()方法執(zhí)行時間比Application的onCreate()執(zhí)行時間還要早,而且肯定會執(zhí)行.所以在ContentProvider的onCreate()方法里面初始化幾個特殊的小東西是沒啥問題的.
我們跟著ProcessLifecycleOwner的init()方法的調(diào)用處,來到了ProcessLifecycleOwnerInitializer,果不其然,它是一個ContentProvider.并且,在這里,真的就初始化了2個小東西.
public class ProcessLifecycleOwnerInitializer extends ContentProvider {
@Override
public boolean onCreate() {
LifecycleDispatcher.init(getContext());
ProcessLifecycleOwner.init(getContext());
return true;
}
}
- ProcessLifecycleOwner初始化就不說了,是拿來觀察整個應(yīng)用的生命周期的,其原理就是利用ReportFragment,我們稍后詳細到來.
- LifecycleDispatcher尤其重要.
class LifecycleDispatcher {
static void init(Context context) {
...
//registerActivityLifecycleCallbacks 注冊一個監(jiān)聽器
((Application) context.getApplicationContext())
.registerActivityLifecycleCallbacks(new DispatcherActivityCallback());
}
}
static class DispatcherActivityCallback extends EmptyActivityLifecycleCallbacks {
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
//又來注入咯
ReportFragment.injectIfNeededIn(activity);
}
@Override
public void onActivityStopped(Activity activity) {
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
}
初始化的時候,就注冊了一個監(jiān)聽器,每個創(chuàng)建的時候都給它注入一個ReportFragment.咦?這里又來注入一次,不是每個Activity都注冊了一次么,在ComponentActivity中,搞啥玩意兒?
我猜,,可能是為了兼容吧.2次注入,確保萬無一失.而且這個injectIfNeededIn()方法,內(nèi)部實現(xiàn)是只會成功注入一次的,所以多調(diào)用一次,無所謂.
4. 分發(fā)事件
相當于,到了這里,應(yīng)用程序里面的任何一個Activity都會被注入一個ReportFragment.而注入的這個無界面的ReportFragment是可以觀察到當然Activity的生命周期的.
下面我們來仔細看一下,這個事件是如何一步步分發(fā)下去的.
ReportFragment.java
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
dispatchCreate(mProcessListener);
dispatch(Lifecycle.Event.ON_CREATE);
}
private void dispatch(Lifecycle.Event event) {
Activity activity = getActivity();
if (activity instanceof LifecycleRegistryOwner) {
((LifecycleRegistryOwner) activity).getLifecycle().handleLifecycleEvent(event);
return;
}
if (activity instanceof LifecycleOwner) {
//獲取Activity中的LifecycleRegistry
Lifecycle lifecycle = ((LifecycleOwner) activity).getLifecycle();
if (lifecycle instanceof LifecycleRegistry) {
((LifecycleRegistry) lifecycle).handleLifecycleEvent(event);
}
}
}
不知道小伙伴兒們是否記得ComponentActivity是實現(xiàn)了LifecycleOwner的.
public class ComponentActivity extends Activity
implements LifecycleOwner
下面我們獲取到Activity中的LifecycleRegistry,下面的代碼做了精簡,只保留關(guān)鍵代碼
public void handleLifecycleEvent(@NonNull Lifecycle.Event event) {
State next = getStateAfter(event);
moveToState(next);
}
private void moveToState(State next) {
......
sync();
......
}
private void sync() {
LifecycleOwner lifecycleOwner = mLifecycleOwner.get();
//循環(huán) 遍歷所有觀察者
while (...) {
....
//分發(fā)事件
forwardPass(lifecycleOwner);
}
}
private void forwardPass(LifecycleOwner lifecycleOwner) {
Iterator<Entry<LifecycleObserver, ObserverWithState>> ascendingIterator =
mObserverMap.iteratorWithAdditions();
while (ascendingIterator.hasNext() && !mNewEventOccurred) {
Entry<LifecycleObserver, ObserverWithState> entry = ascendingIterator.next();
ObserverWithState observer = entry.getValue();
while ((observer.mState.compareTo(mState) < 0 && !mNewEventOccurred
&& mObserverMap.contains(entry.getKey()))) {
pushParentState(observer.mState);
//分發(fā)事件
observer.dispatchEvent(lifecycleOwner, upEvent(observer.mState));
popParentState();
}
}
}
上面的observer其實是一個ObserverWithState對象,
static class ObserverWithState {
State mState;
GenericLifecycleObserver mLifecycleObserver;
ObserverWithState(LifecycleObserver observer, State initialState) {
mLifecycleObserver = Lifecycling.getCallback(observer);
mState = initialState;
}
void dispatchEvent(LifecycleOwner owner, Event event) {
State newState = getStateAfter(event);
mState = min(mState, newState);
//生命周期變了.... 關(guān)鍵代碼
mLifecycleObserver.onStateChanged(owner, event);
mState = newState;
}
}
在ObserverWithState的構(gòu)造方法中,通過 Lifecycling.getCallback(observer)根據(jù)傳進來的 observer ,構(gòu)造了一個 GenericLifecycleObserver 類型的 mLifecycleObserver ,我們跟進去看一下.
static GenericLifecycleObserver getCallback(Object object) {
if (object instanceof FullLifecycleObserver) {
return new FullLifecycleObserverAdapter((FullLifecycleObserver) object);
}
if (object instanceof GenericLifecycleObserver) {
return (GenericLifecycleObserver) object;
}
final Class<?> klass = object.getClass();
int type = getObserverConstructorType(klass);
if (type == GENERATED_CALLBACK) {
List<Constructor<? extends GeneratedAdapter>> constructors =
sClassToAdapters.get(klass);
if (constructors.size() == 1) {
GeneratedAdapter generatedAdapter = createGeneratedAdapter(
constructors.get(0), object);
return new SingleGeneratedAdapterObserver(generatedAdapter);
}
GeneratedAdapter[] adapters = new GeneratedAdapter[constructors.size()];
for (int i = 0; i < constructors.size(); i++) {
adapters[i] = createGeneratedAdapter(constructors.get(i), object);
}
return new CompositeGeneratedAdaptersObserver(adapters);
}
return new ReflectiveGenericLifecycleObserver(object);
}
這個方法大概意思就是,根據(jù)傳進的LifecycleObserver進行判斷,構(gòu)造一個GenericLifecycleObserver(目前是只有4個子類:FullLifecycleObserverAdapter、SingleGeneratedAdapterObserver、CompositeGeneratedAdaptersObserver、ReflectiveGenericLifecycleObserver)的對象.
5. 依賴注入
首先,這里穿插一點.我們在引入lifecycle時添加了語句annotationProcessor "android.arch.lifecycle:compiler:1.1.1",這個其實是注解處理器的依賴.
引入這個之后,會自動生成xxx_LifecycleAdapter的文件,上面的demo中生成的是MyObserver_LifecycleAdapter文件,其內(nèi)容如下:
public class MyObserver_LifecycleAdapter implements GeneratedAdapter {
final MyObserver mReceiver;
MyObserver_LifecycleAdapter(MyObserver receiver) {
this.mReceiver = receiver;
}
@Override
public void callMethods(LifecycleOwner owner, Lifecycle.Event event, boolean onAny,
MethodCallsLogger logger) {
boolean hasLogger = logger != null;
if (onAny) {
return;
}
if (event == Lifecycle.Event.ON_CREATE) {
if (!hasLogger || logger.approveCall("onCreate", 1)) {
mReceiver.onCreate();
}
return;
}
if (event == Lifecycle.Event.ON_START) {
if (!hasLogger || logger.approveCall("onStart", 1)) {
mReceiver.onStart();
}
return;
}
if (event == Lifecycle.Event.ON_RESUME) {
if (!hasLogger || logger.approveCall("onResume", 1)) {
mReceiver.onResume();
}
return;
}
if (event == Lifecycle.Event.ON_PAUSE) {
if (!hasLogger || logger.approveCall("onPause", 1)) {
mReceiver.onPause();
}
return;
}
if (event == Lifecycle.Event.ON_STOP) {
if (!hasLogger || logger.approveCall("onStop", 1)) {
mReceiver.onStop();
}
return;
}
if (event == Lifecycle.Event.ON_DESTROY) {
if (!hasLogger || logger.approveCall("onDestroy", 1)) {
mReceiver.onDestroy();
}
return;
}
}
}
因為我們的事件是聲明在MyObserver的方法注解上面的,每次去反射取這些東西,比較耗性能.那么我們通過該依賴庫,把這些標注了的方法進行預(yù)處理,然后直接回調(diào)這些方法,避免反射,進行提高性能.666,佩服.
有了上面的知識之后,分析getCallback()方法,不難發(fā)現(xiàn),因為MyObserver_LifecycleAdapter只有一個構(gòu)造方法,那么就會構(gòu)造出SingleGeneratedAdapterObserver.而SingleGeneratedAdapterObserver內(nèi)部其實就是調(diào)用一下方法而已.
public class SingleGeneratedAdapterObserver implements GenericLifecycleObserver {
private final GeneratedAdapter mGeneratedAdapter;
SingleGeneratedAdapterObserver(GeneratedAdapter generatedAdapter) {
mGeneratedAdapter = generatedAdapter;
}
@Override
public void onStateChanged(LifecycleOwner source, Lifecycle.Event event) {
mGeneratedAdapter.callMethods(source, event, false, null);
mGeneratedAdapter.callMethods(source, event, true, null);
}
}
上面的mGeneratedAdapter其實就是我們的MyObserver_LifecycleAdapter.好了,結(jié)束了. 生命周期事件從Activity開始,然后到打小報告的ReportFragment那里出來,輾轉(zhuǎn)發(fā)側(cè),終于到了我們定義的觀察者,不容易啊.谷歌工程師寫的代碼就是牛逼.
