android 启动时序

本文详细介绍了Android Activity的七个生命周期方法,包括onCreate、onRestart、onStart、onResume、onPause、onStop和onDestroy,并通过实例解析了在不同场景下这些方法的调用顺序。此外,还提到了onCreate和onDestroy、onStart和onStop以及onResume和onPause的配对关系,帮助理解Activity的启动和销毁过程。

 一般的情况下,activity会经历7个生命周期:

 (1) onCreate: 这个方法是生命周期的第一个方法,在这里做一些初始化的工作,比如调用setContentView去加载一些界面布局的资源,初始化所需要的数据等.

  (2) onRestart: 这个表示Activity正在启动.一般情况下,当当前的Activity由不可见变重新变为可见状态,onRestart方法就会调用,这种情形一般是用户自己的操作,比如用户将从当前的Activity_A 直接返回到了Home或者重新启动了一个Activity_B (这个过程和会调用 onPuase -> onStop),然后再次回到Activity_A(onRestart -> onStart -> onResume),此时就会调用onRestart.
   (3) onStart: 表示Activity正在被启动,即将开始,这时Activity已经可见(不是对用户来说的), 但是还没有出现在前台,还无法和用户交互.

   (4) onResume: 当前Activity已经处于可见可交互状态,这里和onStart中的可见对比,onStart可见在后台,onResume可见在前台.

   (5) onPause: 表示Activity正在停止, 正常情况下, 紧接着onStop就会被调用. 在特殊的情况下, 如果这个时候快速地再回到当前的Activity,那么此时onResume就会被调用(这里强调一下onPause和onResume是成对的), 这个属于极端情况,从用户的角度是很难重现这种现象的, 在这个方法中可以做一些数据存储, 停止动画等工作,但是不能做耗时太长的事情,因为会影响到新的Activity的显示,onPause必须先执行万,新的Activity的onResume才会显示.

   (6) onStop: 表示Activity即将停止,可以做一些稍微重量级的回收工作,同样不能太耗时.

   (7) onDestory: 表示Activity即将被销毁,这是Activity生命周期中的最后的一个回调,在这里,我们可以做一些回收的工作和最终的资源释放.

以上是正常情况下的7个时期的回调.图如下

    

       

  列举一下几种列子方便理解:

      (1) 针对一个特定的Activity,第一次启动都要经过 onCreate -> onStart -> onResume.

      (2) 在当前Activity_A 上打开新的Activity_B 回调过程: Activity_A  onPause,  Activity_B 首次执行 onCreate -> onStart -> onResume , 如果不是首次执行且没有被系统回收 onRestart -> onStart -> onResume. 然后Activity_A onStop,

      (3) 当用户按下Back键彻底退出Activity时, 执行onPause -> onStop -> onResume

      (4) 从整个生命周期来说, onCreate 和 onDestory是配对存在的,分别表示Activity的创建和销毁, 并且只可能有一次调用. 从Activity是否可见来说(想对于后台), onStart和onStop是配对的, 随着用户的操作或者屏幕的点亮和熄灭,这两个方法可能被多次调用. 从Activity是否可见在前台来说, onResume和onPause是配对的,随着用户的操作或者屏幕的点亮和熄灭,这两个方法可能被多次调用.

具体代码的启动流程以下链接文章比较详细的说明了.

https://blog.youkuaiyun.com/pihailailou/article/details/78545391

