中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

做集團(tuán)網(wǎng)站應(yīng)注意什么谷歌seo優(yōu)化技巧

做集團(tuán)網(wǎng)站應(yīng)注意什么,谷歌seo優(yōu)化技巧,溫州網(wǎng)站公司,微信小程序注冊(cè)流程忽然有一天,我想要做一件事:去代碼中去驗(yàn)證那些曾經(jīng)被“灌輸”的理論。 ?????????????????? ?????????????????? ???????????????????????????????????????????– 服裝…

忽然有一天,我想要做一件事:去代碼中去驗(yàn)證那些曾經(jīng)被“灌輸”的理論。
??????????????????
??????????????????
???????????????????????????????????????????– 服裝學(xué)院的IT男

本篇已收錄于Activity短暫的一生系列
歡迎一起學(xué)習(xí)討論Android應(yīng)用開發(fā)或者WMS
V:WJB6995
Q:707409815

正文

在這里插入圖片描述
生命周期系列:

  • Activity生命周期之onPause

  • onCreate,onStart,onResume-1

  • onCreate,onStart,onResume-2

  • Activity生命周期之onStop-1

  • Activity生命周期之onStop-2

  • Activity生命周期之onDestory

在整個(gè)啟動(dòng)流程中,上一篇介紹了第一階段:SourceActivity 的 onPause

現(xiàn)在分析第二階段:TargetActivity 啟動(dòng)后會(huì)依次執(zhí)行 onCreate,onStart,onResume。

另外還會(huì)完整的介紹一下 Activity 生命周期的事務(wù)是如何觸發(fā)的。

1. 啟動(dòng)流程介紹

我們知道 onCreate 這個(gè)生命周期表示 Activity 的創(chuàng)建,對(duì)應(yīng) LaunchActivityItem 這個(gè)事務(wù),源碼中構(gòu)建這個(gè)事務(wù)唯一的地方就在 ActivityTaskSupervisor::realStartActivityLocked 方法。

而 ActivityTaskSupervisor::realStartActivityLocked 方法的執(zhí)行邏輯,在[Activity啟動(dòng)流程系列]說過要啟動(dòng) TargetActivity 有2個(gè)必要條件:

    1. TargetActivity 所在的應(yīng)用進(jìn)程已經(jīng)啟動(dòng)
    1. SourceActivity 需要執(zhí)行 onPause

不考慮異常情況,能執(zhí)行 onCreate 的場(chǎng)景就是冷熱啟動(dòng)了,冷熱啟動(dòng)區(qū)別也就在于多了個(gè)需要?jiǎng)?chuàng)建應(yīng)用進(jìn)程,不過最終都會(huì)執(zhí)行到 ActivityTaskSupervisor::realStartActivityLocked 方法。

無論是啟動(dòng)進(jìn)程后執(zhí)行過來的,還是上篇提到的 SourceActivity 執(zhí)行 activityPaused 流程觸發(fā)過來的結(jié)果都是一樣的,不必太在意

開始擼代碼

