ImageVerifierCode 换一换
格式:DOCX , 页数:15 ,大小:20.15KB ,
资源ID:19179231      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/19179231.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(and51PowerManagerService深入分析三updatePowerStateLocked函数Word文件下载.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

and51PowerManagerService深入分析三updatePowerStateLocked函数Word文件下载.docx

1、updateIsPoweredLocked函数,先是要dirty有DIRTY_BATTERY_STATE标志位。我们在下面分析下,什么时候会有这个标志位private void updateIsPoweredLocked(int dirty) if (dirty & DIRTY_BATTERY_STATE) != 0) final boolean wasPowered = mIsPowered; final int oldPlugType = mPlugType; final boolean oldLevelLow = mBatteryLevelLow; mIsPowered = mBatte

2、ryManagerInternal.isPowered(BatteryManager.BATTERY_PLUGGED_ANY);/这些都是从BatteryService获取 mPlugType = mBatteryManagerInternal.getPlugType(); mBatteryLevel = mBatteryManagerInternal.getBatteryLevel(); mBatteryLevelLow = mBatteryManagerInternal.getBatteryLevelLow(); if (DEBUG_SPEW) Slog.d(TAG, updateIsPo

3、weredLocked: wasPowered= + wasPowered + , mIsPowered= + mIsPowered , oldPlugType= + oldPlugType , mPlugType= + mPlugType , mBatteryLevel= + mBatteryLevel); if (wasPowered != mIsPowered | oldPlugType != mPlugType) /是否充电或者充电类型改变了 mDirty |= DIRTY_IS_POWERED;/mDirty置位 / Update wireless dock detection st

4、ate. final boolean dockedOnWirelessCharger = mWirelessChargerDetector.update(/无线充电相关 mIsPowered, mPlugType, mBatteryLevel); / Treat plugging and unplugging the devices as a user activity. / Users find it disconcerting when they plug or unplug the device / and it shuts off right away. / Some devices

5、also wake the device when plugged or unplugged because / they dont have a charging LED. final long now = SystemClock.uptimeMillis(); if (shouldWakeUpWhenPluggedOrUnpluggedLocked(wasPowered, oldPlugType, dockedOnWirelessCharger) /是否需要唤醒设备 wakeUpNoUpdateLocked(now, Process.SYSTEM_UID); userActivityNoU

6、pdateLocked(/触发userActivity now, PowerManager.USER_ACTIVITY_EVENT_OTHER, 0, Process.SYSTEM_UID); / Tell the notifier whether wireless charging has started so that / it can provide feedback to the user. if (dockedOnWirelessCharger) /无线充电相关 mNotifier.onWirelessChargingStarted();= mIsPowered | oldLevel

7、Low != mBatteryLevelLow) if (oldLevelLow != mBatteryLevelLow & !mBatteryLevelLow) resetting low power snooze mAutoLowPowerModeSnoozing = false; updateLowPowerModeLocked();/更新低功耗模式 首先systemReady函数最终会把mDirty置位为DIRTY_BATTERY_STATE,还有收BatterySevice发出来的广播,最总也会置这个标志位。private final class BatteryReceiver ex

8、tends BroadcastReceiver Override public void onReceive(Context context, Intent intent) synchronized (mLock) handleBatteryStateChangedLocked();private void handleBatteryStateChangedLocked() mDirty |= DIRTY_BATTERY_STATE; updatePowerStateLocked();再来看看电池状态发生什么变化要唤醒设备:private boolean shouldWakeUpWhenPlu

9、ggedOrUnpluggedLocked( boolean wasPowered, int oldPlugType, boolean dockedOnWirelessCharger) / Dont wake when powered unless configured to do so. mWakeUpWhenPluggedOrUnpluggedConfig) /如果资源中没有配置这项,直接退出不唤醒设备 return false;t wake when undocked from wireless charger. / See WirelessChargerDetector for jus

