Activity啟動流程原始碼分析 下篇

2021-08-17 00:22:32 字數 2948 閱讀 1296

通過前篇的介紹,我們知道目前的**邏輯執行在應用程式程序中。先來檢視activitythread啟動activity的過程的時序圖。

}這裡mh指的是h,它是activitythread的內部類並繼承handler,是應用程式程序中主線程的訊息管理類。h的**如下所示。

private

class

hextends

handler

break;

case relaunch_activity: break;

...}

private

void

handlelaunchactivity

(activityclientrecord r, intent customintent, string reason)

}} else catch (remoteexception ex) }}

private activity performlaunchactivity

(activityclientrecord r, intent customintent)

componentname component = r.intent.getcomponent();//3

...//建立要啟動activity的上下文環境

activity = minstrumentation.newactivity(

cl, component.getclassname(), r.intent);//5

...if (activity != null) else

...}

r.paused = true;

mactivities.put(r.token, r);

} catch (supernotcalledexception e) catch (exception e)

return activity;

}

public

void

callactivityoncreate

(activity activity, bundle icicle,

persistablebundle persistentstate)

final

void

performcreate

(bundle icicle, persistablebundle persistentstate)

performcreate方法中會呼叫activity的oncreate方法,講到這裡,根activity就啟動了,即應用程式就啟動了。

根activity啟動過程就講到這裡,下面我們來學習根activity啟動過程中涉及到的程序。

在應用程式程序沒有建立的情況下,根activity啟動過程中會涉及到4個程序,分別是zygote程序、launcher程序、ams所在程序(syetemserver程序)、應用程式程序。它們之間的關係如下圖所示。

首先launcher程序向ams請求建立根activity,ams會判斷根activity所需的應用程式程序是否存在並啟動,如果不存在就會請求zygote程序建立應用程式程序。應用程式程序準備就緒後會通知ams,ams會請求應用程式程序建立根activity。關於上圖中四個步驟的程序間通訊方式,其中步驟2和步驟3相關的程序採用的是socket通訊,步驟1和步驟4相關的程序採用的binder通訊。

上圖可能並不是很直觀,為了更好的理解,下面給出這四個程序呼叫的時序圖。

如果是普通activity啟動過程會涉及到幾個程序呢?答案是兩個,ams所在程序和應用程式程序。實際上理解了根activity的啟動過程(根activity的oncreate過程),根activity和普通activity其他生命週期狀態比如onstart、onresume等過程也會很輕鬆的掌握,這些知識點都是觸類旁通的,想要具體了解這些知識點的同學可以自行閱讀原始碼。

再次感謝望舒大佬的分析圖!!!

Activity啟動流程和原始碼解析

雙擊 markdown外掛程式,就可以開始編輯啦。public static void main string args 在attach方法中主要做了以下重要的事情 final iactivitymanager mgr activitymanager.getservice try catch rem...

Activity 的啟動流程原始碼剖析(三)

android 27 v4 27.1.1 我都是粘的裡面比較關鍵的原始碼,還希望配合原始碼閱讀 這是本篇的大概流程,先熟悉一下吧 流程public final void schedulelaunchactivity intent intent,ibinder token,int ident,acti...

Activity啟動流程

0x01 public void startactivity intent intent 最終走到 public void startactivityforresult requirespermission intent intent,int requestcode,nullable bundle ...