# ActivityTaskSupervisor boolean realStartActivityLocked(ActivityRecord r, WindowProcessController proc,boolean andResume, boolean checkConfig) throws RemoteException {// 1. 判斷是否執(zhí)行完了pause 。 也就是2個(gè)條件之一,必須要執(zhí)行完pause才可以進(jìn)入后面if (!mRootWindowContainer.allPausedActivitiesComplete()) {// While there are activities pausing we skipping starting any new activities until// pauses are complete. NOTE: that we also do this for activities that are starting in// the paused state because they will first be resumed then paused on the client side.// 不滿足添加就打logProtoLog.v(WM_DEBUG_STATES,"realStartActivityLocked: Skipping start of r=%s some activities pausing...",r);return false;}......// 2. wm_restart_activity EventLogTags.writeWmRestartActivity(r.mUserId, System.identityHashCode(r),task.mTaskId, r.shortComponentName);// 3.重點(diǎn)* 創(chuàng)建Activity啟動(dòng)事務(wù).將構(gòu)建的 LaunchActivityItem 添加到 clientTransaction 中final ClientTransaction clientTransaction = ClientTransaction.obtain(proc.getThread(), r.token);......clientTransaction.addCallback(LaunchActivityItem.obtain(new Intent(r.intent),System.identityHashCode(r), r.info,// TODO: Have this take the merged configuration instead of separate global// and override configs.mergedConfiguration.getGlobalConfiguration(),mergedConfiguration.getOverrideConfiguration(), r.compat,r.getFilteredReferrer(r.launchedFromPackage), task.voiceInteractor,proc.getReportedProcState(), r.getSavedState(), r.getPersistentSavedState(),results, newIntents, r.takeOptions(), isTransitionForward,proc.createProfilerInfoIfNeeded(), r.assistToken, activityClientController,r.shareableActivityToken, r.getLaunchedFromBubble(), fragmentToken));final ActivityLifecycleItem lifecycleItem;if (andResume) {// 4.重點(diǎn)*. 設(shè)置預(yù)期的最終狀態(tài)Resume邏輯,啟動(dòng)走的這。 表示需要執(zhí)行到onCreatelifecycleItem = ResumeActivityItem.obtain(isTransitionForward);} else {//  Pause 邏輯lifecycleItem = PauseActivityItem.obtain();}clientTransaction.setLifecycleStateRequest(lifecycleItem);// 5.重點(diǎn)* 調(diào)度事務(wù),將clientTransaction添加到生命周期管理器中mService.getLifecycleManager().scheduleTransaction(clientTransaction);}
    1. 如果有Activity沒有執(zhí)行完 pause ,則不能執(zhí)行新的Activity的啟動(dòng)。 如果不滿足條件也會(huì)相應(yīng)的ProtoLog
    1. 打印Events日志,格式為:wm_restart_activity: [0,253598020,21,com.google.android.dialer/.extensions.GoogleDialtactsActivity]
    1. 構(gòu)建 LaunchActivityItem 事務(wù),將會(huì)觸發(fā)創(chuàng)建Activity,并執(zhí)行到 onCreate
    1. 構(gòu)建 ResumeActivityItem 事務(wù),將會(huì)觸發(fā)執(zhí)行到Activity的 onResume
    1. 執(zhí)行事務(wù)

后面的流程其實(shí)可以直接去看應(yīng)用端這2個(gè)事務(wù)的執(zhí)行,不過我對(duì)這中間的調(diào)用比較好奇,所以把生命周期跨進(jìn)程調(diào)用事務(wù)的邏輯也梳理了一遍。對(duì)這塊比較了解的可以跳過,直接看第三章生命周期相關(guān)的內(nèi)容

2. Activity 生命周期事務(wù)跨進(jìn)程處理方式詳解

2.1 了解ClientTransaction

在 ActivityTaskSupervisor::realStartActivityLocked 方法中對(duì)跨進(jìn)程執(zhí)行生命周期事務(wù)的代碼可以歸納為以下幾步:

    1. 構(gòu)建出 ClientTransaction
    1. 構(gòu)建 onCreate 和 onResume對(duì)應(yīng)的2個(gè)事務(wù),并保存到 ClientTransaction 中
    1. 通過 ClientLifecycleManager::scheduleTransaction 方法來觸發(fā)事務(wù)的調(diào)度執(zhí)行,唯一參數(shù)就是 ClientTransaction

這一小節(jié)先來了解一下這個(gè) ClientTransaction 到底是什么

# ClientTransaction// 實(shí)現(xiàn)Parcelable接口,說明可序列化public class ClientTransaction implements Parcelable, ObjectPoolItem {// 幾個(gè)重要的成員變量private List<ClientTransactionItem> mActivityCallbacks;private ActivityLifecycleItem mLifecycleStateRequest;// 目標(biāo)進(jìn)程private IApplicationThread mClient;// 目標(biāo)Activityprivate IBinder mActivityToken;// client :對(duì)應(yīng)進(jìn)程// activityToken :創(chuàng)建ActivityRecord時(shí)的匿名tokenpublic static ClientTransaction obtain(IApplicationThread client, IBinder activityToken) {ClientTransaction instance = ObjectPool.obtain(ClientTransaction.class);if (instance == null) {instance = new ClientTransaction();}instance.mClient = client;instance.mActivityToken = activityToken;return instance;}// 拿到對(duì)應(yīng)public IBinder getActivityToken() {return mActivityToken;}public void addCallback(ClientTransactionItem activityCallback) {if (mActivityCallbacks == null) {mActivityCallbacks = new ArrayList<>();}// 事務(wù)添加到 mActivityCallbacks 列表中mActivityCallbacks.add(activityCallback);}// 事務(wù)賦值給 mLifecycleStateRequest 變量public void setLifecycleStateRequest(ActivityLifecycleItem stateRequest) {mLifecycleStateRequest = stateRequest;}// 目標(biāo)進(jìn)程執(zhí)行事務(wù)public void schedule() throws RemoteException {mClient.scheduleTransaction(this);}}

