Activity啟動流程

2021-07-25 22:41:56 字數 3326 閱讀 1684

0x01

public

void

startactivity(intent intent)

最終走到

public

void startactivityforresult(@requirespermission intent intent, int requestcode,

@nullable bundle options)

分兩種情況

1mparent

2mparent!=null

mparent = null 的情況最後分析

public activityresult execstartactivity(

context who, ibinder contextthread, ibinder token, activity target,

intent intent, int requestcode, bundle options)

uri referrer = target != null ? target.onprovidereferrer() : null;

if (referrer != null)

if (mactivitymonitors != null)

break;}}

}}

try catch (remoteexception e)

return

null;

這段**主要用途是為啟動乙個activity準備引數,下面說說所準備的引數

2 呼叫這packagname

3 intent

4 type (provider.gettype返回的資訊)

5 token

該activityrecord的客戶端

6requestcode

接下來就呼叫到ams裡面了

public

final

int intent intent, string resolvedtype, ibinder resultto, string resultwho, int requestcode,

int startflags, profilerinfo profilerinfo, bundle boptions, int userid) {

這個函式會先檢查呼叫者uid是否可以執行啟動activity.如果該uid>99000&&uid<99999 則不允許啟動activity,具體為什麼這麼劃分還不清楚,應該和多使用者有關

檢查多使用者的userid是否可以啟動這個activity,比如有些多使用者不能啟動瀏覽器等

string callingpackage, intent intent, string resolvedtype,

ivoiceinteractionsession voicesession, ivoiceinteractor voiceinteractor,

ibinder resultto, string resultwho, int requestcode, int startflags,

profilerinfo profilerinfo, iactivitymanager.waitresult outresult, configuration config,

bundle boptions, boolean ignoretargetsecurity, int userid,

iactivitycontainer icontainer, taskrecord intask) {

檢查intent中包含檔案描述符,丟擲異常

通過pms解析intent,返回resolveinfo資訊

通過resolveinfo解析activityinfo

activitystarter->final

string resolvedtype, activityinfo ainfo, resolveinfo rinfo,

ivoiceinteractionsession voicesession, ivoiceinteractor voiceinteractor,

ibinder resultto, string resultwho, int requestcode, int callingpid, int callinguid,

string callingpackage, int realcallingpid, int realcallinguid, int startflags,

activityoptions options, boolean ignoretargetsecurity, boolean componentspecified,

activityrecord outactivity, activitystacksupervisor.activitycontainer container,

taskrecord intask) {

找到接受結果的activity的activityrecord(如果有)

這裡建立兩個變數sourcerecord 和resultrecord分別代呼叫這activityrecord和接受結果的 一般這二者為同乙個,如果不接收結果result可能為空,如果設定了flag_activity_forward_result,則二者不同

檢查許可權

permissions_review_required 相關的邏輯 彈出中間介面

ephemeralresolveinfo狀態的任務,(可能是正在安裝的程式,被替換後要重新啟動該介面)

activitystarter->private

intstartactivityunchecked(final activityrecord r, activityrecord sourcerecord,

ivoiceinteractionsession voicesession, ivoiceinteractor voiceinteractor,

int startflags, boolean doresume, activityoptions options, taskrecord intask) {

計算啟動flags

private

void

computelaunchingtaskflags() {

計算stack

private

void

computesourcestack() {

如果掉啟的activity finish了,則新增new_task

Activity啟動流程

activity啟動流程很多文章都已經說過了,這裡說一下自己的理解。activity啟動流程分兩種 後邊啟動activity的流程是一樣的,區別是前邊判斷程序是否存在的那部分。activity啟動的前提是已經開機,各項程序和ams等服務已經初始化完成,在這裡也提一下那些內容。ipc 跨程序通訊,an...

activity啟動流程

所有程序都是由init程序直接或間接fork出來的 android系統啟動時,init程序會fork出zygote,意為 受精卵 後面的所有程序都是zygote 出來的 在zygote程序初始化時會啟動systemserver程序,平時所用到的ams pms wms 網路等服務都是在systemse...

activity啟動流程

今天要分析下fwk中activity的啟動流程,之前看別人畫的流程圖,總是很快就忘記了,而且總是摸不著重點,遇到具體問題時還是不知道從何入手,又得從頭看起。後來我想通了一件事,我們在分析這種原始碼時不應該過渡糾結於流程圖與某個具體函式,而應該從巨集觀角度想想 要實現這個功能,他應該要包含哪些步驟?新...