亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

Android lifecyle 源碼解剖

番茄西紅柿 / 1857人閱讀

摘要:使用詳解使用詳解源碼解剖源碼解剖地址技術(shù)人,一位不羈的碼農(nóng)。在中,它默認(rèn)為我們初始化,作為一個(gè)成員變量。在方法中,它會(huì)判斷我們是否已經(jīng)添加,沒有的話,添加進(jìn)去。

說在前面

本次推出 Android Architecture Components 系列文章,目前寫好了四篇,主要是關(guān)于 lifecycle,livedata 的使用和源碼分析,其余的 Navigation, Paging library,Room,WorkMannager 等春節(jié)結(jié)束之后會(huì)更新,歡迎關(guān)注我的公眾號(hào),有更新的話會(huì)第一時(shí)間會(huì)在公眾號(hào)上面通知。

Android lifecycle 使用詳解

Android LiveData 使用詳解

Android lifecyle 源碼解剖

Android livedata 源碼解剖

github sample 地址: ArchiteComponentsSample

Android 技術(shù)人,一位不羈的碼農(nóng)。


前言

前兩篇博客,我們已經(jīng)講解了 lifecycle ,liveData, ViewModel 的使用,這一篇博客,讓我們一起來(lái)看一下 lifecycle 的原理。


從自定義的 lifecycle 說起

首先我們先來(lái)復(fù)習(xí)一下,如果要自定義 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;
    }
}

    第一步:先實(shí)現(xiàn) LifecycleOwner 接口,并返回 mLifecycleRegistry

    第二步:在 Activity 生命周期變化的時(shí)候,調(diào)用 mLifecycleRegistry.markState() 方法標(biāo)記相應(yīng)的狀態(tài)

    如果想添加 observer,調(diào)用 addObserver 方法添加觀察者,這樣會(huì)在 activity 生命周期變化的時(shí)候,回調(diào) observer 的 onchange 方法。

我們先來(lái)看一下 getLifecycle() 方法, getLifecycle() 它返回的是一個(gè) Lifecycle 的實(shí)例,sdk 中默認(rèn)的實(shí)現(xiàn)類為 LifecycleRegistry。

接下來(lái),我們一起來(lái)看一下它的 observer 方法。

public void addObserver(@NonNull LifecycleObserver observer) {
  // 判斷是否是 DESTROYED,如果是將初始狀態(tài)置為 DESTROYED,否則為 INITIALIZED
    State initialState = mState == DESTROYED );

在 addObserver 方法中,它主要干這幾件事情

    首先,先初始化狀態(tài), 判斷當(dāng)前 mState 是否是 DESTROYED,如果是將初始狀態(tài)置為 DESTROYED,否則為 INITIALIZED,接著用 ObserverWithState 包裝 observer 和 初始化狀態(tài) initialState

    將 observer 作為 key,在緩存的 mObserverMap 中查找是否存在,如果存在,證明該 observer 已經(jīng)添加過,直接返回回去,不必再進(jìn)行處理。

    addObserver 方法中第 21 行 , isReentrance 一般情況下為 false,什么情況 為 true,暫時(shí)未想到,

接下來(lái)我們先來(lái)看 calculateTargetState 方法。

private State calculateTargetState(LifecycleObserver observer) {
   // 取出 mObserverMap 的上一個(gè) entry,previous
    Entry previous = mObserverMap.ceil(observer);

   // 如果不為空,獲取它的狀態(tài)
    State siblingState = previous != null );return min(min(mState, siblingState), parentState);
}

    首先,取出 mObserverMap 中上一個(gè)的 entry,該 LifecycleRegistry 實(shí)例如果是第一次調(diào)用 addObserver 實(shí)例的話,那么是 null,否則是上一個(gè) observer 的 entry

    根據(jù) previous 是否為 null,設(shè)置 siblingState 的值

    判斷 mParentStates 是否為 null,不為 null,取 mParentStates 最后一次的狀態(tài)

    取 mState, siblingState 最小的狀態(tài) a,再取 a 與 parentState 的狀態(tài) 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。

我們知道,我們?cè)?activity 的 onCreate 方法中初始化 LifecycleRegistry,并標(biāo)記它的狀態(tài)為 CREATED。當(dāng)我們第一次在 onCreate 方法調(diào)用 addObserver 的時(shí)候,在 calculateTargetState 方法中,若是首次調(diào)用 previous 為 null,則 siblingState,parentState 為 null, 而 mState 為 CREATED,所以最終的狀態(tài)為 CREATED,即 State targetState = calculateTargetState(observer); 中 targetState 為 CREATED

    // 取最小的狀態(tài)
    return min(min(mState, siblingState), parentState);

看完 calculateTargetState 方法,我們回過頭再來(lái)看一下 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,除非我們手動(dòng)移除掉 mObserverMap。因而,會(huì)走進(jìn) while循環(huán)。

private void pushParentState(State state) {
    mParentStates.add(state);
}

private ArrayList mParentStates = new ArrayList<>();

