Android设备是如何进入休眠的呢?

news2025/3/10 13:15:32

首先我们手机灭屏后,一般需要等一段时间CPU才真正进入休眠。即Android设备屏幕暗下来的时候,并不是立即就进入了休眠模式;当所有唤醒源都处于de-avtive状态后,系统才会进入休眠。在手机功耗中从灭屏开始到CPU进入休眠时间越短,则待机场景越省电。

Android设备是如何进入休眠的呢?

    答:Android提出了“Opportunistic suspend”的理论,通俗的讲,就是“逮到机会就睡”,“Opportunistic suspend”思想是非常简单的,只要检测到系统没有事情在做(逮到机会),就suspend整个系统。这对系统的开发人员(特别是driver开发者)来说,很容易实现,几乎不需要特别处理。但困难的是,“系统没有事情在做”的判断依据是什么?能判断准确吗?会不会浪费过多的资源在"susend->resume-supsend…”的无聊动作上?如果只有一个设备在做事情,其它设备岂不是也得陪着耗电?等等…

0

Android设备进入休眠的流程:

1.用户按下电源键:

    用户通过按下电源键触发设备的休眠流程。

2.息屏超时:

    设备屏幕在设定的时间内无操作后自动进入休眠状态。

3.AMS(Activity Manager Service)处理:

    AMS负责管理Activity和Service的生命周期,调用它们的onPause和onStop方法,确保应用在休眠前保存数据。

4.应用保存数据:

    应用在进入休眠前保存当前状态和数据,以防止数据丢失。

5.检查是否存在持锁:

    系统检查是否存在阻止设备进入休眠的锁(如唤醒锁)。

6.执行Early Suspend流程:

    如果不存在持锁,系统开始执行早期挂起流程。

6.1关闭背光:首先关闭屏幕背光以降低功耗。

6.2停止扫描触摸:停止触摸屏的扫描功能,进一步减少功耗。

6.3 关闭摄像头等硬件模块

即提前关闭摄像头等高耗电硬件模块,以更快降低功耗。

7.关闭屏幕:

    完全关闭屏幕显示。

8.停止传感器:

    WiFi和BT低功耗模式:停止传感器的工作,并将WiFi和BT模块置于低功耗模式。

9.内核层处理:

9.1同步文件系统:

    调用sys_sync,将缓存数据写入磁盘,确保数据不丢失。

9.2挂起设备:

    遍历设备,调用suspend方法,将设备置于低功耗状态。

9.3进入STR(Suspend to RAM):

    CPU进入低功耗状态,关闭大部分硬件,只保留必要的唤醒源(如按键、网络和RTC闹钟)。

10.CPU进入低功耗状态:

    设备最终进入低功耗休眠状态,等待用户下一次唤醒。

Android休眠框架图

在Android自动休眠(Auto Sleep)机制涉及两个关键概念:Early Suspend 和 WakeLock。这两个机制共同管理设备的电源状态,以优化功耗和性能。

0

Early Suspend(预挂起机制)

    Early Suspend 是Android电源管理中的一个机制,用于在设备进入完全休眠状态之前,提前关闭一些高耗电的硬件模块。这样可以更快地降低功耗,延长电池寿命。

1.触发条件:

    当系统检测到用户按下电源键或屏幕超时,且没有应用持有唤醒锁(WakeLock)时,Early Suspend机制会被触发。

2.执行步骤:

2.1关闭背光:首先关闭屏幕背光,以减少功耗。

2.2停止触摸屏扫描:停止触摸屏的扫描功能,进一步降低功耗。

2.3关闭摄像头等硬件模块:提前关闭摄像头、USB等高耗电硬件模块。

3.目的:通过提前关闭这些硬件模块,系统可以更快地进入低功耗状态,而不需要等待所有设备都进入休眠状态。

WakeLock(唤醒锁机制)

    WakeLock 是Android系统中用于防止设备进入休眠状态的机制。应用可以通过申请WakeLock来保持设备处于唤醒状态,以执行一些后台任务或保持屏幕常亮。

1.申请与释放:

1.1申请WakeLock:应用可以通过PowerManager申请WakeLock,以保持设备唤醒。

1.2释放WakeLock:当任务完成后,应用需要释放WakeLock,以允许设备进入休眠状态。

