Android 4.0 中的PowerManager(电源管理--休眠唤醒)

PowerManagerService第三讲之灭屏 一.灭屏简述 先来讲灭屏,灭屏的方式一般有如下几种: 1.用户按Power键灭屏; 2.手机自动放置一段时间后超时灭屏; 3.Sensor灭屏。 灭屏的原因在PowerManager类中的sleepReasonToString方法有列出常见的: /** * @hide */ public static String sleepReasonToString(int... 阅读详情

转发请注明出处:

http://blog.youkuaiyun.com/codectq/article/details/7324879

        最近,在学习让系统进入休眠的过程中,学习了电源管理的相关知识。为了备忘和理清思路现整理成文,以便日后查阅。

        移动设备由于自身的限制有一个硬伤就是电量的消耗问题。由于电池的电量有限,所以电源电量的管理显得就比较重要了。我们可以想象一下,当你去超市买完东西之后,却发现无法运回家,是多么难受的一件事情。

        Android的电源管理是在Linux电源管理的基础之上更好的一个电源管理方案,在这种策略下,通过Android framework层和本地的linux库,服务和应用都通过“wake lock”来取得CPU,从而达到省电的目的。如果没有活跃的唤醒锁,Android将关闭CPU。

         在Android 4.0 中,为上层提供的休眠函数为goToSleep()。下面详细讲解为什么这个命令会让系统进去休眠模式。

        首先,需要明白在Android 系统中一般会有这样的一个文件群,XXX.java、XXXservice.java、*XXX*.cpp、*XXX*.c。作为使用者我们首先需要了解的就是这个系统能够为我们提供的服务,如果这些服务会让我们满意,我们才会愿意为这个服务埋单。因此,在这里我们就先从服务入手,也就是从PowerManagerService.java开始入手。在这个文件的line2561出有goToSleep()函数的定义:

 public void goToSleep(long time)

    {

        goToSleepWithReason(time, WindowManagerPolicy.OFF_BECAUSE_OF_USER);

    }

        goToSleep()函数接着调用了下面的goToSleepWithReason()函数。函数的定义如下:

public void goToSleepWithReason(long time, int reason)

    {

        mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null);

        synchronized (mLocks) {

            goToSleepLocked(time, reason);

        }

    }

      goToSleepLocked()函数的定义如下:

private void goToSleepLocked(long time, int reason) {



        if (mLastEventTime <= time) {

            mLastEventTime = time;

            // cancel all of the wake locks

            mWakeLockState = SCREEN_OFF;

            int N = mLocks.size();

            int numCleared = 0;

            boolean proxLock = false;

            for (int i=0; i<N; i++) {

                WakeLock wl = mLocks.get(i);

                if (isScreenLock(wl.flags)) {

                    if (((wl.flags & LOCK_MASK) == PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK)

                            && reason == WindowManagerPolicy.OFF_BECAUSE_OF_PROX_SENSOR) {

                        proxLock = true;

                    } else {

                        mLocks.get(i).activated = false;

                        numCleared++;

                    }

                }

            }

            if (!proxLock) {

                mProxIgnoredBecauseScreenTurnedOff = true;

                if (mDebugProximitySensor) {

                    Slog.d(TAG, "setting mProxIgnoredBecauseScreenTurnedOff");

                }

            }

            EventLog.writeEvent(EventLogTags.POWER_SLEEP_REQUESTED, numCleared);

            mStillNeedSleepNotification = true;

            mUserState = SCREEN_OFF;

            setPowerState(SCREEN_OFF, false, reason);

            cancelTimerLocked();

        }

    }

        其中,对我们来讲最有意义的函数为setPowerState()函数。此函数中调用了 setScreenStateLocked()函数

转发请注明出处:

http://blog.youkuaiyun.com/codectq/article/details/7324879


