Android Activity组件与进程启动间关系

Activity、Service、ContentProvider、BroadcastReceiver这四大组件,在启动的过程中,当其承载的进程不存在时需要调用startProcessLocked先创建进程。

下面以launcher activtity的启动流程为例

java 复制代码
@frameworks/base/services/core/java/com/android/server/wm/ActivityStartController.java
                                                    Service.getActivityStartController().startHomeActivity(homeIntent, aInfo, myReason, taskDisplayArea);
@frameworks/base/services/core/java/com/android/server/wm/ActivityStarter.java
                                                        mLastHomeActivityStartResult = obtainStarter(intent, "startHomeActivity: " + reason).setActivityOptions(options.toBundle()).execute();
                                                            res = executeRequest(mRequest);
                                                                ActivityRecord r = new ActivityRecord.Builder(mService)..setActivityInfo(aInfo)
                                                                mLastStartActivityResult = startActivityUnchecked(r, sourceRecord, voiceSession,
                                                                    result = startActivityInner(r, sourceRecord, voiceSession, voiceInteractor,startFlags, doResume, options, inTask, inTaskFragment, restrictedBgActivity,
                                                                        mTargetRootTask.startActivityLocked(mStartActivity,
@frameworks/base/services/core/java/com/android/server/wm/RootWindowContainer.java
                                                                        mRootWindowContainer.resumeFocusedTasksTopActivities(mTargetRootTask, mStartActivity, mOptions, mTransientLaunch);
                                                                            final Task focusedRoot = display.getFocusedRootTask();
@frameworks/base/services/core/java/com/android/server/wm/Task.java
                                                                            focusedRoot.resumeTopActivityUncheckedLocked(target, targetOptions);
                                                                                someActivityResumed = resumeTopActivityInnerLocked(prev, options, deferPause);
@frameworks/base/services/core/java/com/android/server/wm/TaskFragment.java
                                                                                    resumed[0] = topFragment.resumeTopActivity(prev, options, deferPause);
                                                                                        ActivityRecord next = topRunningActivity(true /* focusableOnly */);
                                                                                        pausing |= startPausing(mTaskSupervisor.mUserLeaving, false /* uiSleeping */, next, "resumeTopActivity");  //这里就是stop上一个activity的地方
                                                                                        if (next.attachedToProcess()) {   //要启动的activity所在的进程已经起来了,直接通过事务的形式去启动activity
                                                                                            final ClientTransaction transaction = ClientTransaction.obtain(next.app.getThread(), next.appToken);
                                                                                            mAtmService.getLifecycleManager().scheduleTransaction(transaction);
                                                                                        } else {   //如果进程没启动,调用ActivityTaskSupervisor的startSpecificActivity
@frameworks/base/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java
                                                                                            mTaskSupervisor.startSpecificActivity(next, true, true);
@base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
                                                                                                mService.startProcessAsync(r, knownToBeDead, isTop, isTop ? "top-activity" : "activity");
                                                                                                    final Message m = PooledLambda.obtainMessage(ActivityManagerInternal::startProcess, mAmInternal, activity.processName,
                                                                                                    mH.sendMessage(m);
                                                                                                        LocalService::startProcess  //class LocalService extends ActivityManagerInternal
                                                                                                            startProcessLocked(processName, info, knownToBeDead, 0 /* intentFlags */, new HostingRecord(hostingType, hostingName, isTop),
@frameworks/base/services/core/java/com/android/server/am/ProcessList.java
                                                                                                                return mProcessList.startProcessLocked(processName, info, knownToBeDead, intentFlags,
                                                                                                                    startProcessLocked(app, hostingRecord, zygotePolicyFlags, abiOverride);
                                                                                                                        startProcessLocked(app, hostingRecord, zygotePolicyFlags, false
                                                                                                                            startProcessLocked(hostingRecord, entryPoint, app, uid, gids, runtimeFlags, zygotePolicyFlags, mountExternal, seInfo, requiredAbi,
                                                                                                                                mService.mProcStartHandler.post(() -> handleProcessStart( app,
                                                                                                                                    handleProcessStartedLocked(app, startResult, startSeq);
                                                                                                                                        return handleProcessStartedLocked(pending, startResult.pid, startResult.usingWrapper,
                                                                                                                                            buf.append("Start proc ");  //Start proc 1486:com.android.launcher/1000 for top-activity {com.android.launcher/com.android.launcher.MainActivity}
                                                                                                                                            buf.append(pid);
                                                                                                                                            buf.append(':');
                                                                                                                                            buf.append(app.processName);
                                                                                                                                            buf.append('/');
                                                                                                                                            buf.append(app.getHostingRecord().getType());
                                                                                                                                            buf.append(app.getHostingRecord().getName());
                                                                                                                                            
                                                                                                                                            ..............
@src/main/java/com/dynabook/launcher/MainActivity.java
                                                                                                                                                MainActivity::onCreate 

@frameworks/base/services/core/java/com/android/server/wm/ActivityStartController.java

Service.getActivityStartController().startHomeActivity(homeIntent, aInfo, myReason, taskDisplayArea);

@frameworks/base/services/core/java/com/android/server/wm/ActivityStarter.java

mLastHomeActivityStartResult = obtainStarter(intent, "startHomeActivity: " + reason).setActivityOptions(options.toBundle()).execute();

res = executeRequest(mRequest);

ActivityRecord r = new ActivityRecord.Builder(mService)..setActivityInfo(aInfo)

mLastStartActivityResult = startActivityUnchecked(r, sourceRecord, voiceSession,

result = startActivityInner(r, sourceRecord, voiceSession, voiceInteractor,startFlags, doResume, options, inTask, inTaskFragment, restrictedBgActivity,

mTargetRootTask.startActivityLocked(mStartActivity,

@frameworks/base/services/core/java/com/android/server/wm/RootWindowContainer.java

mRootWindowContainer.resumeFocusedTasksTopActivities(mTargetRootTask, mStartActivity, mOptions, mTransientLaunch);

final Task focusedRoot = display.getFocusedRootTask();

@frameworks/base/services/core/java/com/android/server/wm/Task.java

focusedRoot.resumeTopActivityUncheckedLocked(target, targetOptions);

someActivityResumed = resumeTopActivityInnerLocked(prev, options, deferPause);

@frameworks/base/services/core/java/com/android/server/wm/TaskFragment.java

resumed0 = topFragment.resumeTopActivity(prev, options, deferPause);

ActivityRecord next = topRunningActivity(true /* focusableOnly */);

pausing |= startPausing(mTaskSupervisor.mUserLeaving, false /* uiSleeping */, next, "resumeTopActivity"); //这里就是stop上一个activity的地方

if (next.attachedToProcess()) { //要启动的activity所在的进程已经起来了,直接通过事务的形式去启动activity

final ClientTransaction transaction = ClientTransaction.obtain(next.app.getThread(), next.appToken);

mAtmService.getLifecycleManager().scheduleTransaction(transaction);

} else { //如果进程没启动,调用ActivityTaskSupervisor的startSpecificActivity

@frameworks/base/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java

mTaskSupervisor.startSpecificActivity(next, true, true);

@base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java

mService.startProcessAsync(r, knownToBeDead, isTop, isTop ? "top-activity" : "activity");

final Message m = PooledLambda.obtainMessage(ActivityManagerInternal::startProcess, mAmInternal, activity.processName,

mH.sendMessage(m);

LocalService::startProcess //class LocalService extends ActivityManagerInternal

startProcessLocked(processName, info, knownToBeDead, 0 /* intentFlags */, new HostingRecord(hostingType, hostingName, isTop),

@frameworks/base/services/core/java/com/android/server/am/ProcessList.java

return mProcessList.startProcessLocked(processName, info, knownToBeDead, intentFlags,

startProcessLocked(app, hostingRecord, zygotePolicyFlags, abiOverride);

startProcessLocked(app, hostingRecord, zygotePolicyFlags, false

startProcessLocked(hostingRecord, entryPoint, app, uid, gids, runtimeFlags, zygotePolicyFlags, mountExternal, seInfo, requiredAbi,

mService.mProcStartHandler.post(() -> handleProcessStart( app,

handleProcessStartedLocked(app, startResult, startSeq);

return handleProcessStartedLocked(pending, startResult.pid, startResult.usingWrapper,

buf.append("Start proc "); //Start proc 1486:com.android.launcher/1000 for top-activity {com.android.launcher/com.android.launcher.MainActivity}

buf.append(pid);

buf.append(':');

buf.append(app.processName);

buf.append('/');

buf.append(app.getHostingRecord().getType());

buf.append(app.getHostingRecord().getName());

..............

@src/main/java/com/dynabook/launcher/MainActivity.java

MainActivity::onCreate

相关推荐
浪潮IT馆14 分钟前
Android Studio 非最新版本下载安装教程
android·ide·android studio
xiaozongt19891 小时前
MasterGo + Claude Code 生成 Android 布局:完整实践指南
android
Anhty2 小时前
2026最新免费手机音频处理工具 !!
android·功能测试·ios·智能手机·音视频
2501_915909065 小时前
iOS应用从开发到上架App Store的完整发布流程与步骤指南
android·ios·小程序·https·uni-app·webview
狗凯之家源码网5 小时前
AI 步数修改提交系统源码应用场景与落地指南
android·数据库·人工智能·运动步数
ZHOUPUYU6 小时前
PHP 9.0 前瞻:下一代 PHP 会带来哪些新功能?
android·开发语言·php
JMchen6 小时前
性能优化——让Native代码飞起来
android·c++·性能优化
ZHOUPUYU6 小时前
PHP 8.2 的核心高级特性,包括只读类、类型系统增强
android·性能优化·php
ZHOUPUYU7 小时前
PHP 8.0 高级技术实战:从新特性到性能优化
android·性能优化·php
不爱说话郭德纲7 小时前
从“点点点”到一键出包:我把 uni-app x Android 离线打包做成了脚本
android·前端·uni-app