Chinaunix首页 | 论坛 | 博客
  • 博客访问: 353393
  • 博文数量: 570
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 10
  • 用 户 组: 普通用户
  • 注册时间: 2015-11-17 10:38
文章分类

全部博文(570)

文章存档

2015年(570)

我的朋友

分类: LINUX

2015-11-17 10:50:14

原文地址:4.x 如何处理Power按键 作者:dixiaobing

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

  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. }; 
  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系统调用流程如下图所示:

管理员在2009年8月13日编辑了该文章文章。

-->
阅读(362) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~