96SEO 2026-02-20 04:05 21
忽然有一天我想要做一件事去代码中去验证那些曾经被“灌输”的理论。

启动主流程为主当然对于一些关键方法还是会着重介绍这样以后如果有遇到相关问题的修改可以通过这篇文章找到具体代码位置然后根据具体的问题分析修改。
bug但是涉及到了通话那么他需要找到通讯组的同事来处理这个问题。
但公司很大他并不知道通讯模块是谁负责更不知道这个问题需要交给通讯组具体的哪个同事处理那么他只需要将自己的要求向公司领导管理着汇报需要通讯组的同事处理这个问题。
和通讯2个模块的开发人员还涉及到公司的管理者。
在Activity
来说他们并不知道对方模块的业务所以这一流程需要AMS来做管理。
并且这3个模块也对应3个进程当前案例来说分别为Launcher
ActivityTaskSupervisor::startSpecificActivity
ActivityTaskSupervisor::realStartActivityLocked
而是会再触发进程创建当然之前已经触发过来这次触发不会真的再创建进行了。
ActivityTaskSupervisor::realStartActivityLocked
ActivityTaskSupervisor::realStartActivityLocked
ActivityTaskSupervisor::startSpecificActivity
ItemClickHandler::onClickItemClickHandler::onClickAppShortcutItemClickHandler::startAppShortcutOrInfoActivityQuickstepLauncher::startActivitySafelyLauncher::startActivitySafelyAppLauncher::startActivitySafelyBaseQuickstepLauncher::getActivityLaunchOptions
共用启动Activity流程Activity::startActivityActivity::startActivityActivity::startActivityForResultInstrumentation::execStartActivityActivityTaskManagerService::startActivity
Instrumentation::execStartActivity
BaseQuickstepLauncher::getActivityLaunchOptions
Activity::startActivityForResult
Activity::startActivityForResult
startActivityForResult(RequiresPermission
transferSpringboardActivityOptions(options);Instrumentation.ActivityResult
mInstrumentation.execStartActivity(this,
mMainThread.getApplicationThread(),
ActivityTaskManager.getService().startActivity(whoThread,who.getOpPackageName(),
intent,intent.resolveTypeIfNeeded(who.getContentResolver()),
对跨进程启动的结果做checkcheckStartActivityResult(result,
intent);......}Instrumentation::checkStartActivityResult
(!ActivityManager.isStartResultFatalError(res))
ActivityManager.START_INTENT_NOT_RESOLVED:case
ActivityManager.START_CLASS_NOT_FOUND:
((Intent)intent).getComponent()
ActivityNotFoundException(Unable
((Intent)intent).getComponent().toShortString()
ActivityManager.START_PERMISSION_DENIED:throw
ActivityManager.START_FORWARD_AND_REQUEST_CONFLICT:throw
AndroidRuntimeException(FORWARD_RESULT_FLAG
ActivityManager.START_NOT_ACTIVITY:throw
IllegalArgumentException(PendingIntent
ActivityManager.START_NOT_VOICE_COMPATIBLE:throw
ActivityManager.START_VOICE_NOT_ACTIVE_SESSION:throw
ActivityManager.START_VOICE_HIDDEN_SESSION:throw
ActivityManager.START_ASSISTANT_NOT_ACTIVE_SESSION:throw
ActivityManager.START_ASSISTANT_HIDDEN_SESSION:throw
ActivityManager.START_CANCELED:throw
AndroidRuntimeException(Activity
AndroidRuntimeException(Unknown
吧当然还有其他很多参数比如是谁发起的请求requestCode等等这些参数都是应用端带过来的。
system_service
Instrumentation::execStartActivity
ActivityTaskManagerService::startActivityActivityTaskManagerService::startActivityAsUserActivityTaskManagerService::startActivityAsUserActivityStartController::obtainStarterActivityStarter::executeActivityStarter$Request::resolveActivity
解析启动请求参数ActivityStarter::executeRequest
创建ActivityRecordActivityStarter::startActivityUncheckedActivityStarter::startActivityInner
关键函数startActivityInnerActivityStarter::getOrCreateRootTask
移动Task到栈顶RootWindowContainer::resumeFocusedTasksTopActivities
显示ActivityTask::resumeTopActivityUncheckedLockedTask::resumeTopActivityInnerLockedTaskFragment::resumeTopActivity
显示顶层ActivityTaskDisplayArea::pauseBackTasks
ActivityTaskManagerService::startProcessAsync
ActivityTaskManagerService::startActivity
ActivityTaskManagerService::startActivityAsUser
ActivityTaskManagerServiceprivate
startActivityAsUser(IApplicationThread
返回的是ActivityStartControllerreturn
getActivityStartController().obtainStarter(intent,
startActivityAsUser).setCaller(caller).setCallingPackage(callingPackage).setCallingFeatureId(callingFeatureId).setResolvedType(resolvedType).setResultTo(resultTo).setResultWho(resultWho).setRequestCode(requestCode).setStartFlags(startFlags).setProfilerInfo(profilerInfo).setActivityOptions(bOptions).setUserId(userId).execute();}ActivityStartController
mActivityStartController;}ActivityStartController::obtainStarter
返回ActivityStarterActivityStarter
mFactory.obtain().setIntent(intent).setReason(reason);}所以在
ActivityTaskManagerService::startActivityAsUser
ActivityStarter::executeRequest
解析请求数据mRequest.resolveActivity(mSupervisor);}......//
executeRequest(mRequest);......}build
ActivityStarter::setActivityInfo
ActivityStarter$RequestResolveInfo
resolveActivity(ActivityTaskSupervisor
supervisor.resolveIntent(intent,
*/,computeResolveFilterUid(callingUid,
filterCallingUid),realCallingPid);......//
supervisor.resolveActivity(intent,
startFlags,profilerInfo);......}TargetActivity
ActivityStarter::executeRequest
request.activityInfo;ResolveInfo
日志request.logMessage.append(START
{).append(intent.toShortString(true,
).append(launchModeToString(launchMode)).append(
Request.DEFAULT_REAL_CALLING_UID)
(realCallingUid).append(realCallingUid).append());}}......//
ActivityRecord.Builder(mService).setCaller(callerApp).setLaunchedFromPid(callingPid).setLaunchedFromUid(callingUid).setLaunchedFromPackage(callingPackage).setLaunchedFromFeature(callingFeatureId).setIntent(intent).setResolvedType(resolvedType).setActivityInfo(aInfo).setConfiguration(mService.getGlobalConfiguration()).setResultTo(resultRecord).setResultWho(resultWho).setRequestCode(requestCode).setComponentSpecified(request.componentSpecified).setRootVoiceInteraction(voiceSession
null).setActivityOptions(checkedOptions).setSourceRecord(sourceRecord).build();......//
继续执行startActivityUncheckedmLastStartActivityResult
voiceSession,request.voiceInteractor,
ActivityRecord(ActivityTaskManagerService
Tokensuper(_service.mWindowManager,
info.applicationInfo.packageName;.....}这里的重点其实就是创建了一个匿名
WindowToken(WindowManagerService
WindowToken(WindowManagerService
ownerCanManageAppTokens,boolean
ActivityStarter::startActivityUnchecked
ActivityStarter::startActivityInner
ActivityStarter::startActivityInner
启动流程最重要的函数之一这里涉及到【窗口层级树】相关知识上一小节说了
一样挂载到层级树中而是需要单独处理本小节就是看这一块是如何处理的。
还移动到了DefaultTaskDisplayArea的最顶部,这里涉及到的操作如下
上的这个属于窗口显示第一步-addWindow流程当前就不单独分析了。
sourceRecord,IVoiceInteractionSession
restrictedBgActivity,NeededUriGrants
computeTargetTask内部会根据具体条件返回Task比如标志位FLAG_ACTIVITY_NEW_TASK
null因为是新启动的应用所以computeTargetTask也找不到task最终也为nullfinal
getOrCreateRootTask(mStartActivity,
进行绑定setNewTask(taskToAffiliate);}
{addOrReparentStartingActivity(targetTask,
mTargetRootTask.getRootTask().moveToFront(reuseOrNewTask,
falsemRootWindowContainer.resumeFocusedTasksTopActivities(mTargetRootTask,
getOrCreateRootTask获取或者创建Task但是当前场景肯定是创建一个热启动是获取。
另外
创建的时候就会挂载到层级树中也就是会挂载到DefaultTaskDisplayArea
不过当前场景建好就已经是栈顶了其实这一步没做什么这点后面代码会分析
ActivityStarter::getOrCreateRootTaskRootWindowContainer::getOrCreateRootTaskRootWindowContainer::getOrCreateRootTaskTaskDisplayArea::getOrCreateRootTaskTaskDisplayArea::getOrCreateRootTaskTask::Build
getOrCreateRootTask(ActivityRecord
!aOptions.getAvoidMoveToFront())
mRootWindowContainer.getOrCreateRootTask(r,
LaunchParamsController.LaunchParams
taskDisplayArea.getDisplayId()))
taskDisplayArea.getOrCreateRootTask(r,
TaskDisplayArea::getOrCreateRootTask
candidateTask.getRootTask();}......//
Task.Builder(mAtmService).setWindowingMode(windowingMode).setActivityType(activityType).setOnTop(onTop).setParent(this)
主要这个this被设置为Parent。
所以直接挂载到了DefaultTaskDisplayArea下.setSourceTask(sourceTask).setActivityOptions(options).setLaunchFlags(launchFlags).build();}看方法名是获取或创建
就是层级结构树应用所在的名为“DefaultTaskDisplayArea”的
{validateRootTask((TaskDisplayArea)
buildInner();task.mHasBeenVisible
TaskDisplayArea#addRootTaskReferenceIfNeeded().if
{task.setActivityType(mActivityType);}//
mParent;parentTask.addChild(task,
POSITION_BOTTOM,(mActivityInfo.flags
{task.setWindowingMode(mWindowingMode,
mAutoRemoveRecents,mAskedCompatMode,
mLastTimeMoved,mNeverRelinquishIdentity,
mLastSnapshotData,mTaskAffiliation,
mSupportsPictureInPicture,mRealActivitySuspended,
mCreatedByOrganizer,mLaunchCookie,
mRemoveWithTaskOrganizer);}3.4.1.1
RootWindowContainer::getOrCreateRootTask
ActivityRecord挂载到Task–setNewTask
ActivityStarter::setNewTaskActivityStarer::addOrReparentStartingActivity
就是mTargetRootTask,也就是刚刚创建的Taskfinal
mTargetRootTask.reuseOrCreateTask(mNewTaskInfo
mStartActivity.info,mNewTaskIntent
mVoiceSession,mVoiceInteractor,
mOptions);task.mTransitionController.collectExistenceChange(task);//
ActivityRecord的挂载addOrReparentStartingActivity(task,
setTaskFromReuseOrCreateNewTask);//
需要注意这里的日志打印ProtoLog.v(WM_DEBUG_TASKS,
{mStartActivity.setTaskToAffiliateWith(taskToAffiliate);}}这里的
ActivityStarer::addOrReparentStartingActivity
addOrReparentStartingActivity(NonNull
(mStartActivity.getTaskFragment()
mStartActivity.getTaskFragment()
ActivityRecord挂在到新创建的Task中并且是顶部newParent.addChild(mStartActivity,
{mStartActivity.reparent(newParent,
也是挂在到其顶部。
所以这个函数其实没有什么实际操作。
但是对于其他场景这里也是一个重点方法。
Task::moveToFrontTask::moveToFrontInnerTaskDisplayArea::positionChildAtTaskDisplayArea::positionChildTaskAtActivityTaskSupervisor::updateTopResumedActivityIfNeededActivityRecord::onTopResumedActivityChanged
--触发TopResumedActivityChangeItem主流程代码
ActivityStarter::startActivityInner
mTargetRootTask.getRootTask().moveToFront(reuseOrNewTask,
{return;}mTransitionController.recordTaskOrder(this);final
visible.taskDisplayArea.moveHomeRootTaskToFront(reason
taskDisplayArea.getFocusedRootTask()
的最前面task.getParent().positionChildAt(POSITION_TOP,
*/);taskDisplayArea.updateLastFocusedRootTask(lastFocusedTask,
显示Activity–resumeFocusedTasksTopActivities
RootWindowContainer::resumeFocusedTasksTopActivities
RootWindowContainer::resumeFocusedTasksTopActivitiesTask::resumeTopActivityUncheckedLockedTask::resumeTopActivityInnerLockedTaskFragment::resumeTopActivity
TaskDisplayArea::pauseBackTasks
WindowContainer::forAllLeafTaskTaskFragment::forAllLeafTaskFragmentsTaskFragment::startPausingTaskFragment::startPausingTaskFragment::schedulePauseActivity
PauseActivityItem这里是触发暂停launchActivityTaskManagerService::startProcessAsync
TaskFragment::resumeTopActivity
resumeFocusedTasksTopActivities(Task
(targetRootTask.isTopRootTaskInDisplayArea()||
targetRootTask.resumeTopActivityUncheckedLocked(target,
targetOptions,deferPause);}......}
resumeTopActivityUncheckedLocked(ActivityRecord
resumeTopActivityInnerLocked(prev,
resumeTopActivityInnerLocked(ActivityRecord
topFragment.resumeTopActivity(prev,
TaskFragment::resumeTopActivity
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback