当前位置: 首页 > news >正文

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

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

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

@frameworks/base/services/core/java/com/android/server/wm/ActivityStartController.javaService.getActivityStartController().startHomeActivity(homeIntent, aInfo, myReason, taskDisplayArea);
@frameworks/base/services/core/java/com/android/server/wm/ActivityStarter.javamLastHomeActivityStartResult = 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.javamRootWindowContainer.resumeFocusedTasksTopActivities(mTargetRootTask, mStartActivity, mOptions, mTransientLaunch);final Task focusedRoot = display.getFocusedRootTask();
@frameworks/base/services/core/java/com/android/server/wm/Task.javafocusedRoot.resumeTopActivityUncheckedLocked(target, targetOptions);someActivityResumed = resumeTopActivityInnerLocked(prev, options, deferPause);
@frameworks/base/services/core/java/com/android/server/wm/TaskFragment.javaresumed[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所在的进程已经起来了,直接通过事务的形式去启动activityfinal 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.javamTaskSupervisor.startSpecificActivity(next, true, true);
@base/services/core/java/com/android/server/wm/ActivityTaskManagerService.javamService.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 ActivityManagerInternalstartProcessLocked(processName, info, knownToBeDead, 0 /* intentFlags */, new HostingRecord(hostingType, hostingName, isTop),
@frameworks/base/services/core/java/com/android/server/am/ProcessList.javareturn mProcessList.startProcessLocked(processName, info, knownToBeDead, intentFlags,startProcessLocked(app, hostingRecord, zygotePolicyFlags, abiOverride);startProcessLocked(app, hostingRecord, zygotePolicyFlags, falsestartProcessLocked(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.javaMainActivity::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
                                                                                    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 


http://www.mrgr.cn/news/25196.html

相关文章:

  • 科技之光,照亮未来之路“2024南京国际人工智能展会”
  • 异频gap是什么作用?所有异频都需要gap配置吗?UE能力与异频gap配置的关系?
  • python学习第八节:爬虫的初级理解
  • 抖音豆包大模型Prompt 最佳实践
  • 基于vue框架的宠物爱好者交流网站的设计与实现p2653(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。
  • QGIS(Quantum GIS)使用详解
  • 无人机培训机构组装调试技术详解
  • sftp上传和下载文件
  • 美团面试:什么是G1垃圾回收底层原理?说说你的调优过程
  • 人工智能-GPU版本机器学习、深度学习模型安装
  • QT之QML学习五:添加自定义Qml组件,以及组件管理
  • 计网简简单单复习一下
  • python程序使用nohup后台执行不能实时输出到定向文件的解决方法
  • 移动订货小程序哪个好 批发订货系统源码哪个好
  • 由一个 SwiftData “诡异”运行时崩溃而引发的钩深索隐(五)
  • 手把手教你安装pytorch包
  • 多线程和高并发-17题
  • 企业如何“向内求”, 挖出更多净利润?
  • 电脑文件怎么加密?文件加密方法介绍
  • LVDS眼图eys diagram测试