2.类型:

2.1阻止CPU进入suspend的WakeLock:保持CPU运行,但允许屏幕关闭。

2.2屏幕WakeLock:保持屏幕亮起,但允许CPU进入休眠。

3.管理:

3.1PowerManagerService:负责管理所有WakeLock的申请和释放。

3.2WakeLock Manager:在内核层管理WakeLock的状态,确保设备在适当的时候进入休眠。

协同工作

    Early Suspend和 WakeLock 机制协同工作,以确保设备在不需要时进入低功耗状态,同时在需要时保持唤醒。

    1.当所有WakeLock被释放时,系统会继续执行休眠流程,包括Early     Suspend和最终的Linux Suspend。

    2.如果存在任何WakeLock,系统将延迟进入休眠状态,直到所有WakeLock被释放。

    通过这两个机制,Android系统能够在保证用户体验的同时,有效地管理设备的电源状态,延长电池寿命。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2312708.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ctfshow做题笔记—栈溢出—pwn65~pwn68

目录 前言 一、pwn65(你是一个好人) 二、pwn66(简单的shellcode?不对劲,十分得有十二分的不对劲) 三、pwn67(32bit nop sled)(确实不会) 四、pwn68(64bit nop sled) 前言 做起来比较吃力哈哈,自己还是太菜了&…

JS中的闭包(closures)一种强大但易混淆的概念

JavaScript 中的闭包(closures)被认为是一种既强大又易混淆的概念。闭包允许函数访问其外部作用域的变量,即使外部函数已执行完毕,这在状态维护和回调函数中非常有用。但其复杂性可能导致开发者的误解,尤其在变量捕获和…

Element使用