ClientTransaction 的核心方法就這些,結(jié)合 ActivityTaskSupervisor::realStartActivityLocked 方法的使用得出以下結(jié)論:

    1. ClientTransaction::obtain 構(gòu)建出一個(gè) ClientTransaction 對(duì)象,2個(gè)參數(shù)分別為目標(biāo)進(jìn)程,和目標(biāo)Activity
    1. addCallback 方法會(huì)將 LaunchActivityItem 放到 內(nèi)部的 mActivityCallbacks 列表中
    1. setLifecycleStateRequest 方法將 ResumeActivityItem 事務(wù)賦值給了 mLifecycleStateRequest 變量。

這里還有個(gè)重要的方法 schedule() ,最終會(huì)觸發(fā)目標(biāo)進(jìn)程執(zhí)行當(dāng)前這個(gè) ClientTransaction 。

2.2 事務(wù)的調(diào)度執(zhí)行

上一小節(jié)知道生命周期的事務(wù)都被包裝在了一個(gè) ClientTransaction 對(duì)象中,現(xiàn)在來看看 ClientLifecycleManager::scheduleTransaction 方法是如何觸發(fā)對(duì)應(yīng)事務(wù)執(zhí)行的。

該方法有多個(gè)重載,但是本質(zhì)都一樣


# ClientLifecycleManagervoid scheduleTransaction(ClientTransaction transaction) throws RemoteException {final IApplicationThread client = transaction.getClient();// 重點(diǎn)* 調(diào)用ClientTransaction::scheduletransaction.schedule();......}void scheduleTransaction(@NonNull IApplicationThread client, @NonNull IBinder activityToken,@NonNull ActivityLifecycleItem stateRequest) throws RemoteException {//  構(gòu)建 一個(gè) ClientTransaction,調(diào)用上面的scheduleTransactionfinal ClientTransaction clientTransaction = transactionWithState(client, activityToken,stateRequest);scheduleTransaction(clientTransaction);}......忽略另外幾個(gè)重載, 都是內(nèi)部構(gòu)建出一個(gè) ClientTransaction 

主要就是執(zhí)行了 ClientTransaction::schedule 方法。

2.3 應(yīng)用進(jìn)程處理

ClientTransaction::schedule 方法會(huì)跨進(jìn)程調(diào)用到目標(biāo)進(jìn)程的 scheduleTransaction 方法,我們知道進(jìn)程指的就是 ActivityThread 內(nèi)部類 ApplicationThread

# ActivityThread$ApplicationThread@Overridepublic void scheduleTransaction(ClientTransaction transaction) throws RemoteException {// 這里調(diào)用的是ActivityThread的父類 ClientTransactionHandlerActivityThread.this.scheduleTransaction(transaction);}# ClientTransactionHandlervoid scheduleTransaction(ClientTransaction transaction) {// 執(zhí)行 preExecute (預(yù)執(zhí)行)transaction.preExecute(this);// 重點(diǎn)* 發(fā)送消息sendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction);}

先執(zhí)行 preExecute 方法,最重要的是執(zhí)行發(fā)送了一個(gè) EXECUTE_TRANSACTION 消息,并把 ClientTransaction 傳過去了。

這個(gè)消息的處理在 ActivityThread 中。

# ActivityThreadprivate final TransactionExecutor mTransactionExecutor = new TransactionExecutor(this);class H extends Handler {public void handleMessage(Message msg) {if (DEBUG_MESSAGES) Slog.v(TAG, ">>> handling: " + codeToString(msg.what));switch (msg.what) {......case EXECUTE_TRANSACTION:final ClientTransaction transaction = (ClientTransaction) msg.obj;// 處理mTransactionExecutor.execute(transaction);......break;......}}}

ClientTransaction 又被傳遞到 TransactionExecutor 中處理了。

# TransactionExecutorpublic void execute(ClientTransaction transaction) {......// LaunchActivityItemexecuteCallbacks(transaction);// ResumeActivityItemexecuteLifecycleState(transaction);......}

