Android关机流程知多少?

devtools/2024/11/13 23:52:37/

在 Android 中,关机流程涉及系统各个组件的协同工作,确保设备在断电之前能够安全地关闭所有活动并保存数据。以下是 Android 系统中关机流程的详细介绍:

在这里插入图片描述

1. 用户触发关机请求

关机流程由用户的操作触发,通常有以下几种方式:

  • 长按电源键:用户长按电源键,系统会弹出关机对话框,用户选择关机
  • 系统设置中的关机选项:用户在设置中选择关机
  • ADB 命令:开发人员或调试人员通过 ADB 命令触发关机,比如 adb shell reboot -p。

2. PowerManagerService 接收并处理关机请求

关机请求通过 PowerManagerService 接收并处理。PowerManagerService 是系统中电源管理的核心服务,负责管理设备的开关机、休眠、唤醒等操作。关机流程如下:

  • 当 PowerManagerService 接收到关机请求时,会调用 shutdownOrReboot() 方法。
  • 在 shutdownOrReboot() 中,根据请求的类型(关机或重启),会创建一个关机线程 ShutdownThread,并进入关机流程。

3. 启动 ShutdownThread 进入关机流程

ShutdownThread关机流程的主要执行者。以下是 ShutdownThread 中的几个重要步骤:

3.1 显示关机提示

ShutdownThread 首先会显示关机提示界面,通知用户设备正在关机关机提示通常包括:

  • 关机动画或静态的关机进度界面。
  • 提示用户设备正在关机,以避免意外误操作。
3.2 停止应用进程

在执行实际的关机操作之前,ShutdownThread 会通知系统管理服务 ActivityManagerService 停止所有非关键应用进程。步骤包括:

  • 调用 ActivityManagerService 的 stopNonSystemProcesses() 方法。
  • ActivityManagerService 会遍历所有正在运行的应用进程,逐步关闭每个进程,确保应用在关机前停止并释放资源。
3.3 同步文件系统数据

为了保证数据一致性,ShutdownThread 通过 StorageManagerService 对存储数据进行同步,确保所有未写入的数据在关机前被写入到文件系统中。具体步骤如下:

  • 调用 StorageManagerService.syncAll() 方法,触发文件系统的同步。
  • syncAll() 会确保所有挂载的文件系统都完成写操作,将未保存的数据写入存储。
3.4 发送关机广播

ShutdownThread 在继续执行关机流程前,会发送 Intent.ACTION_SHUTDOWN 广播,通知所有应用和系统服务设备即将关闭。这一操作可以让应用程序在接收到该广播后执行必要的清理操作,如保存用户数据、释放资源等。

// 发送关机广播
Intent intent = new Intent(Intent.ACTION_SHUTDOWN);
context.sendBroadcast(intent);

4. 关闭系统服务和硬件

在应用进程停止和数据同步完成后,ShutdownThread 会逐步关闭系统服务和硬件组件,确保关机过程的安全性。以下是详细步骤:

4.1 停止网络服务
  • WiFi蓝牙移动网络 等网络服务在关机过程中会逐步关闭,以确保所有连接断开,并防止数据在关机中断时丢失。
4.2 关闭屏幕和显示
  • 通过 SurfaceFlinger 服务关闭显示,以减少电量消耗,并确保视觉上设备已关机
4.3 关闭音频和传感器服务
  • 关机过程中,音频和传感器模块也会被安全关闭,释放相关资源。
4.4 写入电源日志
  • 系统在关机的各个阶段会记录日志信息,便于排查问题。日志数据通常保存在 logcat 中,用于后续调试。

5. 内核层执行关机操作

在 Java 层关机流程结束后,ShutdownThread 最后会调用 PowerManager.reboot("poweroff"),通知 Linux 内核执行关机操作。具体步骤如下:

5.1 卸载文件系统
  • 内核会执行所有文件系统的卸载操作,确保不再有进程访问存储设备。
5.2 执行物理断电
  • 文件系统卸载后,内核最终通过硬件接口执行物理断电操作,完成设备的关机

关机流程代码分析

以下是关机流程的简化代码示例,以展示各个关键步骤的实现:

