Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android 子Activity組件在進程內的啟動過程 && 子Activity組件在新進程中的啟動過程

Android 子Activity組件在進程內的啟動過程 && 子Activity組件在新進程中的啟動過程

編輯:關於Android編程

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一文中,主要有一個區別,不需要創建新的任務棧。代碼如上面所示。還需要創建新進程和子線程。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved