首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Android >

Android4.x对长按电源键(挂断键)跟短按电源键(挂断键)的详细处理流程

2013-09-06 
Android4.x对长按电源键(挂断键)和短按电源键(挂断键)的详细处理流程1. 简介Android4.x在Framework的Phone

Android4.x对长按电源键(挂断键)和短按电源键(挂断键)的详细处理流程
1. 简介

        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键处理流程如下图所示:

Android4.x对长按电源键(挂断键)跟短按电源键(挂断键)的详细处理流程

 3. 长按Power键处理流程

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

 Android4.x对长按电源键(挂断键)跟短按电源键(挂断键)的详细处理流程

3.1 Message超时处理流程

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


  •      

     3.2 reboot系统调用流程

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

    Android4.x对长按电源键(挂断键)跟短按电源键(挂断键)的详细处理流程

     

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

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

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

        

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

  • 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;  }  




     

  • 热点排行