Android 长按电源键和短按电源键的详细处理流程-阿里云开发者社区

开发者社区> 一叶飘舟> 正文

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

简介:
+关注继续查看

1 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)定义如下:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  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在CODE上查看代码片派生到我的代码片
  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在CODE上查看代码片派生到我的代码片
  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. }    

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
PostgreSQL逻辑订阅处理流程解析
PostgreSQL逻辑订阅处理流程解析
996 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
3955 0
Andriod 通话处理流程
Andriod通话处理流程 一、总览 1、从java端发送at命令的处理流程。 2、unsolicited 消息从modem上报到java的流程。 3、猫相关的各种状态的监听和通知机制。 4、通话相关的图标变换的工作原理。
676 0
大话存储系列7——文件系统和IO处理流程
1、文件系统 在早期的计算机系统中,每个程序都必须自己管理磁盘,在磁盘中放自己的数据,程序需要直接和磁盘控制器打交道。有多少个程序要利用磁盘,就有多少个磁盘交互启动接口。
1059 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
5669 0
[Android]Android焦点流程代码分析
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/7286503.html 通过View的View::focusSearch进行焦点搜索对应方向上的下一个可以获取焦点的View: public View focus...
998 0
android 标准OTA升级流程
标准的OTA升级流程包括一下几个步骤: 1.Android设备首先会与OTA服务器进行交互,如果有更新会推送给客户。推送的信息常常会包含OTA更新包的下载地址和一些版本信息。 2.Update程序会将更新包下载到cache分区下,并提醒用户安装更新。
1719 0
+关注
1635
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载