目錄
Android之zygote源碼剖析(一)
Android之zygote源碼剖析(二)
Android之zygote源碼剖析(三)
Android之SystemServer介紹(一)
Android之SystemServer介紹(二)
Android之Launcher介紹(一)
Android之Launcher介紹(二)
Launcher啟動(dòng)
在SystemServer類中會(huì)調(diào)用startOtherServices函數(shù):
private void startOtherServices() {
……
mActivityManagerService.systemReady(() -> {
Slog.i(TAG, "Making services ready");
traceBeginAndSlog("StartActivityManagerReadyPhase");
mSystemServiceManager.startBootPhase(
SystemService.PHASE_ACTIVITY_MANAGER_READY);
traceEnd();
traceBeginAndSlog("StartObservingNativeCrashes");
try {
mActivityManagerService.startObservingNativeCrashes();
} catch (Throwable e) {
reportWtf("observing native crashes", e);
}
……
}, BOOT_TIMINGS_TRACE_LOG);
}
其中啟動(dòng)了很多的服務(wù),主要關(guān)注下執(zhí)行的mActivityManagerService.systemReady()
衩茸,其中
mActivityManagerService是ActivityManagerService服務(wù)记劝。
mActivityManagerService = mSystemServiceManager.startService(
ActivityManagerService.Lifecycle.class).getService();
這個(gè)寫(xiě)法是java的Lambda表達(dá)式俯艰。
進(jìn)入systemReady(ActivityManagerService.java
)看一下:
public void systemReady(final Runnable goingCallback, BootTimingsTraceLog traceLog) {
traceLog.traceBegin("PhaseActivityManagerReady");
……
synchronized (this) {
……
mStackSupervisor.resumeFocusedStackTopActivityLocked();
mUserController.sendUserSwitchBroadcastsLocked(-1, currentUserId);
……
}
}
resumeFocusedStackTopActivityLocked函數(shù)位于ActivityStackSupervisor.java
中渤愁,ActivityStackSupervisor.java
類主要用來(lái)管理ActivityStack的:
boolean resumeFocusedStackTopActivityLocked() {
return resumeFocusedStackTopActivityLocked(null, null, null);
}
boolean resumeFocusedStackTopActivityLocked(
ActivityStack targetStack, ActivityRecord target, ActivityOptions targetOptions) {
if (targetStack != null && isFocusedStack(targetStack)) {
return targetStack.resumeTopActivityUncheckedLocked(target, targetOptions);
}
final ActivityRecord r = mFocusedStack.topRunningActivityLocked();
if (r == null || r.state != RESUMED) {
mFocusedStack.resumeTopActivityUncheckedLocked(null, null);
} else if (r.state == RESUMED) {
// Kick off any lingering app transitions form the MoveTaskToFront operation.
mFocusedStack.executeAppTransition(targetOptions);
}
return false;
}
函數(shù)中只要執(zhí)行了ActivityStack.java
中的resumeTopActivityUncheckedLocked函數(shù):
boolean resumeTopActivityUncheckedLocked(ActivityRecord prev, ActivityOptions options) {
……
boolean result = false;
try {
mStackSupervisor.inResumeTopActivity = true;
result = resumeTopActivityInnerLocked(prev, options);
} finally {
mStackSupervisor.inResumeTopActivity = false;
}
mStackSupervisor.checkReadyForSleepLocked();
return result;
}
其中又調(diào)用了ActivityStack.java的resumeTopActivityInnerLocked函數(shù):
private boolean resumeTopActivityInnerLocked(ActivityRecord prev, ActivityOptions options) {
……
return isOnHomeDisplay() &&
mStackSupervisor.resumeHomeStackTask(prev, "prevFinished");
……
}
其中又回調(diào)到ActivityStackSupervisor.java
的resumeHomeStackTask函數(shù):
boolean resumeHomeStackTask(ActivityRecord prev, String reason) {
if (!mService.mBooting && !mService.mBooted) {
// Not ready yet!
return false;
}
if (prev != null) {
prev.getTask().setTaskToReturnTo(APPLICATION_ACTIVITY_TYPE);
}
mHomeStack.moveHomeStackTaskToTop();
ActivityRecord r = getHomeActivity();
final String myReason = reason + " resumeHomeStackTask";
// Only resume home activity if isn't finishing.
if (r != null && !r.finishing) {
moveFocusableActivityStackToFrontLocked(r, myReason);
return resumeFocusedStackTopActivityLocked(mHomeStack, prev, null);
}
return mService.startHomeActivityLocked(mCurrentUser, myReason);
}
函數(shù)最后會(huì)調(diào)用mService的startHomeActivityLocked函數(shù)慕趴。
這個(gè)mService就是ActivityManagerService自身漾峡。
繼續(xù)來(lái)看下startHomeActivityLocked函數(shù):
boolean startHomeActivityLocked(int userId, String reason) {
// 判斷是否是工廠模式和mTopAction是否存在
if (mFactoryTest == FactoryTest.FACTORY_TEST_LOW_LEVEL
&& mTopAction == null) {
return false;
}
// 獲取home intent(launcher)
Intent intent = getHomeIntent();
ActivityInfo aInfo = resolveActivityInfo(intent, STOCK_PM_FLAGS, userId);
if (aInfo != null) {
intent.setComponent(new ComponentName(aInfo.applicationInfo.packageName, aInfo.name));
aInfo = new ActivityInfo(aInfo);
aInfo.applicationInfo = getAppInfoForUser(aInfo.applicationInfo, userId);
ProcessRecord app = getProcessRecordLocked(aInfo.processName,
aInfo.applicationInfo.uid, true);
// 如果當(dāng)前l(fā)auncher還沒(méi)有啟動(dòng)就開(kāi)始啟動(dòng)
if (app == null || app.instr == null) {
intent.setFlags(intent.getFlags() | Intent.FLAG_ACTIVITY_NEW_TASK);
final int resolvedUserId = UserHandle.getUserId(aInfo.applicationInfo.uid);
final String myReason = reason + ":" + userId + ":" + resolvedUserId;
// 啟動(dòng)launcher
mActivityStarter.startHomeActivityLocked(intent, aInfo, myReason);
}
} else {
Slog.wtf(TAG, "No home screen found for " + intent, new Throwable());
}
return true;
}
getHomeIntent函數(shù)如下:
Intent getHomeIntent() {
// 根據(jù)傳入的mTopAction數(shù)據(jù)生成intent
Intent intent = new Intent(mTopAction, mTopData != null ? Uri.parse(mTopData) : null);
intent.setComponent(mTopComponent);
intent.addFlags(Intent.FLAG_DEBUG_TRIAGED_MISSING);
if (mFactoryTest != FactoryTest.FACTORY_TEST_LOW_LEVEL) {
// 添加匹配為CATEGORY_HOME
intent.addCategory(Intent.CATEGORY_HOME);
}
return intent;
}
最終確定是啟動(dòng)Launcher是通過(guò)Intent.CATEGORY_HOME來(lái)匹配的攻旦。
AndroidManifest.xml文件中定義:
<activity
android:name="com.android.launcher3.Launcher"
android:launchMode="singleTask"
android:clearTaskOnLaunch="true"
android:stateNotNeeded="true"
android:windowSoftInputMode="adjustPan|stateUnchanged"
android:screenOrientation="nosensor"
android:configChanges="keyboard|keyboardHidden|navigation"
android:resizeableActivity="true"
android:resumeWhilePausing="true"
android:taskAffinity=""
android:enabled="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.MONKEY"/>
</intent-filter>
</activity>
其中的android.intent.category.HOME和上面的代碼相互對(duì)應(yīng)。
這樣就啟動(dòng)了Launcher了生逸。_