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

 

3. 长按Power键处理流程

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

 

3.1 Message超时处理流程

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

[cpp] view plaincopy

  1. private final Runnable mPowerLongPress = new Runnable() {  
  2.     public void run() {  
  3.         // The context isn't read  
  4.         if (mLongPressOnPowerBehavior < 0) {  
  5.             mLongPressOnPowerBehavior = mContext.getResources().getInteger(  
  6.                     com.android.internal.R.integer.config_longPressOnPowerBehavior);  
  7.         }  
  8.         switch (mLongPressOnPowerBehavior) {  
  9.         case LONG_PRESS_POWER_NOTHING:  
  10.             break;  
  11.         case LONG_PRESS_POWER_GLOBAL_ACTIONS:  
  12.             mPowerKeyHandled = true;  
  13.             performHapticFeedbackLw(null, HapticFeedbackConstants.LONG_PRESS, false);  
  14.             sendCloseSystemWindows(SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS);  
  15.             showGlobalActionsDialog();  
  16.             break;  
  17.         case LONG_PRESS_POWER_SHUT_OFF:  
  18.             mPowerKeyHandled = true;  
  19.             performHapticFeedbackLw(null, HapticFeedbackConstants.LONG_PRESS, false);  
  20.             sendCloseSystemWindows(SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS);  
  21.             ShutdownThread.shutdown(mContext, true);  
  22.             break;  
  23.         }  
  24.     }  
  25. };  

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

     new Runnable() {

         public void run(){

         ...

         }

     };

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

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

     

 3.2 reboot系统调用流程

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

 

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

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

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

    

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

[java] view plaincopy

  1. case KeyEvent.KEYCODE_POWER: {  
  2.     result &= ~ACTION_PASS_TO_USER;  
  3.     if (down) {  
  4.         if (isScreenOn && !mPowerKeyTriggered  
  5.                 && (event.getFlags() & KeyEvent.FLAG_FALLBACK) == 0) {  
  6.             mPowerKeyTriggered = true;  
  7.             mPowerKeyTime = event.getDownTime();  
  8.             interceptScreenshotChord();  
  9.         }  
  10.          
  11.         ...  
  12.         // Power Key down, set mPowerLongPress executing after 500ms  
  13.         interceptPowerKeyDown(!isScreenOn || hungUp  
  14.                 || mVolumeDownKeyTriggered || mVolumeUpKeyTriggered);  
  15.     } else {  
  16.         mPowerKeyTriggered = false;  
  17.         cancelPendingScreenshotChordAction();  
  18.         if (interceptPowerKeyUp(canceled || mPendingPowerKeyUpCanceled)) {  
  19.             result = (result & ~ACTION_POKE_USER_ACTIVITY) | ACTION_GO_TO_SLEEP;  
  20.         }  
  21.         // Power key up, remove the mPowerLongPress, that is, if user release  
  22.         // power key during 500ms, mPowerLongPress will not be execute, then execute sleep  
  23.         mPendingPowerKeyUpCanceled = false;  
  24.     }  
  25.     break;  
  26. }  

[java] view plaincopy

  1. private void interceptPowerKeyDown(boolean handled) {  
  2.     mPowerKeyHandled = handled;  
  3.     if (!handled) {  
  4.         mHandler.postDelayed(mPowerLongPress, ViewConfiguration.getGlobalActionKeyTimeout()/*500ms*/);  
  5.     }  
  6. }  
  7.   
  8. private boolean interceptPowerKeyUp(boolean canceled) {  
  9.     if (!mPowerKeyHandled) {  
  10.         mHandler.removeCallbacks(mPowerLongPress);  
  11.         return !canceled;  
  12.     }  
  13.     return false;  
  14. }  

 

时间: 2024-08-03 18:24:29

Android4.x对长按电源键(挂断键)和短按电源键(挂断键)的详细处理流程的相关文章

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

1 Android  Android4.x在Framework的PhoneWindowManager对Power(KeyEvent.KEYCODE_POWER)和Home(KeyEvent.KEYCODE_HOME)键做了处理,不会把这些键传送上层应用程序.如需要把这些键发送给Activity和Service,需要在PhoneWindowManager处理这些键时"发送一个广播出去,然后在应用程序接收到广播后做处理".        如果应用程序只需要获取获取待机.唤醒.关机.网络状态

