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

基于Android13源码分析Launcher启动

        AMS被SystemServer启动之后,SystemServer会通过AMS调用startHomeActivity启动Launcher. Launcher其实就是个Activity,学习Launcher的启动后,再去看Activity启动,会容易很多。

Launcher的启动分2个阶段:

第一阶段是startHomeActivity,触发activity的进程创建;

第二阶段就是AMS的attachApplication在进程创建后被调用,最终执行realStartActivityLocked会回调Activity的onCreate函数。

class ActivityManagerService{
    public void systemReady(final Runnable goingCallback, @NonNull TimingsTraceAndSlog t) {
    ...
    mAtmInternal.resumeTopActivities(false /* scheduleIdle */);
    ...
    }    
}


class ActivityTaskManagerService{

          @Override
          public void resumeTopActivities(boolean scheduleIdle) {

              synchronized (mGlobalLock) {

                  mRootWindowContainer.resumeFocusedTasksTopActivities();

                  if (scheduleIdle) {

                      mTaskSupervisor.scheduleIdle();

                  }

              }

          }
}

class RootWindowContainer{

    boolean resumeFocusedTasksTopActivities(Task targetRootTask, ActivityRecord target, ActivityOptions targetOptions,boolean deferPause) {
       
    for (int displayNdx = getChildCount() - 1; displayNdx >= 0; --displayNdx) {

        ...
        result |= resumedOnDisplay[0];

        if (!resumedOnDisplay[0]) {
            if (focusedRoot != null) {

                result |= focusedRoot.resumeTopActivityUncheckedLocked(target, targetOptions);

             } else if (targetRootTask == null) {

                result |= resumeHomeActivity(null /* prev */, "no-focusable-task",

                              display.getDefaultTaskDisplayArea());

            }

        }
    }

}



    boolean startHomeOnTaskDisplayArea(int userId, String reason, TaskDisplayArea taskDisplayArea, boolean allowInstrumenting, boolean fromHomeKey) {

         Intent homeIntent = null;

          ActivityInfo aInfo = null;

          if (taskDisplayArea == getDefaultTaskDisplayArea()) {

              homeIntent = mService.getHomeIntent();

              aInfo = resolveHomeActivity(userId, homeIntent);

          } else if (shouldPlaceSecondaryHomeOnDisplayArea(taskDisplayArea)) {

              Pair<ActivityInfo, Intent> info = resolveSecondaryHomeActivity(userId, taskDisplayArea);

              aInfo = info.first;

              homeIntent = info.second;

          }

          if (aInfo == null || homeIntent == null) {

              return false;

          }

  

          if (!canStartHomeOnDisplayArea(aInfo, taskDisplayArea, allowInstrumenting)) {

              return false;

          }

  

          // Updates the home component of the intent.

          homeIntent.setComponent(new ComponentName(aInfo.applicationInfo.packageName, aInfo.name));

          homeIntent.setFlags(homeIntent.getFlags() | FLAG_ACTIVITY_NEW_TASK);

          // Updates the extra information of the intent.

          if (fromHomeKey) {

              homeIntent.putExtra(WindowManagerPolicy.EXTRA_FROM_HOME_KEY, true);

              if (mWindowManager.getRecentsAnimationController() != null) {

                  mWindowManager.getRecentsAnimationController().cancelAnimationForHomeStart();

              }

          }

          homeIntent.putExtra(WindowManagerPolicy.EXTRA_START_REASON, reason);

          // Update the reason for ANR debugging to verify if the user activity is the one that

          // actually launched.

          final String myReason = reason + ":" + userId + ":" + UserHandle.getUserId(aInfo.applicationInfo.uid) + ":" + taskDisplayArea.getDisplayId();

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

          return true;
    }
}

在线源码:

1 Launcher

2 ActivityManagerService


http://www.kler.cn/a/378144.html

相关文章:

  • [Unity]Unity集成NuGet-连接mysql时的发现
  • react中使用ResizeObserver来观察元素的size变化
  • 优化程序中的数据:从数组到代数
  • 封装(2)
  • vue前端实现同步发送请求【已封装】
  • 任务2 配置防火墙firewalld
  • java多线程编程(二)一一>线程安全问题, 单例模式, 解决程线程安全问题的措施
  • FRAMES数据集:由谷歌和哈佛大学 联合创建一个综合评估数据集,目的测试检索增强生成系统在事实性、检索准确性和推理方面的能力
  • .card ~ img { width: 100%; height: 100%; object-fit: cover; }
  • git入门教程12:git命令与技巧
  • 论 ONLYOFFICE:开源办公套件的深度探索
  • PyTorch实战-手写数字识别-CNN模型
  • 【已解决,含泪总结】Ubuntu18.04下非root用户Anaconda3卸载重装,conda install终于不再报错
  • 可编辑31页PPT | 智慧业务中台规划建设与应用总体方案
  • 大厂面试真题-MVCC有哪些不好
  • 小白从零开始配置pytorch环境
  • Apache 负载均衡详细配置步骤
  • StringTable
  • 利用ExcelJS封装一个excel表格的导出
  • git 入门作业
  • 学习记录:基于Z-Stack 3.0.1的Zigbee智能插座实现
  • Django-分页
  • 构建后端为etcd的CoreDNS的容器集群(七)、编写适合阅读的域名管理脚本
  • Vue2.0 通过vue-pdf-signature@4.2.7和pdfjs-dist@2.5.207实现PDF预览
  • 目前最新最好用 NET 混淆工具 .NET Reactor V6.9.8
  • Claude 3.5 新功能 支持对 100 页的PDF 图像、图表和图形进行可视化分析