private int setScreenStateLocked(boolean on) {

        if (DEBUG_SCREEN_ON) {

            RuntimeException e = new RuntimeException("here");

            e.fillInStackTrace();

            Slog.i(TAG, "Set screen state: " + on, e);

        }

        if (on) {

            if ((mPowerState & SCREEN_ON_BIT) == 0 || mSkippedScreenOn) {

                // If we are turning the screen state on, but the screen

                // light is currently off, then make sure that we set the

转发请注明出处:

http://blog.youkuaiyun.com/codectq/article/details/7324879


                // light at this point to 0.  This is the case where we are
                // turning on the screen and waiting for the UI to be drawn
                // before showing it to the user.  We want the light off
                // until it is ready to be shown to the user, not it using
                // whatever the last value it had.
                if (DEBUG_SCREEN_ON) {
                    Slog.i(TAG, "Forcing brightness 0: mPowerState=0x"
                            + Integer.toHexString(mPowerState)
                            + " mSkippedScreenOn=" + mSkippedScreenOn);
                }
                mScreenBrightness.forceValueLocked(Power.BRIGHTNESS_OFF);
            }
        }
        int err = Power.setScreenState(on);
        if (err == 0) {
            mLastScreenOnTime = (on ? SystemClock.elapsedRealtime() : 0);
            if (mUseSoftwareAutoBrightness) {
                enableLightSensorLocked(on);

转发请注明出处:

http://blog.youkuaiyun.com/codectq/article/details/7324879


                if (!on) {
                    // make sure button and key backlights are off too
                    mButtonLight.turnOff();
                    mKeyboardLight.turnOff();
                    // clear current value so we will update based on the new conditions
                    // when the sensor is reenabled.
                    mLightSensorValue = -1;
                    // reset our highest light sensor value when the screen turns off
                    mHighestLightSensorValue = -1;
                }
            }
        }
        return err;
    }

转发请注明出处:

http://blog.youkuaiyun.com/codectq/article/details/7324879


       此函数调用了Power类中的setScreenState()函数。此函数通过JNI机制,最终到达硬件层的libhardware_legacy/power/Power.c文件通过对寄存器的操作完成对休眠的操作。在此函数中我们通过传入的参数是on,来进行相应的处理。



android6.0 PowerManagerService状态分析 这篇博客我们主要分析下PowerManagerService的各个状态,主要从goToSleep,wakeUp,userActivity,nap函数作为入口分析。 一、PowerManagerService的goToSleep函数  我们先来看下goToSleep函数: goToSleep函数主要调用了goToSleepInternal函数: private void 阅读详情

相关推荐

【android睡眠唤醒 三】PowerManagerService框架解析

PowerManagerService框架解析

frank_zyp的博客 8464

Android中PowerManager 类中找不到 goToSleep()

请注意,这种方法会绕过所有已持有的唤醒锁(wake locks),并尝试将设备置于休眠状态。需要特殊权限才能执行此操作。方法,可能是因为该方法是 Android SDK 的隐藏方法。这种情况下,您需要使用反射来调用该方法。

自我记录贴 1253

PowerManagerService 电源管理架构初识

1. 电源管理架构 PowerManagerService是android系统电源管理的核心服务。 PowerManagerService在Framework层本质为策略控制方案,其作用为: 向上提供给应用程序接口,例如音频场景中保持系统唤醒、消息通知中唤醒手机屏幕场景; 向下决策HAL层以及Kernel层来控制设备待机状态,控制显示屏、背光灯、距离传感器、光线传感器等硬件设备的状态; 2. 电源管理的4个层次 应用接口层(PowerManager.java) PowerManager 中开发给应用

苏法迪的专栏 8002

android PowerManager goToSleep 等用法

这个API很多坑,搞得我头疼好几次才研究出如何使用 第一个坑

z1074971432的专栏 2万+

第四章、Isaacsim在GUI中构建机器人(3):添加摄像头和传感器

本节。

m0_47719040的博客 2495

项目管理——14规划绩效域论文套路

规划绩效域论文套路

Flee Elf 1153

linux 电源管理 唤醒,Android 4.0 中的PowerManager(电源管理--休眠唤醒) [转]

转发请注明出处:最近,在学习让系统进入休眠的过程中,学习了电源管理的相关知识。为了备忘和理清思路现整理成文,以便日后查阅。移动设备由于自身的限制有一个硬伤就是电量的消耗问题。由于电池的电量有限,所以电源电量的管理显得就比较重要了。我们可以想象一下,当你去超市买完东西之后,却发现无法运回家,是多么难受的一件事情。Android的电源管理是在Linux电源管理的基础之上更好的一个电源管理方案,在这种策...

