源碼基于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)系都沒有夹姥,一直為空