Android待机状态更新

Android的待机状态管理由PowerManagerService.java管理

主要的状态更新方法在下面贴出代码, 注释写的很清楚, 第一次看系统源码感觉还比较爽

主要是更新唤醒, 屏幕休眠以及其他的一些状态, 然后系统根据更新的状态进行一些操作, 比如系统睡眠, 进入屏保, 或者电源模式变更等等.

 /**
     * Updates the global power state based on dirty bits recorded in mDirty.
     *
     * This is the main function that performs power state transitions.
     * We centralize them here so that we can recompute the power state completely
     * each time something important changes, and ensure that we do it the same
     * way each time.  The point is to gather all of the transition logic here.
     */
    private void updatePowerStateLocked() {
        if (!mSystemReady || mDirty == 0) {
            return;
        }
        if (!Thread.holdsLock(mLock)) {
            Slog.wtf(TAG, "Power manager lock was not held when calling updatePowerStateLocked");
        }

        // Phase 0: Basic state updates.
        updateIsPoweredLocked(mDirty);
        updateStayOnLocked(mDirty);

        // 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 dirtyPhase1 = mDirty;
            dirtyPhase2 |= dirtyPhase1;
            mDirty = 0;

            updateWakeLockSummaryLocked(dirtyPhase1);
            updateUserActivitySummaryLocked(now, dirtyPhase1);
            if (!updateWakefulnessLocked(dirtyPhase1)) {
                break;
            }
        }

        // Phase 2: Update dreams and display power state.
        updateDreamLocked(dirtyPhase2);
        updateDisplayPowerStateLocked(dirtyPhase2);

        // Phase 3: Send notifications, if needed.
        if (mDisplayReady) {
            sendPendingNotificationsLocked();
        }

        // Phase 4: Update suspend blocker.
        // Because we might release the last suspend blocker here, we need to make sure
        // we finished everything else first!
        updateSuspendBlockerLocked();
    }

调用updatePowerStateLocked()方法的地方有:

可以发现, 基本都是接受到一些系统广播之后进行调用(以handle开头的方法), 以及系统设置后调用(set开头的方法), 来更新电源状态, 还有一些接口回调, 主要是给用户的一些操作

先是public的回调方法, 回调方法把任务传递到内部的private方法(Internal结尾), 还有接收的native方法(Native结尾), 最后都是通过Locked结尾的方法调用updatePowerStateLocked()更新状态.

时间: 2024-08-06 09:33:43

Android待机状态更新的相关文章

Android: 待机时如何让程序继续运行 extends Service

接触Android没几天,不太了解. 本来写好的一个应用在无意中发现,待机的时候,应用中的一个线程停止了运行. 这个线程是每隔一分钟上传一个数据到服务器上. 我当时测试的时候,没想过待机(接开关键)下的情况是怎样的,现在发现,只要手机一进入待机状态,这个线程就停止工作了. 不过有一个奇怪的现象,因为我的应用中同时启动了三个线程. 一个负责每隔一分钟上传一个数据,当待机的时候,这个线程暂停运行,当手机不待机的时候,马上复活. 一个负责接收服务器发过来的UDP数据包,这个线程倒是不受待机的影响,当有

Android之——应用更新功能

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46916021 一.概述 相信大家都遇到过这种情况,就是在Android手机中的应用,往往在应用的设置里面,都会有一个检查更新的功能,如果应用开发商或者运营商发布了新的应用版本,点击设置里面检查更新的按钮就会提示用户有新版本,是否需要更新,如果用户点击了"立即更新"后,会将应用开发商或运营商服务器上最新的应用版本更新到手机中,如果用户没有选择立即更新,则不会更新手机应用程

Android - 软件自动更新的实现(转)

在客户端实现更新操作 涉及到三个技术: 1.xml文件的解析 2.HttpURLConnection连接 3.文件流I/O 这里创建一个解析xml文件的服务类:ParXmlService.java [java] view plaincopy package com.xiaowu.news.update; import java.io.InputStream; import java.util.HashMap; import javax.xml.parsers.DocumentBuilder; i

Android关于线程更新UI的方法

Android关于线程更新UI的方法 在一个Android 程序开始运行的时候,会单独启动一个Process.默认的情况下,所有这个程序中的Activity或者Service(Service和 Activity只是Android提供的Components中的两种,除此之外还有Content Provider和Broadcast Receiver)都会跑在这个Process.   一个Android 程序默认情况下也只有一个Process,但一个Process下却可以有许多个Thread.   在

ThinkPad E430C从待机状态恢复后,无线网络就不可用了

神奇的问题,ThinkPad E430C从待机状态恢复后,无线网络就不可用了. Windows7系统,按Fn+F8或F7可以调节屏幕亮度,但是F9+Fn也没反应. 把驱动卸载了重新安装了也不管用,Windows诊断提示无线功能已关闭. 实在没办法,还是找个能上网的搜索一下吧,结果是需要修改BIOS: 开机按F1键 进入BIOS界面 进入config--network--wirless LAN Radio 选择ON,开启内部无线通信. 保存退出. 尼玛我就有事离开的时间比较长,电脑进入了待机状态,

spark 笔记 13: 再看DAGScheduler,stage状态更新流程

当某个task完成后,某个shuffle Stage X可能已完成,那么就可能会一些仅依赖Stage X的Stage现在可以执行了,所以要有响应task完成的状态更新流程. =======================DAG task完成后的更新流程=================== ->CoarseGrainedSchedulerBackend::receiveWithLogging  --调度器的事件接收器 ->case StatusUpdate(executorId, taskId

Android App补丁更新

上一周比较忙,忙的不可开交,写的文章也就两篇,在此希望大家见谅.这周呢,突然闲下来了,有时间了,就重构了下代码,捣鼓点前卫的技术,沉淀沉淀.所以呢,今天就分享下这几天研究的东西. 移动互联网主打的就是用户体验和产品的快速迭代,通过用户反馈和用户行为跟踪及时调整产品方向,这样才能持续保持生命力和创造力.说的接地气点就是,你频繁的升级更新,有时只是修复了几个bug或者微调了下界面,就让用户下载10几兆甚至更大的apk,而且在目前国内这个4G还不是普及的时候,对用户来说是很不友好的.有没有这样一种策略

android SDK Manager更新不了,出现错误提示:"Failed to fetch URL..."!

可以用以下办法解决: 使用SDK Manager更新时出现问题 Failed to fetch URL https://dl-ssl.google.com/android/repository/repository-6.xml, reason: Connection to https://dl-ssl.google.com refused Failed to fetch URL http://dl-ssl.google.com/android/repository/addons_list-1.x

android获取sdk更新

http://www.th7.cn/Program/Android/201310/154981.shtml 网上许多解决 Android SDK Manager 无法更新(下载)的问题的方法基本都是将https改为http,并修改host文件,其实对于已经翻墙的用户来说,有一种更简便的方法,就是利用Proxy. 其实在option中已经很明显的给出了Proxy Setting,具体解决方法如下: 打 Android SDK Manager,然后选择Tools -> Options 然后将Prox