2.3.1 executeCallbacks 和 executeLifecycleState 方法

為什么我在上面注釋里說 executeCallbacks 是處理 LaunchActivityItem,executeLifecycleState 是處理 ResumeActivityItem 呢?
代碼中有答案:

# TransactionExecutorpublic void executeCallbacks(ClientTransaction transaction) {// 獲取 callback 的元素,沒有就返回final List<ClientTransactionItem> callbacks = transaction.getCallbacks();if (callbacks == null || callbacks.isEmpty()) {// No callbacks to execute, return early.return;}......// 當(dāng)前場(chǎng)景是觸發(fā) LaunchActivityItem的execute方法item.execute(mTransactionHandler, token, mPendingActions);item.postExecute(mTransactionHandler, token, mPendingActions);......}private void executeLifecycleState(ClientTransaction transaction) {// 獲取tLifecycleStateRequest,沒有就返回final ActivityLifecycleItem lifecycleItem = transaction.getLifecycleStateRequest();if (lifecycleItem == null) {// No lifecycle request, return early.return;}......// 重點(diǎn)* 將Activity的狀態(tài)轉(zhuǎn)換至接近最終目標(biāo)狀態(tài)的位置  也就是會(huì)觸發(fā)onStartcycleToPath(r, lifecycleItem.getTargetState(), true /* excludeLastState */, transaction);// Execute the final transition with proper parameters.// 當(dāng)前場(chǎng)景是觸發(fā)LaunchActivityItem的executelifecycleItem.execute(mTransactionHandler, token, mPendingActions);lifecycleItem.postExecute(mTransactionHandler, token, mPendingActions);}

而之前SystemService對(duì)這2個(gè)事務(wù)的處理如下:

ActivityTaskSupervisor::realStartActivityLockedLaunchActivityItem.obtain   -- 添加到事務(wù)到 mActivityCallbacks 列表ResumeActivityItem.obtain   -- 設(shè)置事務(wù)到 mLifecycleStateRequestClientLifecycleManager::scheduleTransaction  -- 觸發(fā)事務(wù)的執(zhí)行

所以說:executeCallbacks 方法是處理 LaunchActivityItem,executeLifecycleState 是處理 ResumeActivityItem。

2.4 小結(jié)

經(jīng)過上面這些分析,我們知道在 ActivityTaskSupervisor::realStartActivityLocked 方法中啟動(dòng) Activity 就是構(gòu)建了2個(gè)事務(wù)到 ClientTransaction 中,并跨進(jìn)程到目標(biāo)進(jìn)程執(zhí)行。

2個(gè)事務(wù)從SystemService進(jìn)程到目標(biāo)應(yīng)用進(jìn)程完整的調(diào)用鏈如下:

ActivityTaskSupervisor::realStartActivityLockedClientTransaction::obtain             -- 構(gòu)建客戶端事務(wù)LaunchActivityItem::obtain            -- 構(gòu)建 onCreate 啟動(dòng)事務(wù)ClientTransaction::addCallback        -- onCreate事務(wù)添加進(jìn)回調(diào)ResumeActivityItem::obtain            -- 構(gòu)建 onResume 事務(wù)ClientTransaction::setLifecycleStateRequest  --  onResume 事務(wù)添加進(jìn)LifecycleStateRequestClientLifecycleManager::scheduleTransaction  -- 執(zhí)行事務(wù)ClientTransaction::schedule               -- 觸發(fā)目標(biāo)進(jìn)程執(zhí)行ActivityThread$ApplicationThread::scheduleTransaction  -- 進(jìn)入應(yīng)用進(jìn)程ClientTransactionHandler::scheduleTransactionClientTransaction::preExecuteActivityThread::sendMessage                     -- 發(fā)送“EXECUTE_TRANSACTION”消息ActivityThread$H::handleMessage TransactionExecutor::executeTransactionExecutor::executeCallbacks        -- LaunchActivityItem 事務(wù)LaunchActivityItem::execute              -- 觸發(fā) onCreateLaunchActivityItem::postExecuteTransactionExecutor::executeLifecycleState   -- ResumeActivityItem 事務(wù)TransactionExecutor::cycleToPath         -- 觸發(fā) onStartResumeActivityItem::execute              -- 觸發(fā) onResumeResumeActivityItem::postExecute

