Android 子Activity组件在进程内的启动过程 && 子Activity组件在新进程中的启动过程

本文分析了Android子Activity在进程内的启动与在新进程启动的区别。进程内启动不需新建任务栈和子线程,主要区别在于ActivityStack.java中。而在新进程中,会有额外的进程与线程创建步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、子Activity组件在进程内的启动过程

       在Android Activity组件的启动过程http://blog.youkuaiyun.com/jltxgcy/article/details/35984557一文中,我们已经详细分析了Activity的启动过程,对于子Activity组件在进程内的启动过程,我们只分析它们之间的不同。

       主要是2处,1是不需要创建新的任务栈,2是不需要创建新进程和子线程。表现在上一篇文章的总图中,就是没有第4步。而且第5步指向的Laucher子线程。

       第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.youkuaiyun.com/jltxgcy/article/details/35984557一文中,主要有一个区别,不需要创建新的任务栈。代码如上面所示。还需要创建新进程和子线程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值