java-问题 如何用Java程序实现,父表的主键插入到子表的外键中?

问题描述 问题 如何用Java程序实现,父表的主键插入到子表的外键中? 需求从excel导入数据到mysql数据库,然后父表的主键是自增列,插入数据同时把主键插入子表的外键中(我已经把主表的数据插入了)

imagebutton-Android ImageButton能实现长按,如何同时能实现短按或单击呢?

问题描述 Android ImageButton能实现长按,如何同时能实现短按或单击呢? 这是转载别人的博客的:http://blog.csdn.net/manp1212/article/details/7701896 我参考了上面的代码实现了ImageButton的长按事件,但我想用同一个ImageButton同时实现长按和单击,即长按时实现A事件,短按或单击时实现B事件. 我在处理代码了加了判断语句都不能实现.通过延迟的毫秒数进行判断都不能实现,跪求大神. public class MyRe

mysql 主键 在别的表里面当外键 不允许重复

问题描述 mysql 主键 在别的表里面当外键 不允许重复 在mysql数据库里面,有三张表,如下: student(no,name,class)no是主键, activity(name,time,place)name是主键, select(id,no,name)no,name是外键且分别对应表student和activity 问题:表select输入数据(1,"000'',"排球"):(2,"001'',"看书"):没问题 再输入数据(3,&q

link 环境下,如何处理外键查询的多类型结构,外键多类型查询的实现是什么?

问题描述 link 环境下,如何处理外键查询的多类型结构,外键多类型查询的实现是什么? link 环境下,如何处理外键查询的多类型结构,外键多类型查询的实现是什么? 解决方案 http://www.iteye.com/problems/73405

是不是用JAVA做的BS项目里 javabean就对应数据库一个表 javabean必须有一个主键ID 对应数据库里表的主键 是这样吗

问题描述 是不是用JAVA做的BS项目里javabean就对应数据库一个表javabean必须有一个主键ID对应数据库里表的主键是这样吗 解决方案 解决方案二:请教各位大牛一下是这样的吗解决方案三:没人指点下嘛解决方案四:不是必须的.主要看业务.解决方案五:引用3楼chouy的回复: 不是必须的.主要看业务. 那hibernate不是都要指定主键生成器吗解决方案六:这样做最好了,省的想太多,如果某些表的某些字段经常使用,也可以考虑抽取出来解决方案七:最好指定ID

三星on5手机怎么把音量键设置为拍照或录制视频键

照相机的音量键可设置为拍照键.录制视频键.缩放键,您可以根据需要进行选择,若想设置该功能,请按以下步骤操作:  1.在待机页面下,点击[照相机].    2.点击[设定]图标.    3.点击[音量键功能].    4.根据您的需要进行选择,如[录制视频].    5.设置完成后,点击[←]图标返回照相机界面.    6.在拍照界面按一下[音量]键.(注:音量上键.下键均可.)    7.即开始录制视频.    有了此功能我们在自拍时只需要通过音量键就可以实现了不再需要在屏幕上点击了,操作是非常

鼠标左键失灵怎么设置右键代替左键?

  鼠标作为消耗品,在长时间多次点击之后,容易失灵,尤其是用得较多的左键,有时候鼠标左键失灵了,又没有备用了,怎么办?我们可以用右键代替左键来拯救鼠标. 1.鼠标左键失灵了,不要担心,跟着我一步步操作,即可应急于危难:首先,在键盘上同时按下Win+R两个键(Win键就是键盘下方有着微软图标的键),这样就可以打开运行菜单栏,然后在其中输入control; 2.在运行输入框中输入control之后,即可打开控制面板; 3.在打开的控制面板找到硬件和声音(介于此时鼠标左键已经不能使用,你需要反复点击键

iphone6 home键怎么保养? 保护iphone6的home键的技巧

1.在iphone6桌面点击"设置" -"通用"选项,点击进入 3.然后我们再找到里边的"辅助功能" 然后打开进入了. 4.在进入到新界面会看到有一个"AssistiveTouch"选项,点击打开 5.然后我们开启此功能,之后你会看到屏幕上多了一个白色的小圆点了 第二步.使用虚拟按钮来保护物理Home按键 1.现在我们点击"主屏幕"小白点了,如下图所示 2.然后就可以开始操作了"主屏幕"