標籤:android style blog http java 2014
1、子Activity組件在進程內的啟動過程
在Android Activity組件的啟動過程http://blog.csdn.net/jltxgcy/article/details/35984557一文中,我們已經詳細分析了Activity的啟動過程,對於子Activity組件在進程內的啟動過程,我們只分析它們之間的不同。
主要是2處,1是不需要建立新的任務棧,2是不需要建立新進程和子線程。
第1點,體現在如下代碼上:
~/Android/frameworks/base/services/java/com/android/server/am
----ActivityStack.java
public class ActivityStack {......final int startActivityUncheckedLocked(ActivityRecord r, ActivityRecord sourceRecord, Uri[] grantedUriPermissions, int grantedMode, boolean onlyIfNeeded, boolean doResume) {final Intent intent = r.intent;final int callingUid = r.launchedFromUid;int launchFlags = intent.getFlags();......if (sourceRecord == null) { ......} else if (sourceRecord.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) { ......} else if (r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE ......}if (r.resultTo != null && (launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) { ......}boolean addingToTask = false;........boolean newTask = false;// Should this be considered a new task?if (r.resultTo == null && !addingToTask && (launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) {......} else if (sourceRecord != null) {......// An existing activity is starting this new activity, so we want// to keep the new one in the same task as the one that is starting// it.r.task = sourceRecord.task;......} else { ......}......startActivityLocked(r, newTask, doResume);return START_SUCCESS;}......}
第2點,體現在如下代碼上,此時已經有了子Activity進程和它的子線程了。
private final void startSpecificActivityLocked(ActivityRecord r, boolean andResume, boolean checkConfig) { // Is this activity's application already running? ProcessRecord app = mService.getProcessRecordLocked(r.processName, r.info.applicationInfo.uid); ..... if (app != null && app.thread != null) { try { realStartActivityLocked(r, app, andResume, checkConfig); return; } catch (RemoteException e) { ..... } ..... } ......}
2、子Activity組件在新進程中的啟動過程
和Android Activity組件的啟動過程http://blog.csdn.net/jltxgcy/article/details/35984557一文中,主要有一個區別,不需要建立新的任務棧。代碼如上面所示。還需要建立新進程和子線程。