pushParentState(statefulObserver.mState); 很簡(jiǎn)單,只是將 statefulObserver 的狀態(tài)添加到 mParentStates 集合中。

繼續(xù)往下走,接著會(huì)調(diào)用 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 方法也很簡(jiǎn)單,只是返回它的下一個(gè) event。這里因?yàn)樗麄兊?state為 INITIALIZED,所以它會(huì)返回 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,兩者狀態(tài)相同,所以 mState 也為 CREATED。接著回調(diào) mLifecycleObserver 的 onStateChanged 方法。所以,這里,會(huì)收到我們的 onCreate 事件,與我們的預(yù)想相符。

但是我們并沒有在 onStart,onResume, onPause , onStop 和 onDestroy 方法中調(diào)用 mLifecycleRegistry.handleLifecycleEvent 方法,它又是怎樣促發(fā) Observer 的 onStateChanged 方法的。這里先不揭曉,我們先來(lái)看一下 26.1.0 以后的 AppCompatActivity,待會(huì)你就明白了,會(huì)感嘆 google 真的牛逼!


從 26.1.0 以后 AppCompatActivity 的設(shè)計(jì)說起

我們知道,在 26.1.0 以后,如果我們要使用 lifecycle,我們只需要調(diào)用以下的方法即可。

SupportActivity
getLifecycle().addObserver(new GenericLifecycleObserver() {

    @Override
    public void onStateChanged(LifecycleOwner source, Lifecycle.Event event) {
        Log.d(TAG, "onStateChanged: event =" + event);
    }
});

跟蹤 getLifecycle() 方法,它會(huì)跳轉(zhuǎn)到 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 中,它默認(rèn)為我們初始化 mLifecycleRegistry,作為一個(gè)成員變量。接著,他在 onCreate 方法中調(diào)用了 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 方法中,它會(huì)判斷我們是否已經(jīng)添加 ReportFragment,沒有的話,添加進(jìn)去。

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 方法中分別調(diào)用 dispatch 方法進(jìn)行分發(fā)生命周期。

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 方法中,會(huì)先判斷 activity 是不是實(shí)現(xiàn)了 LifecycleRegistryOwner ,如果是,直接分發(fā),不過不是,判斷是否實(shí)現(xiàn) LifecycleOwner,獲取它的 lifecycle,調(diào)用它 的 handleLifecycleEvent 進(jìn)行分發(fā)。

public class SupportActivity extends Activity implements LifecycleOwner, Component {
   
    private LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this

而很明顯,高版本的 SupportActivity 實(shí)現(xiàn)了 LifecycleOwner 接口,并寫 LifecycleOwner.getLifecycle() 是 LifecycleRegistry

普通的 Activity

對(duì)于 26.1.0 以后的版本,你會(huì)發(fā)現(xiàn),對(duì)于普通的 Activity,如果你想要使用 lifecycle,你只需要實(shí)現(xiàn) LifecycleOwner 接口即可。當(dāng)生命周期變化的時(shí)候,它也可以回調(diào) Observer 的 onStateChanged 方法。

回到我們前面的問題:

我們并沒有在 onStart,onResume, onPause , onStop 和 onDestroy 方法中調(diào)用 mLifecycleRegistry.handleLifecycleEvent 方法,它又是怎樣促發(fā) onStateChanged 方法的

**我們猜想它也是通過 ReportFragment 實(shí)現(xiàn)的。**但是在 Activity 的 onCreate 方法中,我們并沒有發(fā)現(xiàn)它有添加 ReportFragment,我們?cè)?As 全局搜一下,看哪些地方使用到 ReportFragment。如下圖

從圖中可以看到,有幾個(gè)地方使用到他。我們先來(lái)看一下 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 方法中,監(jiān)聽全局 activity 的創(chuàng)建,從而來(lái)添加 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 監(jiān)聽全局 activity 的創(chuàng)建,在 activity oncreate 的時(shí)候,調(diào)用 ReportFragment.injectIfNeededIn(activity) ,從而來(lái)添加 fragment,進(jìn)而分發(fā)相應(yīng)的事件。

那 LifecycleDispatcher 的 init 方法又是在哪里調(diào)用的呢? 我們?nèi)炙阉饕幌?/p>