weixin_29471541的博客 403

采用了fluent模拟了平壁面结霜过程。udf,很经典,可以试试。

利用该模型作为FLUENT中的源项,模拟了在局部冷却下冷表面上的霜形成,以预测霜的形态、温度分布和霜的重量,结果与实验结果吻合良好。结果显示,霜首先围绕冷却块形成,然后逐渐向其他方向扩展,冷却块上方的霜密度最大。随着时间的推移,平均霜厚度逐渐增加,生长速率减慢,而平均霜密度随增长速率变快而增加。相变传递微观过程与机理、蒸发及冷凝换热、强化传热、高效传热管、热泵、制冷、节水节能新技术、电子元器件冷却、余热回收及梯级利用等。udf,很经典,可以试试。工程热物理、空调、热能、低温制冷、化工、物理等。

qq_15963745的博客 922

Android 4.0 中的PowerManager(电源管理--休眠唤醒) [转]

转发请注明出处: http://blog.csdn.net/codectq/article/details/7324879 最近,在学习让系统进入休眠的过程中,学习了电源管理的相关知识。为了备忘和理清思路...

ckpx42539的博客 176

RK3588与FocalTech触摸屏代码适配全解析:从原理到实战

摘要:本文详细介绍了瑞芯微RK3588处理器与FocalTech触摸屏的适配过程,包括硬件特性、驱动加载、设备树配置和常见问题解决方案。RK3588作为8nm工艺的高性能处理器,具备强大的计算能力和丰富的接口资源;FocalTech触摸屏则采用电容式技术,支持I2C/SPI接口。适配关键步骤包括驱动程序加载、硬件连接检查、设备树配置和内核版本兼容性处理,并提供了代码示例和问题排查方法。随着嵌入式设备智能化发展,该适配技术将持续优化,为智能交互提供更优解决方案。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 272

华为FusionCompute之计算虚拟化

华为FusionCompute之虚拟化

jks212454的博客 2452

Android 7系统休眠唤醒(一)电源管理架构全景图

本文深入探讨了Android电源管理体系中的休眠唤醒机制。文章首先强调理解休眠唤醒的重要性,指出移动设备需要在性能与续航间取得平衡,并列举了常见问题的根源。 文章将Android电源状态抽象为三种粒度转移模型: 宏观级别的开关机(耗时30-60秒,状态完全丢失) 中观级别的休眠唤醒(核心内容,耗时<1秒,RAM状态保留) 微观级别的亮暗屏切换(仅涉及显示控制) 重点剖析了Android电源管理的四层架构: 应用层通过PowerManager API和WakeLock控制 框架层PowerManagerSer

AfinalStone的专栏 262

云原生监控:Prometheus+Grafana监控Nginx实战

在云原生环境中,应用的高可用性和性能优化至关重要。Nginx作为一款广泛使用的高性能Web服务器、反向代理服务器及电子邮件(IMAP/POP3)代理服务器,对其进行有效的监控能够及时发现潜在问题,保障服务的稳定运行。本文章的目的是详细介绍如何使用Prometheus和Grafana构建一套完整的监控系统来监控Nginx,范围涵盖从环境搭建、数据采集、存储到可视化展示的整个流程。

AI云原生与云计算技术学院 1574

Android 之 PowerManager (电源服务)

有加锁与解锁两种状态,而加锁的形式有两种:①永久锁住,这种锁除非显式的放开,否则是不会解锁的,所以用起来需要非常小心!②超时锁,到时间后就会解锁,而创建WakeLock后,有两种加锁机制①不计数锁机制②计数锁机制(默认)可通过(boolean value)来指定,区别在于: 前者无论acquire( )多少次,一次release( )就可以解开锁。而后者则需要的时候,同样当才会去申请锁 所以,WakeLock的计数机制并不是正真意义上对每次请求进行申请/释放一个锁;只是对同一把锁被申请/释放。

leyang0910的博客 1519

基于Simulink的无线充电系统LCC补偿网络建模与控制