10、tification. if (wasPowered &mIsPowered & oldPlugType = BatteryManager.BATTERY_PLUGGED_WIRELESS) /这是一个 拔出的工作,然后之前的无线充电 t wake when docked on wireless charger unless we are certain of it. wasPowered & mIsPowered mPlugType = BatteryManager.BATTERY_PLUGGED_WIRELESS/插入动作,现在是无线充电 dockedOnWirelessCharger)

11、/ If already dreaming and becoming powered, then dont wake. if (mIsPowered & mWakefulness = WAKEFULNESS_DREAMING) /正在充电,但是mWakefulness 是做梦状态 t wake while theater mode is enabled. if (mTheaterModeEnabled &mWakeUpWhenPluggedOrUnpluggedInTheaterModeConfig) / Otherwise wake up! return true;/其他就唤醒设备 继续分析

12、updatePowerStateLocked函数,分析updateStayOnLocked函数。一般这个函数mStatyon为fasle,除非在资源中设置哪种充电状态下可以长亮。private void updateStayOnLocked(int dirty) (DIRTY_BATTERY_STATE | DIRTY_SETTINGS) != 0) /当dirty是电池状态和设置的状态改变时 final boolean wasStayOn = mStayOn; if (mStayOnWhilePluggedInSetting != 0/这个值从资源中读取,一般设置的话代表哪种充电时可以常亮

13、isMaximumScreenOffTimeoutFromDeviceAdminEnforcedLocked() /看有没有设mMaximumScreenOffTimeoutFromDeviceAdmin屏幕最大亮屏时间,没设默认最大。那么这个函数返回是false mStayOn = mBatteryManagerInternal.isPowered(mStayOnWhilePluggedInSetting); else mStayOn = false; if (mStayOn != wasStayOn) mDirty |= DIRTY_STAY_ON;继续分析updatePowerState

14、Locked函数的updateScreenBrightnessBoostLocked函数,这个函数是更新屏幕是否保持最亮状态private void updateScreenBrightnessBoostLocked(int dirty) DIRTY_SCREEN_BRIGHTNESS_BOOST) != 0) /这个状态实在boostScreenBrightnessInternal函数中设置最亮时置位,当然下面发送消息MSG_SCREEN_BRIGHTNESS_BOOST_TIMEOUT也会将这个标志位置位 if (mScreenBrightnessBoostInProgress) /当前正

15、在最亮屏幕这个状态 mHandler.removeMessages(MSG_SCREEN_BRIGHTNESS_BOOST_TIMEOUT); if (mLastScreenBrightnessBoostTime mLastSleepTime) final long boostTimeout = mLastScreenBrightnessBoostTime + SCREEN_BRIGHTNESS_BOOST_TIMEOUT; if (boostTimeout now) /看当前时间是否小于最亮屏幕结束的时间 Message msg = mHandler.obtainMessage(MSG_SC

16、REEN_BRIGHTNESS_BOOST_TIMEOUT); msg.setAsynchronous(true); mHandler.sendMessageAtTime(msg, boostTimeout);/发送一个延迟的消息,到最亮屏幕结束的时候接受到消息,将标志位置为DIRTY_SCREEN_BRIGHTNESS_BOOST后,重新再回到这个函数 mScreenBrightnessBoostInProgress = false;/回到这个函数时,直接将这个屏幕最亮状态的标志位改成false userActivityNoUpdateLocked(now,/触发一个userActivity

17、 PowerManager.USER_ACTIVITY_EVENT_OTHER, 0, Process.SYSTEM_UID);下面看看MSG_SCREEN_BRIGHTNESS_BOOST_TIMEOUT消息的处理函数。case MSG_SCREEN_BRIGHTNESS_BOOST_TIMEOUT: handleScreenBrightnessBoostTimeout(); break;private void handleScreenBrightnessBoostTimeout() / runs on handler thread handleScreenBrightnessBoostT