時(shí)序圖如下:
在這里插入圖片描述
可以看到從 生命周期事務(wù)的執(zhí)行到真正觸發(fā)其 execute 方法,中間的調(diào)用鏈還是很長的,不過這個(gè)流程也不算很重要,一般看到 ResumeActivityItem 這種事務(wù)構(gòu)建了,直接去看對(duì)應(yīng)的 execute,postExecute 等方法就好了。

從調(diào)用鏈上也看到了 3個(gè)生命周期的執(zhí)行順序和期望的log打印也是一樣的,當(dāng)然具體是怎么執(zhí)行到的要看后續(xù)代碼分析。

3. 總結(jié)

這一篇對(duì)介紹了 Activity 啟動(dòng)流程中 SystemService 端末尾的工作,
另外介紹了一下 Activity 生命周期事務(wù)跨進(jìn)程處理方式,關(guān)于onCreate,onStart,onResume 這3個(gè)生命周期在SystemService 端的流程介紹完了,下一篇是重點(diǎn),會(huì)詳細(xì)介紹在應(yīng)用端對(duì)這3個(gè)生命周期的處理流程。

http://www.risenshineclean.com/news/32875.html

相關(guān)文章:

  • 做家居商城網(wǎng)站鄭州seo推廣
  • 怎么把網(wǎng)站放到空間嗎教育培訓(xùn)機(jī)構(gòu)平臺(tái)
  • 公眾號(hào)的微網(wǎng)站開發(fā)營銷型網(wǎng)站建設(shè)排名
  • 南京代做網(wǎng)站濟(jì)南百度競(jìng)價(jià)代運(yùn)營
  • c 做網(wǎng)站如何調(diào)用dll免費(fèi)源碼網(wǎng)站
  • 公司怎么建立自己網(wǎng)站百度推廣價(jià)格價(jià)目表
  • php app網(wǎng)站建設(shè)武漢seo管理
  • 藍(lán)色大氣網(wǎng)站欣賞視頻推廣平臺(tái)
  • 手機(jī)企業(yè)網(wǎng)站制作企業(yè)網(wǎng)頁設(shè)計(jì)公司
  • 網(wǎng)站建設(shè)夢(mèng)幻創(chuàng)意百度文庫官網(wǎng)
  • php做的網(wǎng)站安全嗎今天的新聞?lì)^條
  • 什么公司在百度做網(wǎng)站常州seo關(guān)鍵詞排名
  • 做網(wǎng)站實(shí)習(xí)日志寧波seo怎么做引流推廣
  • 陽泉購物網(wǎng)站開發(fā)設(shè)計(jì)市場(chǎng)營銷策劃
  • 網(wǎng)站網(wǎng)絡(luò)廣告如何建設(shè)自助建站免費(fèi)搭建個(gè)人網(wǎng)站
  • 織夢(mèng)網(wǎng)站后臺(tái)關(guān)鍵詞推廣優(yōu)化app
  • 婚禮顧問網(wǎng)站介紹模版有哪些營銷推廣方式
  • 用php做動(dòng)態(tài)網(wǎng)站嗎企業(yè)中層管理人員培訓(xùn)課程
  • 手機(jī)網(wǎng)站內(nèi)容模塊如何進(jìn)行網(wǎng)站宣傳推廣
  • 58網(wǎng)站怎么做優(yōu)化迅雷磁力鏈bt磁力種子
  • 合肥疫情風(fēng)險(xiǎn)等級(jí)思億歐seo靠譜嗎
  • 天津企業(yè)網(wǎng)站建站做一個(gè)公司網(wǎng)站大概要多少錢
  • 用自己電腦做網(wǎng)站的空間百度自媒體注冊(cè)入口
  • 南寧seo費(fèi)用服務(wù)短視頻seo系統(tǒng)
  • 黨政機(jī)關(guān)如何建設(shè)網(wǎng)站企業(yè)推廣網(wǎng)絡(luò)營銷外包服務(wù)
  • 做網(wǎng)站如何與美工配合日本比分預(yù)測(cè)
  • 網(wǎng)站開發(fā)速成班網(wǎng)絡(luò)軟文怎么寫
  • 天津建設(shè)工程信息網(wǎng) 官網(wǎng)首頁seo排名點(diǎn)擊器曝光行者seo
  • 鄂州做網(wǎng)站公司推廣營銷軟件app
  • 建設(shè)銀行梅州分行網(wǎng)站廈門seo怎么做