<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                前面曾經提到過userActivity的作用,此處舉一個例子加深讀者對它的印象: 打開手機,并解鎖進入桌面。如果在規定時間內不操作手機,那么屏幕將變暗,最后關閉。在此過程中,如果觸動屏幕,屏幕又會重新變亮。這個觸動屏幕的操作將導致userActivity函數被調用。 在上述例子中實際上包含了兩方面的內容: - 不操作手機,屏幕將變暗,最后關閉。在PMS中,這是一個狀態切換的過程。 - 操作手機,將觸發userActivity,此后屏幕的狀態將重置。 來看以下代碼: **PowerManagerService.java::userActivity** ~~~ public voiduserActivity(long time, boolean noChangeLights) { ......//檢查調用進程是否有DEVICE_POWER的權限 userActivity(time, -1, noChangeLights, OTHER_EVENT, false); } ~~~ 此處將調用另外一個同名函數。注意第三個參數的值OTHER_EVENT。系統一共定義了三種事件,分別是OTHER_EVENT(除按鍵、觸摸屏外的事件)、BUTTON_EVENT(按鍵事件)和TOUCH_EVENT(觸摸屏事件)。它們主要為BatteryStatsService進行電量統計時使用,例如觸摸屏事件的耗電量和按鍵事件的耗電量等。 **PowerManagerService.java::userActivity** ~~~ private void userActivity(long time, long timeoutOverride, boolean noChangeLights,inteventType, boolean force) { if(((mPokey & POKE_LOCK_IGNORE_TOUCH_EVENTS) != 0) && (eventType == TOUCH_EVENT)) { //mPokey和輸入事件的處理策略有關。如果此處的if判斷得到滿足,表示忽略TOUCH_EVENT return; } synchronized (mLocks) { if(isScreenTurningOffLocked()) { return; } if(mProximitySensorActive && mProximityWakeLockCount == 0) mProximitySensorActive = false;//控制接近傳感器 if(mLastEventTime <= time || force) { mLastEventTime = time; if((mUserActivityAllowed && !mProximitySensorActive) || force) { if (eventType == BUTTON_EVENT && !mUseSoftwareAutoBrightness) { mUserState =(mKeyboardVisible ? ALL_BRIGHT : SCREEN_BUTTON_BRIGHT); } else { mUserState |=SCREEN_BRIGHT;//設置用戶事件導致的mUserState } ......//通知BatteryStatsService進行電量統計 mBatteryStats.noteUserActivity(uid,eventType); //重新計算WakeLock狀態 mWakeLockState = mLocks.reactivateScreenLocksLocked(); setPowerState(mUserState | mWakeLockState, noChangeLights, WindowManagerPolicy.OFF_BECAUSE_OF_USER); //重新開始屏幕計時 setTimeoutLocked(time, timeoutOverride, SCREEN_BRIGHT); } } } //mPolicy指向PhoneWindowManager,用于和WindowManagerService交互 if(mPolicy != null) { mPolicy.userActivity(); } } ~~~ 有了前面分析的基礎,相信很多讀者都會覺得userActivity函數很簡單。在前面的代碼中,通過setPowerState點亮了屏幕,那么經過一段時間后發生的屏幕狀態切換在哪兒進行呢?來看setTimeoutLocked函數的代碼: **PowerManagerService.java::setTimeoutLocked** ~~~ private void setTimeoutLocked(long now, final longoriginalTimeoutOverride, intnextState) { //在本例中,nextState為SCREEN_BRIGHT,originalTimeoutOverride為-1 longtimeoutOverride = originalTimeoutOverride; if(mBootCompleted) { synchronized (mLocks) { long when = 0; if(timeoutOverride <= 0) { switch (nextState) { case SCREEN_BRIGHT: when = now + mKeylightDelay;//得到一個超時時間 break; case SCREEN_DIM: if (mDimDelay >= 0) { when = now + mDimDelay; break; } ...... case SCREEN_OFF: synchronized (mLocks) { when = now +mScreenOffDelay; } break; default: when = now; break; } }......//處理timeoutOverride大于零的情況,無非就是設置狀態和超時時間 mHandler.removeCallbacks(mTimeoutTask); mTimeoutTask.nextState = nextState; mTimeoutTask.remainingTimeoutOverride = timeoutOverride > 0 ? (originalTimeoutOverride- timeoutOverride) : -1; //拋送一個mTimeoutTask交給mHandler執行,執行時間為when秒后 mHandler.postAtTime(mTimeoutTask, when); mNextTimeout = when; //調試用 } } } ~~~ 接下來看mTimeOutTask的代碼: ~~~ private class TimeoutTask implements Runnable { intnextState; longremainingTimeoutOverride; publicvoid run() { synchronized (mLocks) { if(nextState == -1)return; mUserState = this.nextState; //調用setPowerState去真正改變屏幕狀態 setPowerState(this.nextState| mWakeLockState); long now = SystemClock.uptimeMillis(); switch (this.nextState) { case SCREEN_BRIGHT: if (mDimDelay >= 0) {//設置下一個狀態為SCREEN_DIM setTimeoutLocked(now,remainingTimeoutOverride, SCREEN_DIM); break; } case SCREEN_DIM://設置下一個狀態為SCREEN_OFF setTimeoutLocked(now, remainingTimeoutOverride, SCREEN_OFF); break; }......//省略花括號 } ~~~ TimeoutTask就是用來切換屏幕狀態的,相信不少讀者已經在網絡上見過一個和PMS屏幕狀態切換相關的圖(其實就是TimeoutTask的工作流程解釋),對此,本章就不再介紹了,希望讀者能通過直接閱讀源碼加深理解。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看