Android suspend/resume flow (上篇: User mode)

來源:互聯網
上載者:User

當使用者按下Power button:

0) android/frameworks/base/services/java/com/android/server/WindowManagerService.java
                    boolean screenIsOff = !mPowerManager.isScreenOn();
                    boolean screenIsDim = !mPowerManager.isScreenBright();
                    int actions = mPolicy.interceptKeyTq(event, !screenIsOff);     ===> Step 1
                    if ((actions & WindowManagerPolicy.ACTION_GO_TO_SLEEP) != 0) {
                        mPowerManager.goToSleep(event.when);    ===> Step 2
                    }

 

1) android/frameworks/policies/base/phone/com/android/internal/policy/impl/PhoneWindowManager.java

interceptKeyTq function

 

        if (type == RawInputEvent.EV_KEY) {
            if (code == KeyEvent.KEYCODE_ENDCALL
                    || code == KeyEvent.KEYCODE_POWER) {

                if (down) {

                        。。。。。。。。。。。。。。。。。。。

                        // only try to turn off the screen if we didn't already hang up
                        mShouldTurnOffOnKeyUp = true;
                        mHandler.postDelayed(mPowerLongPress,
                                ViewConfiguration.getGlobalActionKeyTimeout());  ==> 過500ms彈出對話方塊
                        result &= ~ACTION_PASS_TO_USER;

                }

                else {

                    Log.d(TAG, "Power button up /r/n");
                    mHandler.removeCallbacks(mPowerLongPress);               ==> 如果500ms內有power up鍵,取消對話方塊

                    。。。。。。。。。。。。。。。。。

                            result |= ACTION_GO_TO_SLEEP;
                }

 

2) android/framework/base/services/java/com/android/server/PowerManagerService.java
    public void goToSleep(long time)
    {
        goToSleepWithReason(time, WindowManagerPolicy.OFF_BECAUSE_OF_USER);
    }

3) Jave native interface:
android/frameworks/base/core/jni/android_os_Power.cpp

static int
setScreenState(JNIEnv *env, jobject clazz, jboolean on)
{
    return set_screen_state(on);
}

4) android/hardware/libhardware_legacy/power/power.c
int
set_screen_state(int on)
{
    QEMU_FALLBACK(set_screen_state(on));

    initialize_fds();   ===> open("/sys/power/state", O_RDWR);

    if (g_error) return g_error;

    char buf[32];
    int len;
    if(on)
        len = sprintf(buf, on_state);
    else
        len = sprintf(buf, off_state);
    len = write(g_fds[REQUEST_STATE], buf, len);   ===> echo mem > /sys/power/state
    if(len < 0) {
        LOGE("Failed setting last user activity: g_error=%d/n", g_error);
    }
    return 0;
}

5) System will enter suspend mode and it will start normal linux suspend flow

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.