Element(美化网页&#xff09; ElementUI的使用注意事项&#xff1a; Element.ui的使用基于Vue环境&#xff0c;于是Element相关组件的使用必须放在Vue对象绑定的视图中去 ElementUI的JS库的引入必须放在vue.js库的后面 <!-- 引入样式 --><link rel"styleshee…

基于YOLO11深度学习的电瓶车进电梯检测与语音提示系统【python源码+Pyqt5界面+数据集+训练代码】

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

R语言的基础命令及实例操作

> T & F [1] FALSE > T & T [1] TRUE > T | F [1] TRUE > F | F [1] FALSE > a <- c(T,F,T) > b <- c(F,F,T) > a & b [1] FALSE FALSE TRUE > a | b [1] TRUE FALSE TRUE 在 R 中&#xff0c;大小写是敏感的&#xff0c;也就是说…

知识蒸馏综述Knowledge Distillation: A Survey解读

论文链接&#xff1a;Knowledge Distillation: A Survey 摘要&#xff1a;近年来&#xff0c;深度神经网络在工业界和学术界都取得了成功&#xff0c;尤其是在计算机视觉任务方面。深度学习的巨大成功主要归功于它能够扩展以对大规模数据进行编码&#xff0c;并且能够处理数十…

第十五届蓝桥杯省赛电子类单片机学习过程记录(客观题)

客观试题: 01.典型的BUCK电源电路包含哪些关键器件(ABCD) A. 电容 B. 二极管 C. 电感 D. MOSFET 解析: 典型的 BUCK 电源电路是一种降压型的直流-直流转换电路,它包含以下关键器件: A.电容:电容在电路中起到滤波的作用。输入电容用于平滑输入电压的波动,减少电源噪声对…

【c++】平移字符串

说明 实现字符串的左移与右移 示例代码 #include <iostream> #include <string> using namespace std;int main() {string str1 "12345";//左移2位string str2 str1.substr(2) str1.substr(0, 2);cout << str2 << endl;//右移2位&…

为什么DDPG需要目标网络而A2C不需要?

在强化学习中&#xff0c;DDPG需要目标网络而A2C不需要的主要原因在于算法架构、更新方式和目标稳定性需求的差异&#xff1a; Q值估计的稳定性需求不同 DDPG的Critic网络需要估计状态-动作值函数 Q ( s , a ) Q(s,a) Q(s,a)&#xff0c;其目标值的计算涉及下一个状态的最大Q值…

蓝桥杯 C++ b组 统计子矩阵深度解析

题目大意&#xff1a;给定一个 NM 的矩阵 A&#xff0c;请你统计有多少个子矩阵 (最小11&#xff0c;最大NM) 满足子矩阵中所有数的和不超过给定的整数 K&#xff1f; 前言&#xff1a;这题很容易想到二维前缀和优化&#xff0c;然后枚举子矩阵&#xff0c;但这样时间复杂度为…

YOLOv12本地部署教程——42%速度提升,让高效目标检测触手可及

YOLOv12 是“你只看一次”&#xff08;You Only Look Once, YOLO&#xff09;系列的最新版本&#xff0c;于 2025 年 2 月发布。它引入了注意力机制&#xff0c;提升了检测精度&#xff0c;同时保持了高效的实时性能。在保持速度的同时&#xff0c;显著提升了检测精度。例如&am…

认识Event Loop【1】

前言 这应该是一个系列文章&#xff0c;因为我觉得Event Loop&#xff08;事件循环&#xff09;是一件很抽象也很重要的一个机制。eventloop这个知识点处于非常杂糅的位置&#xff0c;和很多其他知识&#xff0c;如运行时、浏览器、渲染流程、数据结构、线程等等&#xff0c;也…

《Linux栈破坏了,如何还原》

【栈破坏导读】栈破坏有了解过吗&#xff1f;何为栈破坏&#xff0c;栈破坏了&#xff0c;程序会立刻引发崩溃&#xff0c;我们通过gdb去调试coredump&#xff0c;栈被破坏的栈帧是没法被恢复的&#xff0c;这也给我们调试程序带来很大的困难&#xff0c;那如何还原栈破坏的第一…

环形链表问题的探究与代码实现

在数据结构与算法的学习中&#xff0c;环形链表是一个经典的问题。它不仅考察对链表这种数据结构的理解&#xff0c;还涉及到指针操作和逻辑推理。本文将结合代码和图文&#xff0c;深入分析如何判断链表中是否有环以及如何找到环的入口点。 目录 一、判断链表中是否有环 …

【CSS3】筑基篇

目录 复合选择器后代选择器子选择器并集选择器交集选择器伪类选择器 CSS 三大特性继承性层叠性优先级 背景属性背景色背景图背景图平铺方式背景图位置背景图缩放背景图固定背景复合属性 显示模式显示模式块级元素行内元素行内块元素 转换显示模式 结构伪类选择器结构伪类选择器…

React:类组件(上)

kerwin老师我来了 类组件的创建 class组件&#xff0c;js里的类命名首字符大写&#xff0c;类里面包括构造函数&#xff0c;方法 组件类要继承React.Component才有效 必须包含render方法 import React from react class App extends React.Component{render() {return <…

Spring Cloud之注册中心之Nacos的使用

目录 Naacos 服务注册/服务发现 引⼊Spring Cloud Alibaba依赖 引入Nacos依赖 引入Load Balance依赖 配置Nacos地址 服务端调用 启动服务 Naacos Nacos是Spring Cloud Alibaba的组件, Spring Cloud Alibaba遵循Spring Cloud中定义的服务注册, 服务发现规范. 因此使⽤Na…

字符串相乘——力扣

给定两个以字符串形式表示的非负整数 num1 和 num2&#xff0c;返回 num1 和 num2 的乘积&#xff0c;它们的乘积也表示为字符串形式。 注意&#xff1a;不能使用任何内置的 BigInteger 库或直接将输入转换为整数。 示例 1: 输入: num1 "2", num2 "3" …

基于OpenCV的车牌识别系统(源码+论文+部署教程)

运行环境 基于OpenCV的车牌识别系统运行环境如下&#xff1a; • Python: ≥ 3.5 • OpenCV: ≥ 4.0 • IDE工具&#xff1a;Visual Studio Code&#xff08;可自行选择&#xff09; • 技术栈&#xff1a;Python OpenCV Tkinte 主要功能 基于OpenCV的车牌识别系统主要…

MySQL:CRUD(增删查改)

目录 一、准备工作 二、Create 新增 1、语法 2、单行数据全列插入 3、单行数据指定列插入 4、多行数据指定列插入 5、多行数据全列插入 三、Retrieve 检索 1、语法 2、全列查询 3、指定列查询 4、查询字段为表达式 &#xff08;1&#xff09;常量表达式 &…