18、imeout mDirty |= DIRTY_SCREEN_BRIGHTNESS_BOOST;接下来看updatePowerStateLocked函数的另一个阶段:/ Phase 1: Update wakefulness. / Loop because the wake lock and user activity computations are influenced / by changes in wakefulness. final long now = SystemClock.uptimeMillis();int dirtyPhase2 = 0;for (;) int dirtyPh

19、ase1 = mDirty;/这个循环中每次新的mDirty全部给dirtyPhase1,并且在这个循环中使用这个dirty dirtyPhase2 |= dirtyPhase1;/dirtyPhase2 会把之前所有的mDirty状态全部或上,然后用这个状态继续下面的函数 mDirty = 0;/mDirty会在这里清零 updateWakeLockSummaryLocked(dirtyPhase1); updateUserActivitySummaryLocked(now, dirtyPhase1);updateWakefulnessLocked(dirtyPhase1) 先看下updat

20、eWakeLockSummaryLocked函数,更新wakelock的函数private void updateWakeLockSummaryLocked(int dirty) (DIRTY_WAKE_LOCKS | DIRTY_WAKEFULNESS) ! mWakeLockSummary = 0; final int numWakeLocks = mWakeLocks.size(); for (int i = 0; i numWakeLocks; i+) final WakeLock wakeLock = mWakeLocks.get(i); switch (wakeLock.mFlag

21、s & PowerManager.WAKE_LOCK_LEVEL_MASK) /先根据wakelock的flag,mWakeLockSummary或上各种状态 case PowerManager.PARTIAL_WAKE_LOCK: mWakeLockSummary |= WAKE_LOCK_CPU; case PowerManager.FULL_WAKE_LOCK: mWakeLockSummary |= WAKE_LOCK_SCREEN_BRIGHT | WAKE_LOCK_BUTTON_BRIGHT; case PowerManager.SCREEN_BRIGHT_WAKE_LOCK:

22、mWakeLockSummary |= WAKE_LOCK_SCREEN_BRIGHT; case PowerManager.SCREEN_DIM_WAKE_LOCK: mWakeLockSummary |= WAKE_LOCK_SCREEN_DIM; case PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK:/距离传感器相关 mWakeLockSummary |= WAKE_LOCK_PROXIMITY_SCREEN_OFF; case PowerManager.DOZE_WAKE_LOCK: mWakeLockSummary |= WAKE_LOCK

23、_DOZE; / Cancel wake locks that make no sense based on the current state. if (mWakefulness != WAKEFULNESS_DOZING) /下面根据各种状态,将上面或上的mWakeLockSummary,有的减去 mWakeLockSummary &= WAKE_LOCK_DOZE; if (mWakefulness = WAKEFULNESS_ASLEEP | (mWakeLockSummary & WAKE_LOCK_DOZE) != (WAKE_LOCK_SCREEN_BRIGHT | WAKE_L

24、OCK_SCREEN_DIM | WAKE_LOCK_BUTTON_BRIGHT); if (mWakefulness = WAKEFULNESS_ASLEEP) = WAKE_LOCK_PROXIMITY_SCREEN_OFF; / Infer implied wake locks where necessary based on the current state. if (mWakeLockSummary & (WAKE_LOCK_SCREEN_BRIGHT | WAKE_LOCK_SCREEN_DIM) != 0) /只要有屏幕锁,cpu锁必须持有 if (mWakefulness =

25、 WAKEFULNESS_AWAKE) mWakeLockSummary |= WAKE_LOCK_CPU | WAKE_LOCK_STAY_AWAKE; else if (mWakefulness = WAKEFULNESS_DREAMING) updateWakeLockSummaryLocked: mWakefulness= + PowerManagerInternal.wakefulnessToString(mWakefulness) , mWakeLockSummary=0x + Integer.toHexString(mWakeLockSummary);下面分析下updateUserActivitySummaryLocked函数private void updateUs

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1