摘要:使用詳解使用詳解源碼解剖源碼解剖地址技術人,一位不羈的碼農。在中,它默認為我們初始化,作為一個成員變量。在方法中,它會判斷我們是否已經添加,沒有的話,添加進去。
說在前面本次推出 Android Architecture Components 系列文章,目前寫好了四篇,主要是關于 lifecycle,livedata 的使用和源碼分析,其余的 Navigation, Paging library,Room,WorkMannager 等春節結束之后會更新,歡迎關注我的公眾號,有更新的話會第一時間會在公眾號上面通知。
Android lifecycle 使用詳解
Android LiveData 使用詳解
Android lifecyle 源碼解剖
Android livedata 源碼解剖
github sample 地址: ArchiteComponentsSample
Android 技術人,一位不羈的碼農。
前兩篇博客,我們已經講解了 lifecycle ,liveData, ViewModel 的使用,這一篇博客,讓我們一起來看一下 lifecycle 的原理。
首先我們先來復習一下,如果要自定義 lifecycle,我們要這樣做。
public class CustomLifecycleActivity extends FragmentActivity implements LifecycleOwner {
private LifecycleRegistry mLifecycleRegistry;
private static final String TAG = "CustomLifecycleActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_custom_lifecycle);
mLifecycleRegistry = new LifecycleRegistry(this);
mLifecycleRegistry.markState(Lifecycle.State.CREATED);
getLifecycle().addObserver(new GenericLifecycleObserver() {
@Override
public void onStateChanged(LifecycleOwner source, Lifecycle.Event event) {
Log.d(TAG, "onStateChanged: event = " + event);
}
});
}
@Override
protected void onStart() {
super.onStart();
mLifecycleRegistry.markState(Lifecycle.State.STARTED);
}
@Override
protected void onResume() {
super.onResume();
mLifecycleRegistry.markState(Lifecycle.State.RESUMED);
}
@Override
protected void onDestroy() {
super.onDestroy();
mLifecycleRegistry.markState(Lifecycle.State.DESTROYED);
}
@NonNull
@Override
public Lifecycle getLifecycle() {
return mLifecycleRegistry;
}
}
第一步:先實現 LifecycleOwner 接口,并返回 mLifecycleRegistry
第二步:在 Activity 生命周期變化的時候,調用 mLifecycleRegistry.markState() 方法標記相應的狀態
如果想添加 observer,調用 addObserver 方法添加觀察者,這樣會在 activity 生命周期變化的時候,回調 observer 的 onchange 方法。
我們先來看一下 getLifecycle() 方法, getLifecycle() 它返回的是一個 Lifecycle 的實例,sdk 中默認的實現類為 LifecycleRegistry。
接下來,我們一起來看一下它的 observer 方法。
public void addObserver(@NonNull LifecycleObserver observer) { // 判斷是否是 DESTROYED,如果是將初始狀態置為 DESTROYED,否則為 INITIALIZED State initialState = mState == DESTROYED );
在 addObserver 方法中,它主要干這幾件事情
首先,先初始化狀態, 判斷當前 mState 是否是 DESTROYED,如果是將初始狀態置為 DESTROYED,否則為 INITIALIZED,接著用 ObserverWithState 包裝 observer 和 初始化狀態 initialState
將 observer 作為 key,在緩存的 mObserverMap 中查找是否存在,如果存在,證明該 observer 已經添加過,直接返回回去,不必再進行處理。
addObserver 方法中第 21 行 , isReentrance 一般情況下為 false,什么情況 為 true,暫時未想到,
接下來我們先來看 calculateTargetState 方法。
private State calculateTargetState(LifecycleObserver observer) { // 取出 mObserverMap 的上一個 entry,previous Entryprevious = mObserverMap.ceil(observer); // 如果不為空,獲取它的狀態 State siblingState = previous != null );return min(min(mState, siblingState), parentState); }
首先,取出 mObserverMap 中上一個的 entry,該 LifecycleRegistry 實例如果是第一次調用 addObserver 實例的話,那么是 null,否則是上一個 observer 的 entry
根據 previous 是否為 null,設置 siblingState 的值
判斷 mParentStates 是否為 null,不為 null,取 mParentStates 最后一次的狀態
取 mState, siblingState 最小的狀態 a,再取 a 與 parentState 的狀態 b
public enum State {
DESTROYED,
INITIALIZED,
CREATED,
STARTED,
RESUMED;
public boolean isAtLeast(@NonNull State state) {
return compareTo(state) >= 0;
}
}
State 中,他們排序的順序是 DESTROYED < INITIALIZED < CREATED < STARTED < RESUMED。
我們知道,我們在 activity 的 onCreate 方法中初始化 LifecycleRegistry,并標記它的狀態為 CREATED。當我們第一次在 onCreate 方法調用 addObserver 的時候,在 calculateTargetState 方法中,若是首次調用 previous 為 null,則 siblingState,parentState 為 null, 而 mState 為 CREATED,所以最終的狀態為 CREATED,即 State targetState = calculateTargetState(observer); 中 targetState 為 CREATED
// 取最小的狀態
return min(min(mState, siblingState), parentState);
看完 calculateTargetState 方法,我們回過頭再來看一下 addObserver 方法。
public void addObserver(@NonNull LifecycleObserver observer) { // 省略若干行 // 這里 mAddingObserverCounter 為 0 ,mHandlingEvent 為 false boolean isReentrance = mAddingObserverCounter != 0 || mHandlingEvent; State targetState = calculateTargetState(observer); mAddingObserverCounter++; while ((statefulObserver.mState.compareTo(targetState) < 0 && mObserverMap.contains(observer))) { pushParentState(statefulObserver.mState); statefulObserver.dispatchEvent(lifecycleOwner, upEvent(statefulObserver.mState)); popParentState(); // mState / subling may have been changed recalculate targetState = calculateTargetState(observer); } if (!isReentrance) { // we do sync only on the top level. sync(); } mAddingObserverCounter--; }
這里 statefulObserver.mState 為 DESTROYED 或者 INITIALIZED,肯定比 CREATED 小。而 mObserverMap.contains(observer) 必定為 true,除非我們手動移除掉 mObserverMap。因而,會走進 while循環。
private void pushParentState(State state) {
mParentStates.add(state);
}
private ArrayList mParentStates = new ArrayList<>();
pushParentState(statefulObserver.mState); 很簡單,只是將 statefulObserver 的狀態添加到 mParentStates 集合中。
繼續往下走,接著會調用 statefulObserver.dispatchEvent(lifecycleOwner, upEvent(statefulObserver.mState));
private static Event upEvent(State state) {
switch (state) {
case INITIALIZED:
case DESTROYED:
return ON_CREATE;
case CREATED:
return ON_START;
case STARTED:
return ON_RESUME;
case RESUMED:
throw new IllegalArgumentException();
}
throw new IllegalArgumentException("Unexpected state value " + state);
}
upEvent 方法也很簡單,只是返回它的下一個 event。這里因為他們的 state為 INITIALIZED,所以它會返回 ON_CREATE。
void dispatchEvent(LifecycleOwner owner, Event event) {
State newState = getStateAfter(event);
mState = min(mState, newState);
mLifecycleObserver.onStateChanged(owner, event);
mState = newState;
}
static State getStateAfter(Event event) {
switch (event) {
case ON_CREATE:
case ON_STOP:
return CREATED;
case ON_START:
case ON_PAUSE:
return STARTED;
case ON_RESUME:
return RESUMED;
case ON_DESTROY:
return DESTROYED;
case ON_ANY:
break;
}
throw new IllegalArgumentException("Unexpected event value " + event);
}
這里 event 為 ON_CREATE,所以 newState 也為 CREATED。 mState = min(mState, newState); mState newState,兩者狀態相同,所以 mState 也為 CREATED。接著回調 mLifecycleObserver 的 onStateChanged 方法。所以,這里,會收到我們的 onCreate 事件,與我們的預想相符。
但是我們并沒有在 onStart,onResume, onPause , onStop 和 onDestroy 方法中調用 mLifecycleRegistry.handleLifecycleEvent 方法,它又是怎樣促發 Observer 的 onStateChanged 方法的。這里先不揭曉,我們先來看一下 26.1.0 以后的 AppCompatActivity,待會你就明白了,會感嘆 google 真的牛逼!
我們知道,在 26.1.0 以后,如果我們要使用 lifecycle,我們只需要調用以下的方法即可。
SupportActivitygetLifecycle().addObserver(new GenericLifecycleObserver() {
@Override
public void onStateChanged(LifecycleOwner source, Lifecycle.Event event) {
Log.d(TAG, "onStateChanged: event =" + event);
}
});
跟蹤 getLifecycle() 方法,它會跳轉到 SupportActivity 的 getLifecycle 方法 中。
public class SupportActivity extends Activity implements LifecycleOwner, Component {
private LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ReportFragment.injectIfNeededIn(this);
}
@Override
public Lifecycle getLifecycle() {
return mLifecycleRegistry;
}
}
在 SupportActivity 中,它默認為我們初始化 mLifecycleRegistry,作為一個成員變量。接著,他在 onCreate 方法中調用了 ReportFragment.injectIfNeededIn(this); 方法。
public class ReportFragment extends Fragment {
private static final String REPORT_FRAGMENT_TAG = "android.arch.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 方法中,它會判斷我們是否已經添加 ReportFragment,沒有的話,添加進去。
public class ReportFragment extends Fragment {
private static final String REPORT_FRAGMENT_TAG = "android.arch.lifecycle"
+ ".LifecycleDispatcher.report_fragment_tag";
private ActivityInitializationListener mProcessListener;
private void dispatchCreate(ActivityInitializationListener listener) {
if (listener != null) {
listener.onCreate();
}
}
private void dispatchStart(ActivityInitializationListener listener) {
if (listener != null) {
listener.onStart();
}
}
private void dispatchResume(ActivityInitializationListener listener) {
if (listener != null) {
listener.onResume();
}
}
@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);
}
@Override
public void onResume() {
super.onResume();
dispatchResume(mProcessListener);
dispatch(Lifecycle.Event.ON_RESUME);
}
@Override
public void onPause() {
super.onPause();
dispatch(Lifecycle.Event.ON_PAUSE);
}
@Override
public void onStop() {
super.onStop();
dispatch(Lifecycle.Event.ON_STOP);
}
@Override
public void onDestroy() {
super.onDestroy();
dispatch(Lifecycle.Event.ON_DESTROY);
// just want to be sure that we wont leak reference to an activity
mProcessListener = null;
}
}
然后,它在 onCreat ,onStart, onResume, onPause, onStop, onDestroy 方法中分別調用 dispatch 方法進行分發生命周期。
private void dispatch(Lifecycle.Event event) {
Activity activity = getActivity();
if (activity instanceof LifecycleRegistryOwner) {
((LifecycleRegistryOwner) activity).getLifecycle().handleLifecycleEvent(event);
return;
}
if (activity instanceof LifecycleOwner) {
Lifecycle lifecycle = ((LifecycleOwner) activity).getLifecycle();
if (lifecycle instanceof LifecycleRegistry) {
((LifecycleRegistry) lifecycle).handleLifecycleEvent(event);
}
}
}
在 dispatch 方法中,會先判斷 activity 是不是實現了 LifecycleRegistryOwner ,如果是,直接分發,不過不是,判斷是否實現 LifecycleOwner,獲取它的 lifecycle,調用它 的 handleLifecycleEvent 進行分發。
public class SupportActivity extends Activity implements LifecycleOwner, Component {
private LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this
而很明顯,高版本的 SupportActivity 實現了 LifecycleOwner 接口,并寫 LifecycleOwner.getLifecycle() 是 LifecycleRegistry
普通的 Activity對于 26.1.0 以后的版本,你會發現,對于普通的 Activity,如果你想要使用 lifecycle,你只需要實現 LifecycleOwner 接口即可。當生命周期變化的時候,它也可以回調 Observer 的 onStateChanged 方法。
回到我們前面的問題:
我們并沒有在 onStart,onResume, onPause , onStop 和 onDestroy 方法中調用 mLifecycleRegistry.handleLifecycleEvent 方法,它又是怎樣促發 onStateChanged 方法的
**我們猜想它也是通過 ReportFragment 實現的。**但是在 Activity 的 onCreate 方法中,我們并沒有發現它有添加 ReportFragment,我們在 As 全局搜一下,看哪些地方使用到 ReportFragment。如下圖
從圖中可以看到,有幾個地方使用到他。我們先來看一下 LifecycleDispatcher
class LifecycleDispatcher {
private static final String REPORT_FRAGMENT_TAG = "android.arch.lifecycle"
+ ".LifecycleDispatcher.report_fragment_tag";
private static AtomicBoolean sInitialized = new AtomicBoolean(false);
static void init(Context context) {
if (sInitialized.getAndSet(true)) {
return;
}
// 在 init 方法中,監聽全局 activity 的創建,從而來添加 fragment
((Application) context.getApplicationContext())
.registerActivityLifecycleCallbacks(new DispatcherActivityCallback());
}
@SuppressWarnings("WeakerAccess")
@VisibleForTesting
static class DispatcherActivityCallback extends EmptyActivityLifecycleCallbacks {
private final FragmentCallback mFragmentCallback;
DispatcherActivityCallback() {
mFragmentCallback = new FragmentCallback();
}
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
if (activity instanceof FragmentActivity) {
((FragmentActivity) activity).getSupportFragmentManager()
.registerFragmentLifecycleCallbacks(mFragmentCallback, true);
}
ReportFragment.injectIfNeededIn(activity);
}
@Override
public void onActivityStopped(Activity activity) {
if (activity instanceof FragmentActivity) {
markState((FragmentActivity) activity, CREATED);
}
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
if (activity instanceof FragmentActivity) {
markState((FragmentActivity) activity, CREATED);
}
}
}
// 省略若干代碼
}
可以看到,它 在 init 方法中,通過 context.getApplicationContext() .registerActivityLifecycleCallbacks 監聽全局 activity 的創建,在 activity oncreate 的時候,調用 ReportFragment.injectIfNeededIn(activity) ,從而來添加 fragment,進而分發相應的事件。
那 LifecycleDispatcher 的 init 方法又是在哪里調用的呢? 我們全局搜索一下
public class ProcessLifecycleOwnerInitializer extends ContentProvider {
@Override
public boolean onCreate() {
LifecycleDispatcher.init(getContext());
ProcessLifecycleOwner.init(getContext());
return true;
}
可以看到它是在 ProcessLifecycleOwnerInitializer 的 onCreate 方法中調用的。而 ProcessLifecycleOwnerInitializer 是一個 ContentProvider。我們知道 ContentProvider 一般是在 AndroidManifest 中生命的。
果然,在 extensions-1.1.1.aar 中,我們驚喜地發現,它在 Manifest 里面注冊了。
而 ContentProvider 的 onCreate 方法優先于 Application 的 onCreate 執行,所以在 Application 之前我們就調用了 ProcessLifecycleOwnerInitializer init 方法,監聽了 Activity 的創建,當 Actiivty 創建的時候,會嘗試為 Activity 添加 ReportFragment。而 ReportFragment 會在 Activity 生命周期變化的時候幫助我們分發生命周期。
ContentProvider 的 onCreate 方法優先于 Application 的 onCreate 執行,可以查看這一篇博客 Android系統中的Application和四大組件一些方法的啟動順序和一些坑
ok,我們來梳理一下。
對于 26.1.0 以后的 SupportActivity
它在 Activity onCreate 的時候添加了 ReportFragment,這個 ReportFragment 相當于一個代理,它在 onActivityCreated 的時候 dispatch(Lifecycle.Event.ON_CREATE) 進行分發生命周期,onStart, onResume, onPause, onStop, onDestroy 的時候也是如此。而 在 dispatch 中 它調用了 LifecycleRegistry handleLifecycleEvent 的方法。而 LifecycleRegistry 方法中經過一系列處理,它又調用了 observer 的 onStateChange 方法,去通知相應的 observer。
對于普通的 Activity
它利用了 ContentProvide 的特征,它是在 Application onCreate 之前初始化的,他在 ProcessLifecycleOwnerInitializer oncreate 的時候監聽 Activity 的創建,在 Activity 創建的時候,判斷是否已經添加過 ReportFragment,沒有的話,添加進去。這是一個很巧妙的設計,隱式初始化了 lifecycle。
用流程圖表示如下:
該圖片引用自 Android 架構組件(一)——Lifecycle
Lifecycle 設計借鑒
利用 ProcessLifecycleOwnerInitializer contentProvider 來隱式加載
想一下,如果 ProcessLifecycleOwnerInitializer 不利用 contentProvider 來隱式加載的話,對于 普通的 Activity,舊版本等,如果想使用 lifecycle,那必須在基類中,手動調用 ReportFragment.injectIfNeededIn(activity) 的方法。
利用 fragment 來分發生命周期
利用 fragment 來分發生命周期有兩個優點
將邏輯從 Activity 中剝離出來,減少耦合,方便復用
可以做到在 Activity onCreate 之后才回調 observer 的 CREATED Event 事件。如果是通過 Application registerActivityLifecycleCallbacks 方法來分發生命周期的話,因為 ActivityLifecycleCallbacks 的 onActivityCreated 是在 Activity oncreate 之前調用的。
下一篇:Android livedata 源碼解剖
推薦閱讀:
java 代理模式詳解
觀察者設計模式 Vs 事件委托(java)
Android Fragment 的妙用 - 優雅地申請權限和處理onActivityResult
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/7062.html
摘要:方法中,,當為,并且不等于上一次的值,會增加的計數。鎖住當前沒有人在處理任務處理完畢之后將置為首先,采用同步機制,通過有沒有人在處理任務。說在前面 本次推出 Android Architecture Components 系列文章,目前寫好了四篇,主要是關于 lifecycle,livedata 的使用和源碼分析,其余的 Navigation, Paging library,Room,Wo...
摘要:自動選擇最好路線并支持自動重連擁有自動維護的連接池,減少握手次數,減少請求延遲,共享減少對服務器的請求次數。支持的緩存策略減少重復的網絡請求。擁有輕松處理請求與響應并自動處理數據壓縮。支持自簽名的鏈接,配置有效證書即可。 1.OkHttp簡介: Okhttp與HttpClient、HttpUrlConnection以及Volley類似是一個網絡請求框架,支持連接同一地址的鏈接共享同一個...
閱讀 713·2023-04-25 19:43
閱讀 3910·2021-11-30 14:52
閱讀 3784·2021-11-30 14:52
閱讀 3852·2021-11-29 11:00
閱讀 3783·2021-11-29 11:00
閱讀 3869·2021-11-29 11:00
閱讀 3558·2021-11-29 11:00
閱讀 6105·2021-11-29 11:00