<think>我们正在分析AOSP系统启动时序,特别是`systemReady`方法和启动阶段。根据引用[1]和[2],我们知道在`SystemServer`的`run()`方法中,会启动各种服务,并在`startOtherServices()`中注册AMS的`systemReady`回调,然后在该回调中启动其他服务(如SystemUI)和执行一些系统就绪后的操作。下面我们将详细分析`systemReady`的启动时序:###一、`SystemServer`启动阶段划分1.**引导服务(BootstrapServices)**:如`Installer`、`ActivityManagerService`等。2.**核心服务(CoreServices)**:如`BatteryService`、`UsageStatsService`等。3.**其他服务(OtherServices)**:如`WindowManagerService`、`PackageManagerService`等。在启动其他服务(OtherServices)阶段,会调用`ActivityManagerService.systemReady()`来通知系统进入就绪状态。###二、`systemReady`触发流程关键代码位于`SystemServer.java`的`startOtherServices()`方法中:```java//文件路径:frameworks/base/services/core/java/com/android/server/SystemServer.javaprivatevoidstartOtherServices(){//...启动其他服务//启动WindowManagerService(引用[3])wm=WindowManagerService.main(...);//将WindowManagerService添加到ServiceManagerServiceManager.addService(Context.WINDOW_SERVICE,wm);//...其他服务启动//通知ActivityManagerService系统服务已启动mActivityManagerService.systemReady(()->{//当AMS准备就绪后,会执行此回调Slog.i(TAG,"正在执行systemReady回调");//启动SystemUI(引用[2])startSystemUi(context);//其他就绪后操作},BOOT_TIMINGS_TRACE_LOG);}```###三、`ActivityManagerService.systemReady()`内部流程在`ActivityManagerService`中,`systemReady()`方法会执行以下关键步骤:1.**系统状态更新**:将系统状态设置为`BOOTING`(启动中)或`READY`(就绪)。2.**启动系统用户界面**:如SystemUI(状态栏、导航栏等)[^2]。3.**发送`BOOT_COMPLETED`广播**:通知所有应用系统启动完成。4.**启动首个Activity**:启动桌面(Launcher)应用。###四、时序图以下是简化的启动时序:```mermaidsequenceDiagramparticipantSystemServerparticipantAMSparticipantWMSparticipantSystemUISystemServer->>AMS:启动AMSSystemServer->>WMS:启动WMS(引用[3])SystemServer->>其他服务:启动其他服务SystemServer->>AMS:调用systemReady()AMS->>AMS:内部状态设置为READYAMS->>SystemUI:启动SystemUI(通过回调)AMS->>广播:发送BOOT_COMPLETEDAMS->>Launcher:启动桌面```###五、关键点解析1.**`systemReady`回调的执行时机**在`ActivityManagerService`完成自身初始化,并且所有关键服务(如WMS、PMS等)都已启动后,才会执行`systemReady`回调。2.**SystemUI的启动**如引用[2]所述,SystemUI是在AMS的`systemReady`回调中启动的,具体通过`SystemUIService`实现。3.**权限与系统API**在系统服务创建过程中,可能需要处理隐藏API的问题(引用[4]),例如通过修改`Android.bp`文件添加白名单。###六、常见问题1.**为什么在`systemReady`回调中执行网络设置?**因为此时Telephony服务已初始化完成,且SIM卡状态稳定。2.**如何确保服务启动顺序?**`SystemServer`严格按照引导服务、核心服务、其他服务的顺序启动,并通过`SystemServiceManager`管理依赖关系。§§相关问题§§1.`SystemServer`中服务启动顺序的详细列表是怎样的?2.`ActivityManagerService.systemReady()`内部状态转换的具体过程?3.如何添加自定义系统服务并确保在`systemReady`前初始化?4.系统启动过程中`BOOT_COMPLETED`广播的发送机制?5.在`systemReady`回调中执行耗时操作会有什么影响?</think>## AOSP系统启动时序分析:`systemReady`方法核心机制 ### 一、`SystemServer`启动流程概览 ```mermaid sequenceDiagram participant Zygote participant SystemServer participant AMS participant WMS participant SystemUI Zygote->>SystemServer: fork()创建进程 SystemServer->>SystemServer: main()入口 SystemServer->>SystemServer: run()方法执行 SystemServer->>SystemServer: createSystemContext()初始化系统上下文 SystemServer->>AMS: 启动ActivityManagerService SystemServer->>WMS: 启动WindowManagerService SystemServer->>其他服务: 启动其他核心服务 SystemServer->>AMS: 调用systemReady() AMS-->>SystemServer: 执行回调函数 SystemServer->>SystemUI: 启动SystemUI服务 ``` ### 二、`systemReady`关键时序解析 #### 1. 前置准备阶段 ```java // SystemServer.java public void run() { // 1. 创建系统级Context createSystemContext(); // 初始化SystemContext和SystemUiContext [^1] // 2. 启动引导服务 startBootstrapServices(); // 包含AMS初始化 // 3. 启动核心服务 startCoreServices(); // 4. 启动其他服务 startOtherServices(); // 此处触发systemReady } ``` #### 2. `systemReady`触发点 ```java // SystemServer.java private void startOtherServices() { // 启动WMS等关键服务 [^3] wm = WindowManagerService.main(...); ServiceManager.addService(Context.WINDOW_SERVICE, wm); // ✅ 关键调用点 mActivityManagerService.systemReady(() -> { Slog.i(TAG, "执行systemReady回调"); // 启动SystemUI [^2] startSystemUi(context); // 执行自定义初始化逻辑 }, traceLog); } ``` #### 3. `ActivityManagerService`中的处理 ```java // ActivityManagerService.java public void systemReady(final Runnable goingCallback, TimingsTraceLog traceLog) { synchronized (this) { // 1. 完成AMS自身初始化 mSystemReady = true; // 2. 启动关键系统组件 startSystemUi(context); // 启动SystemUI [^2] startPersistentApps(); // 启动持久化应用 // 3. 执行传入的回调函数 if (goingCallback != null) goingCallback.run(); // 4. 发送系统就绪广播 broadcastIntent(...ACTION_BOOT_COMPLETED...); } } ``` ### 三、时序关键点分析 1. **依赖关系** `systemReady`必须在以下服务就绪后调用: - `WindowManagerService` (WMS) [^3] - `PackageManagerService` (PMS) - `PowerManagerService` (PMS) 2. **回调执行时机** 回调函数在以下操作**之后**执行: - 核心服务初始化完成 - 系统上下文完全建立 [^1] - AMS内部状态设置为`mSystemReady=true` 3. **线程模型** 整个流程在`SystemServer`的主线程执行,回调函数**同步执行**,阻塞后续启动流程: $$ \text{执行时间} < 200\text{ms} \quad (\text{Android性能要求}) $$ ### 四、典型应用场景 1. **系统UI启动** ```java // SystemServer回调中 startSystemUi(context); // 启动状态栏/导航栏等 [^2] ``` 2. **网络设置** ```java mActivityManagerService.systemReady(() -> { TelephonyManager tm = context.getSystemService(TelephonyManager.class); tm.setPreferredNetworkType(...); }, trace); ``` 3. **策略服务初始化** ```java mActivityManagerService.systemReady(() -> { DevicePolicyManagerService dpms = new DevicePolicyManagerService(context); ServiceManager.addService(Context.DEVICE_POLICY_SERVICE, dpms); }, trace); ``` ### 五、调试与问题定位 1. **启动超时检测** ```bash adb logcat | grep "SystemServer" # 关注"SystemServer boot timings"日志段 ``` 2. **回调阻塞分析** 在回调函数首尾添加追踪: ```java mActivityManagerService.systemReady(() -> { Slog.i(TAG, "回调开始: " + SystemClock.uptimeMillis()); // ... 业务逻辑 ... Slog.i(TAG, "回调结束: " + SystemClock.uptimeMillis()); }, trace); ``` 3. **服务依赖验证** 通过`dumpsys`检查服务状态: ```bash adb shell dumpsys activity services | grep "mSystemReady" ``` ### 六、最佳实践 1. **轻量化回调** 避免在回调中执行超过100ms的操作 2. **异步化处理** 耗时操作应移交工作线程: ```java mActivityManagerService.systemReady(() -> { new Thread(() -> { // 耗时初始化操作 }).start(); }, trace); ``` 3. **依赖检查** 关键服务存在性验证: ```java if (ServiceManager.getService("window") != null) { // 安全执行WMS相关操作 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值