// PowerManagerService.java 中关机方法
public void shutdown(boolean confirm, String reason, boolean wait) {ShutdownThread.shutdown(context, reason, confirm);
}// ShutdownThread.java 中的关机实现
public static void shutdown(Context context, String reason, boolean confirm) {Thread thread = new Thread(() -> {// 显示关机提示showShutdownDialog();// 发送关机广播Intent intent = new Intent(Intent.ACTION_SHUTDOWN);context.sendBroadcast(intent);// 停止应用进程ActivityManagerService am = ActivityManager.getService();am.stopNonSystemProcesses();// 同步文件系统数据StorageManagerService.syncAll();// 关闭系统服务和硬件stopNetworkServices();disableScreenAndDisplay();shutdownAudioAndSensors();logPowerEvents();// 调用内核执行关机PowerManager.reboot("poweroff");});thread.start();
}// 关机动画和提示
private static void showShutdownDialog() {// 显示关机动画代码
}// 关闭网络服务示例
private static void stopNetworkServices() {// 关闭 WiFi、蓝牙、移动网络等
}

总结

Android 的关机流程从用户触发、系统服务响应到内核执行,分为多个阶段以保证关机的安全性和数据一致性。整个流程的核心在于 PowerManagerServiceShutdownThread 协同工作,在关机过程中逐步释放资源、关闭服务,最终通过 Linux 内核完成设备的物理断电。


http://www.ppmy.cn/devtools/133768.html

相关文章

利用Java Agent 做Spring MVC Controller 层的出参入参打印日志

许多开发使用的spring aop来做切面 今天尝试一下使用JVM层面的切面 1、建立 agent jar工程 创建工程 logging-agent 使用POM为 javassist 日志 如下&#xff1a;使用了字节码 javassist 如果想处理springaop 代理的请增加依赖否则就不需要 <dependency><groupId&g…

【操作系统】输入/输出(I/O)管理

王道笔记 一、I/O管理描述 1.1 I/O设备的概念和分类 1.1.1 什么是I/O设备 “I/O”就是“输入/输出”&#xff08;Input/Output&#xff09; I/O设备机会可以将数据输入到计算机&#xff0c;或者可以接收计算机输出数据的外部设备&#xff0c;属于计算机中的硬件部件。下图就…

医疗影像分割 | 使用yolo v11训练自己的数据集

代码下载:GitHub - ultralytics/ultralytics: Ultralytics YOLO11 🚀 环境配置可以参考:目标检测:YOLOv11(Ultralytics)环境配置,适合0基础纯小白,超详细_yolov11环境配置-CSDN博客 自己的数据集标注教学(使用labelme):

【嵌入式开发】单片机CAN配置详解

0 前言 CAN外设作为一种传输速率较高&#xff0c;且连线较为简洁的通信协议&#xff0c;如今很多单片机内部都集成了CAN控制模块&#xff0c;这样只需要再外接一个CAN收发芯片&#xff0c;将TTL/CMOS电平转换成CAN协议的差分电平&#xff0c;就是一个完整的CAN收发节点。   最…

CLion配置QT开发环境

一、将qmake工程转为cmake工程&#xff08;方法一&#xff1a;用工具转换并做适当修改&#xff09; 1、工具链接&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1grW2QY3sW8X2JaHWM_ePPw 提取码&#xff1a;7at4 工具源码:https://github.com/milahu/qmake2cmake 2、执行…

发布 VectorTraits v3.0(支持 X86架构的Avx512系列指令集,支持 Wasm架构及PackedSimd指令集等)

文章目录 支持 X86架构的Avx512系列指令集支持Avx512时的输出信息 支持 Wasm架构及PackedSimd指令集支持PackedSimd时的输出信息VectorTraits.Benchmarks.Wasm 使用说明 新增了向量方法支持 .NET 8.0 新增的向量方法提供交织与解交织的向量方法YGroup3Unzip的范例代码 提供重新…

python实战(八)——情感识别(多分类)

一、任务目标 本文使用的是来自Kaggle的一个情感识别数据集&#xff0c;这个数据集的总数据量是5934条&#xff0c;标签为anger、fear、joy三种情感的其中一种&#xff0c;很明显是一个多分类任务。这里&#xff0c;我们将使用微调技巧进行深度学习建模&#xff0c;同时我们会比…

Makefile与CMake回顾

一、Makefile 1.gcc编译 预处理--->编译---->汇编---->链接 预处理&#xff1a;展开头文件&#xff0c;替换宏&#xff0c;删除注释 gcc -E ***.c -o ***.i 编译&#xff1a;检查语法的正确性&#xff0c;生成汇编文件 gcc -S ***.i -o ***.s 汇编&#xff1a;把汇编…