StartActivity路上的mParent

源碼基于API26

mParent干嘛來著,帶著這個疑問上車了

通過源碼發(fā)現(xiàn)在Activity中attach()方法中賦值了维雇,事實(shí)上還有個方法也可以賦值,即setParent(Activity parent).
不多說直接看attach()

final void attach(Context context, ActivityThread aThread,
        Instrumentation instr, IBinder token, int ident,
        Application application, Intent intent, ActivityInfo info,
        CharSequence title, Activity parent, String id,
        NonConfigurationInstances lastNonConfigurationInstances,
        Configuration config, String referrer, IVoiceInteractor voiceInteractor,
        Window window) {
    ...
    mMainThread = aThread;
    mInstrumentation = instr;
    mToken = token;
    mIdent = ident;
    mApplication = application;
    mIntent = intent;
    mReferrer = referrer;
    mComponent = intent.getComponent();
    mActivityInfo = info;
    mTitle = title;
    //在這里被賦值了
    mParent = parent;
    mEmbeddedID = id;
    ...
}

在上面發(fā)現(xiàn)诽偷,哎呀這個parent也是個Activity啊侥祭,那這個mParent就是當(dāng)前activity的父activity
那什么時候會執(zhí)行attach()呢,熟悉activity啟動流程的同學(xué)知道在ActivityThread中performLaunchActivity()中執(zhí)行的

不熟悉的往這里看源碼探探之StartActivity(一)

private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
            ...
            activity.attach(appContext, this, getInstrumentation(), r.token,
                    r.ident, app, r.intent, r.activityInfo, title, r.parent,
                    r.embeddedID, r.lastNonConfigurationInstances, config,
                    r.referrer, r.voiceInteractor, window);
             ...
}

看到這里的r.parent即是我們的mParent汞舱,而r為ActivityClientRecord類蛉拙,activity的一個記錄類尸闸,記錄了很多啟動activity的信息,咱先不管孕锄,我們直接去找哪里執(zhí)行了performLaunchActivity()就行吮廉。
熟悉activity啟動的會知道,會在handleLaunchActivity()中執(zhí)行畸肆,handleLauchActivity()的ActivityClientRecord也是由上一個類傳過來的宦芦,繼續(xù)往上,發(fā)現(xiàn)在scheduleLaunchActivity()中新建了ActivityClientRecord類的實(shí)例轴脐,但是调卑,找不到r.parent被賦值,也就是StartActivity跟這個沒半毛錢關(guān)系大咱,那我不白寫了嗎

作為屌絲程序員就不想去發(fā)現(xiàn)這個mParent是個啥嗎

回到最后出現(xiàn)r.parent的地方performLauchActivity(),發(fā)現(xiàn)還有一個地方執(zhí)行了這個方法

public final Activity startActivityNow(Activity parent, String id,
    Intent intent, ActivityInfo activityInfo, IBinder token, Bundle state,
    Activity.NonConfigurationInstances lastNonConfigurationInstances) {
    ActivityClientRecord r = new ActivityClientRecord();
        r.token = token;
        r.ident = 0;
        r.intent = intent;
        r.state = state;
        //眼睛往這里
        r.parent = parent;
        r.embeddedID = id;
        r.activityInfo = activityInfo;
        r.lastNonConfigurationInstances = lastNonConfigurationInstances;
    if (localLOGV) {
        ComponentName compname = intent.getComponent();
        String name;
        if (compname != null) {
            name = compname.toShortString();
        } else {
            name = "(Intent " + intent + ").getComponent() returned null";
        }
        Slog.v(TAG, "Performing launch: action=" + intent.getAction()
                + ", comp=" + name
                + ", token=" + token);
    }
    return performLaunchActivity(r, null);
}

找到了吧恬涧,賦值了吧,在這里新建了ActivityClientRecord,并賦值了r.parent
在棄用了的LocalActivityManager類的moveToState方法中有執(zhí)行

private void moveToState(LocalActivityRecord r, int desiredState) {
        ...
        r.activity = mActivityThread.startActivityNow(
                mParent, r.id, r.intent, r.activityInfo, r, r.instanceState, instance);
        ...
}

這里有用到了mParent,現(xiàn)在看看LocalActivityManager

public LocalActivityManager(Activity parent, boolean singleMode) {
    mActivityThread = ActivityThread.currentActivityThread();
    mParent = parent;
    mSingleMode = singleMode;
}

這里的mParent是通過實(shí)例化LocalActivityManger賦值的碴巾,由于LocalActivityManger已經(jīng)棄用了溯捆,那以前LocalActivityManger干嘛用的

Create a new LocalActivityManager for holding activities running within the given <var>parent</var>.

只能用蹩腳的英語翻譯一波,也就是管理持有一個運(yùn)行于給定父activity中的activity
通俗一點(diǎn)就是厦瓢,管理子activity
從我學(xué)習(xí)android開始就沒有用過這個東東提揍,這類情況好像跟fragment類似,應(yīng)該是被fragment取代了煮仇,然后就被棄用了
其實(shí)在TabActivity中才會出現(xiàn)這種情況劳跃,也會用到LocalActivityManger來管理Activity,由于已經(jīng)棄用了我就不分析了,感興趣自行分析浙垫。
本文刨仑,只分析了mParent在StartActivity中的作用,結(jié)論是半毛線關(guān)系都沒有夹姥,一直為空

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末杉武,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子佃声,更是在濱河造成了極大的恐慌艺智,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件圾亏,死亡現(xiàn)場離奇詭異十拣,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)志鹃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門夭问,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人曹铃,你說我怎么就攤上這事缰趋。” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵秘血,是天一觀的道長味抖。 經(jīng)常有香客問我,道長灰粮,這世上最難降的妖魔是什么仔涩? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮粘舟,結(jié)果婚禮上熔脂,老公的妹妹穿的比我還像新娘。我一直安慰自己柑肴,他們只是感情好霞揉,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著晰骑,像睡著了一般适秩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上些侍,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天隶症,我揣著相機(jī)與錄音,去河邊找鬼岗宣。 笑死蚂会,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的耗式。 我是一名探鬼主播胁住,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼刊咳!你這毒婦竟也來了彪见?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤娱挨,失蹤者是張志新(化名)和其女友劉穎余指,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體跷坝,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡酵镜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了柴钻。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片淮韭。...
    茶點(diǎn)故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖贴届,靈堂內(nèi)的尸體忽然破棺而出靠粪,到底是詐尸還是另有隱情蜡吧,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布占键,位于F島的核電站昔善,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏捞慌。R本人自食惡果不足惜耀鸦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一柬批、第九天 我趴在偏房一處隱蔽的房頂上張望啸澡。 院中可真熱鬧,春花似錦氮帐、人聲如沸嗅虏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽皮服。三九已至,卻和暖如春参咙,著一層夾襖步出監(jiān)牢的瞬間龄广,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工蕴侧, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留择同,地道東北人。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓净宵,卻偏偏與公主長得像敲才,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子择葡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容