public class ProcessLifecycleOwnerInitializer extends ContentProvider {
    @Override
    public boolean onCreate() {
        LifecycleDispatcher.init(getContext());
        ProcessLifecycleOwner.init(getContext());
        return true;
    }

可以看到它是在 ProcessLifecycleOwnerInitializer 的 onCreate 方法中調(diào)用的。而 ProcessLifecycleOwnerInitializer 是一個(gè) ContentProvider。我們知道 ContentProvider 一般是在 AndroidManifest 中生命的。

果然,在 extensions-1.1.1.aar 中,我們驚喜地發(fā)現(xiàn),它在 Manifest 里面注冊(cè)了。



    

    
        
    


而 ContentProvider 的 onCreate 方法優(yōu)先于 Application 的 onCreate 執(zhí)行,所以在 Application 之前我們就調(diào)用了 ProcessLifecycleOwnerInitializer init 方法,監(jiān)聽了 Activity 的創(chuàng)建,當(dāng) Actiivty 創(chuàng)建的時(shí)候,會(huì)嘗試為 Activity 添加 ReportFragment。而 ReportFragment 會(huì)在 Activity 生命周期變化的時(shí)候幫助我們分發(fā)生命周期。

ContentProvider 的 onCreate 方法優(yōu)先于 Application 的 onCreate 執(zhí)行,可以查看這一篇博客 Android系統(tǒng)中的Application和四大組件一些方法的啟動(dòng)順序和一些坑


總結(jié)

ok,我們來(lái)梳理一下。

對(duì)于 26.1.0 以后的 SupportActivity

它在 Activity onCreate 的時(shí)候添加了 ReportFragment,這個(gè) ReportFragment 相當(dāng)于一個(gè)代理,它在 onActivityCreated 的時(shí)候 dispatch(Lifecycle.Event.ON_CREATE) 進(jìn)行分發(fā)生命周期,onStart, onResume, onPause, onStop, onDestroy 的時(shí)候也是如此。而 在 dispatch 中 它調(diào)用了 LifecycleRegistry handleLifecycleEvent 的方法。而 LifecycleRegistry 方法中經(jīng)過一系列處理,它又調(diào)用了 observer 的 onStateChange 方法,去通知相應(yīng)的 observer。

對(duì)于普通的 Activity

它利用了 ContentProvide 的特征,它是在 Application onCreate 之前初始化的,他在 ProcessLifecycleOwnerInitializer oncreate 的時(shí)候監(jiān)聽 Activity 的創(chuàng)建,在 Activity 創(chuàng)建的時(shí)候,判斷是否已經(jīng)添加過 ReportFragment,沒有的話,添加進(jìn)去。這是一個(gè)很巧妙的設(shè)計(jì),隱式初始化了 lifecycle。

用流程圖表示如下:

該圖片引用自 Android 架構(gòu)組件(一)——Lifecycle

Lifecycle 設(shè)計(jì)借鑒

    利用 ProcessLifecycleOwnerInitializer contentProvider 來(lái)隱式加載

想一下,如果 ProcessLifecycleOwnerInitializer 不利用 contentProvider 來(lái)隱式加載的話,對(duì)于 普通的 Activity,舊版本等,如果想使用 lifecycle,那必須在基類中,手動(dòng)調(diào)用 ReportFragment.injectIfNeededIn(activity) 的方法。

    利用 fragment 來(lái)分發(fā)生命周期

利用 fragment 來(lái)分發(fā)生命周期有兩個(gè)優(yōu)點(diǎn)

將邏輯從 Activity 中剝離出來(lái),減少耦合,方便復(fù)用

可以做到在 Activity onCreate 之后才回調(diào) observer 的 CREATED Event 事件。如果是通過 Application registerActivityLifecycleCallbacks 方法來(lái)分發(fā)生命周期的話,因?yàn)?ActivityLifecycleCallbacks 的 onActivityCreated 是在 Activity oncreate 之前調(diào)用的。

下一篇:Android livedata 源碼解剖

推薦閱讀:

java 代理模式詳解

觀察者設(shè)計(jì)模式 Vs 事件委托(java)

Android Fragment 的妙用 - 優(yōu)雅地申請(qǐng)權(quán)限和處理onActivityResult

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/7062.html

相關(guān)文章

  • Android livedata 源碼解剖

    摘要:方法中,,當(dāng)為,并且不等于上一次的值,會(huì)增加的計(jì)數(shù)。鎖住當(dāng)前沒有人在處理任務(wù)處理完畢之后將置為首先,采用同步機(jī)制,通過有沒有人在處理任務(wù)。說在前面 本次推出 Android Architecture Components 系列文章,目前寫好了四篇,主要是關(guān)于 lifecycle,livedata 的使用和源碼分析,其余的 Navigation, Paging library,Room,Wo...

    GHOST_349178 評(píng)論0 收藏0
  • 解剖okhttp

    摘要:自動(dòng)選擇最好路線并支持自動(dòng)重連擁有自動(dòng)維護(hù)的連接池,減少握手次數(shù),減少請(qǐng)求延遲,共享減少對(duì)服務(wù)器的請(qǐng)求次數(shù)。支持的緩存策略減少重復(fù)的網(wǎng)絡(luò)請(qǐng)求。擁有輕松處理請(qǐng)求與響應(yīng)并自動(dòng)處理數(shù)據(jù)壓縮。支持自簽名的鏈接,配置有效證書即可。 1.OkHttp簡(jiǎn)介: Okhttp與HttpClient、HttpUrlConnection以及Volley類似是一個(gè)網(wǎng)絡(luò)請(qǐng)求框架,支持連接同一地址的鏈接共享同一個(gè)...

    mudiyouyou 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<