本文详细介绍了基于Simulink的无线充电系统LCC补偿网络建模与控制方法。首先分析了无线充电系统面临的核心挑战,提出LCC补偿网络解决方案,阐述了其恒流输出和输入阻抗解耦原理。通过Simulink分步演示了系统建模过程,包括松耦合变压器、LCC+LC补偿网络、功率变换级搭建以及频率跟踪控制实现。仿真结果表明,LCC补偿系统在气隙变化和负载跳变下能保持输出电压稳定(波动±3%),效率达89%。文章还总结了工程实现要点,并探讨了动态充电、多负载系统等扩展应用。该教程为开发高效智能的无线充电系统提供了实用指导

amy_mhd的博客 63

解决群晖NAS无法拉取docker镜像问题

在2024-06-01日以前,使用SSH登录后是可以直接拉取docker镜像的;但是之后当我们使用SSH登录上群晖NAS,使用【sudo -i】切换到超管拉取镜像会提示报错【error pulling image configuration: Get "https://production.cloudflare.docker.com/registry-v2/docker/registry/v2/blobs/sha256/cf/cff6b68a194a672fd337d8728bfb252071012cce6

提供C#相关开发 、云计算、运维测试、网络安全相关技术分享与服务,有意向可联系。 2万+

Android* 的唤醒锁

WakeLock_WhitePaper.doc BSD2.0.txt WakeLock.zip Christopher Bird Android 电源管理 — 唤醒锁全新上市 大多数人可能都遭遇过手机的电池续航时间较短带来的尴尬。 这极其令人讨厌。 没电的手机和一块水泥砖没什么差别。 一般而言,如果用户的手机电池无法持续一整天,他们会感到非常不满。而且,当手机充电时用户无法使用手机,这同

基于英特尔®架构的 Android开发 中文博客 7388

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Android PowerManager功能接口详解

是 Android 系统中用于管理设备电源状态的核心服务,开发者可以通过它控制设备的唤醒、休眠、屏幕亮灭等行为。以下是对核心功能接口的详细说明,包含使用场景、注意事项和代码示例。通过Context获取系统服务。

无线互联&网络介绍 975

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Android 7系统休眠唤醒(五)休眠全链路

整个流程在 1 秒内完成,关键在于"冻结而非杀死"的设计——下一篇将分析唤醒流程,看系统如何从中断触发到点亮屏幕,以同样的速度恢复。,内核的 autosleep 线程会在每次 wakelock 释放后自动尝试休眠,无需用户空间反复写入。机制解决了关键的竞态问题——读出当前值,写入确认无新事件,再触发休眠。内核的休眠流程分为五个阶段:准备、冻结、挂起设备、进入休眠、恢复。是 Android 提供的用户空间库,负责与内核的休眠机制交互。这个方法是休眠的 Java 层入口,负责加锁并调用内部实现。

AfinalStone的专栏 218

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Android 7系统休眠唤醒(四)休眠唤醒与开关机—核心差异深度对比

本文从触发方式、内核状态、进程管理、虚拟机、系统服务、Activity、硬件外设、耗时时长、内存状态九个维度,系统对比了开机、关机、休眠、唤醒的差异。休眠唤醒是"冻结/解冻"模型— 系统原地暂停、原地恢复,不做任何拆除和重建开关机是"拆除/重建"模型— 关机有序拆除一切,开机从零重建一切移动设备选择休眠— 基于体验(亚秒恢复)、功耗(毫瓦级)、状态连续性(不丢上下文)的综合考量下一篇Android 7系统休眠唤醒(五)休眠全链路—PMS到Kernel Suspend。

AfinalStone的专栏 214

Android电源管理-休眠简要分析

一、开篇 1.Linux 描述的电源状态 - On(on) S0 - Working - Standby (standby) S1 - CPU and RAM are powered but not executed ...

177

android电源管理-休眠简要分析

Android电源管理-休眠简要分析 工作需要,需要对这一块深入学习。故在此做一点分析记录,存疑解惑。 一、开篇  1.Linux 描述的电源状态  - On(on)                                                 S0 -  Working - Standby (standby)                         

CCJHDOPC的专栏: 1650
上一篇: 以前的博客 忘记了密码,加个链接在此
下一篇: Android 4.0 suspend/resume (kernel part)
野-百-合
博客等级 码龄17年 308粉丝 118原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值