免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1242 | 回复: 0
打印 上一主题 下一主题

[Android] Android处理Home键方法小结 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-05-26 14:13 |只看该作者 |倒序浏览
昨天需要处理一个问题,需要监听home键。最开始想到使用onKeydonwn这个方法。但是发现home不能这样处理,onKeydonwn可以处理菜单键和back键,但home不能。因为home键是系统键,情况特殊一些。
看了一下网上的资料,说下面的方法可以。(其实不行)
Java代码 :
  1. * <a href="http://home.51cto.com/index.php?s=/space/5017954" target="_blank">@Override</a>
  2. 2
  3.     *    public
  4. 3
  5.       void onAttachedToWindow() {  
  6. 4
  7.     *        // TODO Auto-generated method stub
  8. 5
  9.     *        Log.d("aeon","onAttachedToWindow");  
  10. 6
  11.     *        this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);   
  12. 7
  13.     *        super.onAttachedToWindow();  
  14. 8
  15.     *    }  
复制代码

加了权限之后也不行。
Xml代码
  1. # <uses-permission
  2. 2
  3. android:name="android.permission.DISABLE_KEYGUARD"
  4. 3
  5. >
  6. 4
  7. #    </uses-permission>
复制代码

实验几次之后(android4.1 和android4.2)发现在单个的activity里面有以下几个方法可以使用:

方法1:onSaveInstanceState方法
下面这个方法可以处理home的监听问题。
Java代码
  1. protected
  2. 2
  3. void onSaveInstanceState(Bundle outState)
复制代码

但这个方法不是很好,不推荐


方法2:onUserLeaveHint方法

Java代码
  1. <a href="http://home.51cto.com/index.php?s=/space/5017954" target="_blank">@Override</a>
  2. 2
  3.     *     protected
  4. 3
  5.       void onUserLeaveHint() {  
  6. 4
  7.     *         Log.d("aeon","onUserLeaveHint");  
  8. 5
  9.     *         super.onUserLeaveHint();  
  10. 6
  11.     *     }  
复制代码


这个方法会在onSaveInstanceState之前执行,根据api的解释,这个方法还比较合适的。

方法3:ACTION_CLOSE_SYSTEM_DIALOGS

在使用广播监听方面可以使用ACTION_CLOSE_SYSTEM_DIALOGS
Java代码
  1. //注册Receiver
  2. 2
  3.     *
  4. 3

  5. 4
  6.     *               HomeKeyEventBroadCastReceiver receiver = new HomeKeyEventBroadCastReceiver();  
  7. 5
  8.     *              registerReceiver(receiver, new IntentFilter(  
  9. 6
  10.     *                            Intent. ACTION_CLOSE_SYSTEM_DIALOGS));
复制代码

方法4:framework PhoneWindowManager.java 处理

想要完全监听home键需要在framework层去处理。
/frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
里面去修改private void handleLongPressOnHome() 这个方法。

Java代码
  1. private
  2. 02
  3.       void handleLongPressOnHome() {  
  4. 03
  5.     *         // We can't initialize this in init() since the configuration hasn't been loaded yet.
  6. 04
  7.     *         if (mLongPressOnHomeBehavior < 0) {  
  8. 05
  9.     *             mLongPressOnHomeBehavior  
  10. 06
  11.     *                     = mContext.getResources().getInteger(R.integer.config_longPressOnHomeBehavior);  
  12. 07
  13.     *             if (mLongPressOnHomeBehavior < LONG_PRESS_HOME_NOTHING ||  
  14. 08
  15.     *                     mLongPressOnHomeBehavior > LONG_PRESS_HOME_RECENT_SYSTEM_UI) {  
  16. 09
  17.     *                 mLongPressOnHomeBehavior = LONG_PRESS_HOME_NOTHING;  
  18. 10
  19.     *             }  
  20. 11
  21.     *         }  
  22. 12
  23.     *
  24. 13

  25. 14
  26.     *         if (mLongPressOnHomeBehavior != LONG_PRESS_HOME_NOTHING) {  
  27. 15
  28.     *             performHapticFeedbackLw(null, HapticFeedbackConstants.LONG_PRESS, false);  
  29. 16
  30.     *             sendCloseSystemWindows(SYSTEM_DIALOG_REASON_RECENT_APPS);  
  31. 17
  32.     *
  33. 18

  34. 19
  35.     *             // Eat the longpress so it won't dismiss the recent apps dialog when
  36. 20
  37.     *             // the user lets go of the home key
  38. 21
  39.     *             mHomeLongPressed = true;  
  40. 22
  41.     *         }  
  42. 23
  43.     *
  44. 24

  45. 25
  46.     *         if (mLongPressOnHomeBehavior == LONG_PRESS_HOME_RECENT_DIALOG) {  
  47. 26
  48.     *             showOrHideRecentAppsDialog(RECENT_APPS_BEHAVIOR_SHOW_OR_DISMISS);  
  49. 27
  50.     *         } else
  51. 28
  52.       if (mLongPressOnHomeBehavior == LONG_PRESS_HOME_RECENT_SYSTEM_UI) {  
  53. 29
  54.     *             try {  
  55. 30
  56.     *                 IStatusBarService statusbar = getStatusBarService();  
  57. 31
  58.     *                 if (statusbar != null) {  
  59. 32
  60.     *                     statusbar.toggleRecentApps();  
  61. 33
  62.     *                 }  
  63. 34
  64.     *             } catch (RemoteException e) {  
  65. 35
  66.     *                 Slog.e(TAG, "RemoteException when showing recent apps", e);  
  67. 36
  68.     *                 // re-acquire status bar service next time it is needed.
  69. 37
  70.     *                 mStatusBarService = null;  
  71. 38
  72.     *             }  
  73. 39
  74.     *         }  
  75. 40
  76.     *     }  
复制代码

只要把handleLongPressOnHome里面做出相对应的处理就ok
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP