Android Home应用程序启动流程
Android系统在启动时安装应用程序的过程,这些应用程序安装好之后,还需要有一个Home应用程序来负责把它们在桌面上展示出来,在Android系统中,这个默认的Home应用程序就是Launcher了,本文将详细分析Launcher应用程序的启动过程。
@frameworks/base/services/core/java/com/android/server/am/UserController.java
finishUserUnlockingmHandler.obtainMessage(USER_UNLOCK_MSG, userId, 0, uss).sendToTarget();case USER_UNLOCK_MSG: finishUserUnlockedfinishUserUnlockedCompletedmHandler.obtainMessage(USER_UNLOCKED_MSG, userId, 0).sendToTarget();case USER_UNLOCKED_MSG: mInjector.getSystemServiceManager().onUserUnlocked(msg.arg1);mService.mTaskSupervisor.onUserUnlocked(user.getUserIdentifier());
@frameworks/base/services/core/java/com/android/server/wm/ActivityTaskSupervisor.javascheduleStartHome("userUnlocked");mHandler.obtainMessage(START_HOME_MSG, reason).sendToTarget();case START_HOME_MSG: { mRootWindowContainer.startHomeOnEmptyDisplays((String) msg.obj); @frameworks/base/services/core/java/com/android/server/wm/RootWindowContainer.javastartHomeOnEmptyDisplaysforAllTaskDisplayAreas(taskDisplayArea -> {startHomeOnTaskDisplayArea(mCurrentUser, myReason, taskDisplayArea,
@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.dynabook.VDlauncher/1000 for top-activity {com.dynabook.VDlauncher/com.dynabook.VDlauncher.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/VDlauncher/MainActivity.javaMainActivity::onCreate
--------------------------------------------回归线---------------------------------
@frameworks/base/services/core/java/com/android/server/am/UserController.java finishUserUnlocking mHandler.obtainMessage(USER_UNLOCK_MSG, userId, 0, uss).sendToTarget(); case USER_UNLOCK_MSG: finishUserUnlocked finishUserUnlockedCompleted mHandler.obtainMessage(USER_UNLOCKED_MSG, userId, 0).sendToTarget(); case USER_UNLOCKED_MSG: mInjector.getSystemServiceManager().onUserUnlocked(msg.arg1); mService.mTaskSupervisor.onUserUnlocked(user.getUserIdentifier()); @frameworks/base/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java scheduleStartHome("userUnlocked"); mHandler.obtainMessage(START_HOME_MSG, reason).sendToTarget(); case START_HOME_MSG: { mRootWindowContainer.startHomeOnEmptyDisplays((String) msg.obj); @frameworks/base/services/core/java/com/android/server/wm/RootWindowContainer.java startHomeOnEmptyDisplays forAllTaskDisplayAreas(taskDisplayArea -> { startHomeOnTaskDisplayArea(mCurrentUser, myReason, taskDisplayArea, @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.dynabook.VDlauncher/1000 for top-activity {com.dynabook.VDlauncher/com.dynabook.VDlauncher.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/VDlauncher/MainActivity.java MainActivity::onCreate
相关文章:
Android Home应用程序启动流程
Android系统在启动时安装应用程序的过程,这些应用程序安装好之后,还需要有一个Home应用程序来负责把它们在桌面上展示出来,在Android系统中,这个默认的Home应用程序就是Launcher了,本文将详细分析Launcher应用程序的启…...
C++笔试强训12、13、14
文章目录 笔试强训12一、选择题1-5题6-10题 二、编程题题目一题目二 笔试强训13一、选择题1-5题6-10题 二、编程题题目一题目二 笔试强训14一、选择题1-5题6-10题 二、编程题题目一题目二 笔试强训12 一、选择题 1-5题 引用:是一个别名,与其被引用的实…...
Excel和Word日常使用记录:
Excel使用总结 表格颜色填充: 合并单元格: 选中你要合并的单元格区域。 按下快捷键 Alt H,然后松开这些键。 再按下 M,接着按 C。 这个组合键执行的操作是:Alt H:打开“主页”选项卡。 M:选…...
用Git把本地仓库上传到远程仓库
用Git把本地仓库上传到远程仓库 GitHub创建远程仓库 在创建新仓库界面里输入你的仓库名后点击Create repository就好了。 创建本地项目 当你已经有一个项目后在命令行输入如下指令即可 git init git commit -m "first commit" git branch -M main git remote a…...
OneHotEncoder一个不太合理的地方
OneHotEncoder,在Xtrain上fit,在Xtest上transform 如果遇到某个值出现在Xtest,而没有在Xtrain出现过时,会抛出如下错误: OneHotEncoder Found unknown categories [xxx] in column xx during transform OneHotEncoder …...
如何修复软件中的BUG
笔者上一篇博文《如何开发出一款优秀的软件》主要讲了如何开发一款优秀的软件及相应的必要条件。但对一个已上线,已经成型的产品,该如何解决存在的bug呢?这是本文要阐述的内容。 在这里,首先说一下bug的种类及bug严重程度分类&…...
分享一个基于微信小程序的医院挂号就诊一体化平台uniapp医院辅助挂号应用小程序设计(源码、调试、LW、开题、PPT)
💕💕作者:计算机源码社 💕💕个人简介:本人 八年开发经验,擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等,大家有这一块的问题可以一起交流&…...
HTML生日蛋糕
目录 写在前面 完整代码 代码分析 系列文章 写在最后 写在前面 HTML实现的生日蛋糕来喽,小编亲测,发给好友可以直接打开哦。在代码的第183行可以写下对朋友的祝福,快拿去送给你的好朋友吧! 完整代码 <!DOCTYPE html>…...
【软件逆向】第27课,软件逆向安全工程师之(二)寄存器寻址,每天5分钟学习逆向吧!
寄存器寻址是汇编语言中的一种寻址方式,在这种方式中,操作数位于CPU的寄存器中。寄存器是CPU内部的高速存储位置,用于快速访问数据。以下是关于寄存器寻址的详细信息: 寄存器寻址的特点: 操作数在寄存器中࿱…...
前缀和 — 利用前缀信息解决子数组问题
【前缀和的核心思想是预先处理数组来快速计算任意子数组的和,基本上用于数组和序列问题。】 前缀和算法具体步骤 构造前缀和数组: 给定一个数组nums,其前缀和数组prex定义为prex[i]表示为数组nums从起始位置到第i个位置的元素累加和。构建前…...
2024年最新版Ajax+Axios 学习【包含原理、Promise、报文、接口等...】
基础知识 AJAX概念 AJAX概念:是浏览器与服务器进行数据通信的技术。 认识URL 定义:统一资源定位符,简称网址,用于访问网络上的资源。 组成: http协议:超文本传输协议,规定浏览器和服务器之…...
【Qt线程】—— Qt线程详解
目录 (一)多线程的概述 (二)Qt线程的使用条件 (三)创建线程的方法 3.1 继承QTread,重写run()函数 3.1.1 为什么要重写 3.2 继承QObject 3.3 核心API介绍 3.4 关闭线程的使用方法 &…...
Golang | Leetcode Golang题解之第391题完美矩形
题目: 题解: func isRectangleCover(rectangles [][]int) bool {type point struct{ x, y int }area, minX, minY, maxX, maxY : 0, rectangles[0][0], rectangles[0][1], rectangles[0][2], rectangles[0][3]cnt : map[point]int{}for _, rect : range…...
〖open-mmlab: MMDetection〗解析文件:mmdet/models/detectors/two_stage.py
目录 MMDetection中的两阶段检测器:深入解析two_stage.py源码两阶段检测器概述two_stage.py的关键组件类定义和初始化构造函数Neck头配置RPN头配置RoI头配置_load_from_state_dict方法概述参数解释代码解析 特征提取方法签名文档字符串(Docstring&#x…...
【最新华为OD机试E卷-支持在线评测】机器人活动区域(100分)多语言题解-(Python/C/JavaScript/Java/Cpp)
🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-E/D卷的三语言AC题解 💻 ACM金牌🏅️团队| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,…...
C语言:刷题日志(1)
一.阶乘计算升级版 本题要求实现一个打印非负整数阶乘的函数。 其中n是用户传入的参数,其值不超过1000。如果n是非负整数,则该函数必须在一行中打印出n!的值,否则打印“Invalid input”。 首先,知道阶乘是所有小于及等于该数的…...
ios私钥证书(p12)导入失败,Windows OpenSSl 1.1.1 下载
ios私钥证书(p12)导入失败 如果你用的OpenSSL版本是v3那么恭喜你V3必然报这个错,解决办法将OpenSSL 3降低成 v1。 Windows OpenSSl 1.1.1 下载 阿里云网盘下载地址:OpenSSL V1...
嵌入式面试经典30问:二
1. 嵌入式系统中,如何选择合适的微控制器或微处理器? 在嵌入式系统中选择合适的微控制器(MCU)或微处理器(MPU)时,需要考虑多个因素以确保所选组件能够满足项目的具体需求。以下是一些关键步骤和…...
目标检测-YOLOv1
YOLOv1介绍 YOLOv1(You Only Look Once version 1)是一种用于目标检测的深度学习算法,由Joseph Redmon等人于2016年提出。它基于单个卷积神经网络,将目标检测任务转化为一个回归问题,通过在图像上划分网格并预测每个网…...
python基础语法八-异常
书接上回: python基础语法一-基本数据类型 python基础语法二-多维数据类型 python基础语法三-类 python基础语法四-数据可视化 python基础语法五-函数 python基础语法六-正则匹配 python基础语法七-openpyxl操作excel 1. 异常简介 (1)异常:遇到…...
接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
