Android 长按电源键和短按电源键的详细处理流程

前言
         欢迎大家我分享和推荐好用的代码段~~
声明
         欢迎转载,但请保留文章原始出处:
         CSDN
http://www.csdn.net
         雨季o莫忧离:http://blog.csdn.net/luckkof

正文

 

Android

 Android4.x在Framework的PhoneWindowManager对Power(KeyEvent.KEYCODE_POWER)和Home(KeyEvent.KEYCODE_HOME)键做了处理,不会把这些键传送上层应用程序。如需要把这些键发送给Activity和Service,需要在PhoneWindowManager处理这些键时“发送一个广播出去,然后在应用程序接收到广播后做处理”。

       如果应用程序只需要获取获取待机、唤醒、关机、网络状态变化消息,则可监听以下广播消息:
1) 待机:
广播消息:android.intent.action.SCREEN_OFF (代码)
2) 唤醒:
广播消息:android.intent.action.SCREEN_ON (代码)
3) 关机:
广播消息:android.intent.action.ACTION_SHUTDOWN (XML或代码)
4) 网络状态变化:
 广播消息:android.net.conn.CONNECTIVITY_CHANGE (XML或代码)
                  然后调用下面的isNetworkAvailable获取当前网络状态。
public static boolean isNetworkAvailable(Context context) { 

        ConnectivityManager mgr = (ConnectivityManager) context  
                .getSystemService(Context.CONNECTIVITY_SERVICE);  
        NetworkInfo[] info = mgr.getAllNetworkInfo();  
        if (info != null) {  
            for (int i = 0; i < info.length; i++) {  
                if (info[i].getState() == NetworkInfo.State.CONNECTED) {  
                    return true;  
                }  
            }  
        }  
        return false;  
    } 

2. 短按Power键处理流程

    短按Power键处理流程如下图所示:

 

3. 长按Power键处理流程

      长按Power键处理流程如下图所示:       

 

3.1 Message超时处理流程

      如果长按Power键(超过500ms),则此消息(Message.callback为mPowerLongPress)将被执行。mPowerLongPress (PhoneWindowManager.java)定义如下:

private final Runnable mPowerLongPress = new Runnable() {  
    public void run() {  
        // The context isn't read  
        if (mLongPressOnPowerBehavior < 0) {  
            mLongPressOnPowerBehavior = mContext.getResources().getInteger(  
                    com.android.internal.R.integer.config_longPressOnPowerBehavior);  
        }  
        switch (mLongPressOnPowerBehavior) {  
        case LONG_PRESS_POWER_NOTHING:  
            break;  
        case LONG_PRESS_POWER_GLOBAL_ACTIONS:  
            mPowerKeyHandled = true;  
            performHapticFeedbackLw(null, HapticFeedbackConstants.LONG_PRESS, false);  
            sendCloseSystemWindows(SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS);  
            showGlobalActionsDialog();  
            break;  
        case LONG_PRESS_POWER_SHUT_OFF:  
            mPowerKeyHandled = true;  
            performHapticFeedbackLw(null, HapticFeedbackConstants.LONG_PRESS, false);  
            sendCloseSystemWindows(SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS);  
            ShutdownThread.shutdown(mContext, true);  
            break;  
        }  
    }  
};  

它是一个匿名内部类,它是一个实现Runnable的类的对象引用,因此

     new Runnable() {

         public void run(){

         ...

         }

     };

     它包括了定义这个类(只不过这个类没有名字)和实例化这个类的对象。

      当超时时,其执行流程如下图所示:

     

 3.2 reboot系统调用流程

 reboot系统调用流程如下图所示:

 

 4. 如何处理短按和长按电源键

     长按电源键:弹出关机确认对话框(KeyDown之后,如果 500ms之内,没有收到KeyUp则弹出关机确认对话框)

     短按电源键:执行待机(KeyUp时执行<wmActions=4>)或唤醒(KeyDown时执行<wmActions=2>)

    

     对于长按电源键,在PhoneWindowManager.java的interceptKeyBeforeQueueing函数中进行处理,其相关代码如下 :

case KeyEvent.KEYCODE_POWER: {  
    result &= ~ACTION_PASS_TO_USER;  
    if (down) {  
        if (isScreenOn && !mPowerKeyTriggered  
                && (event.getFlags() & KeyEvent.FLAG_FALLBACK) == 0) {  
            mPowerKeyTriggered = true;  
            mPowerKeyTime = event.getDownTime();  
            interceptScreenshotChord();  
        }  
         
        ...  
        // Power Key down, set mPowerLongPress executing after 500ms  
        interceptPowerKeyDown(!isScreenOn || hungUp  
                || mVolumeDownKeyTriggered || mVolumeUpKeyTriggered);  
    } else {  
        mPowerKeyTriggered = false;  
        cancelPendingScreenshotChordAction();  
        if (interceptPowerKeyUp(canceled || mPendingPowerKeyUpCanceled)) {  
            result = (result & ~ACTION_POKE_USER_ACTIVITY) | ACTION_GO_TO_SLEEP;  
        }  
        // Power key up, remove the mPowerLongPress, that is, if user release  
        // power key during 500ms, mPowerLongPress will not be execute, then execute sleep  
        mPendingPowerKeyUpCanceled = false;  
    }  
    break;  
}  
private void interceptPowerKeyDown(boolean handled) {  
    mPowerKeyHandled = handled;  
    if (!handled) {  
        mHandler.postDelayed(mPowerLongPress, ViewConfiguration.getGlobalActionKeyTimeout()/*500ms*/);  
    }  
}  
  
private boolean interceptPowerKeyUp(boolean canceled) {  
    if (!mPowerKeyHandled) {  
        mHandler.removeCallbacks(mPowerLongPress);  
        return !canceled;  
    }  
    return false;  
}  




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值