Android处理Home键方法小结

来源:互联网 发布:淘宝抢购前1000名半价 编辑:程序博客网 时间:2024/04/30 08:43


昨天需要处理一个问题,需要监听home键。最开始想到使用onKeydonwn这个方法。但是发现home不能这样处理,onKeydonwn可以处理菜单键和back键,但home不能。因为home键是系统键,情况特殊一些。

2.3版本以下重写下面方法就能重写home
public void onAttachedToWindow() {
      this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);
      super.onAttachedToWindow();
}
4.0以上的版本中需要利用以下方法屏蔽和重写Home键,代码如下:
public static final int FLAG_HOMEKEY_DISPATCHED = 0x80000000; //需要自己定义标志
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.getWindow().setFlags(FLAG_HOMEKEY_DISPATCHED, FLAG_HOMEKEY_DISPATCHED);//关键代码
    setContentView(R.layout.main);
}
再重写onKey事件即可。
@Override
      public boolean onKeyDown( int keyCode, KeyEvent event) {
             // TODO Auto-generated method stub
             if (keyCode == event. KEYCODE_HOME) {
                   return true;
            }
             return super.onKeyDown(keyCode, event);

      }

PS:

AndroidMainfest.xml需要加权限:  
<uses-permission android:name = "android.permission.DISABLE_KEYGUARD"/><!-- 屏蔽HOME键需要的权限 -->

在配置文件中,在你使用了Notificationactivity中加一个属性android: android:launchMode="singleInstance"




看了一下网上的资料,说下面的方法可以。(其实不行)
Java代码 :
1   * <a href="http://home.51cto.com/index.php?s=/space/5017954"target="_blank">@Override</a>
2   *    public
3      voidonAttachedToWindow() {  
4   *        // TODO Auto-generated method stub
5   *        Log.d("aeon","onAttachedToWindow");  
6   *        this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);   
7   *        super.onAttachedToWindow();  
8   *    }  
加了权限之后也不行。
Xml代码
1# <uses-permission
2android:name="android.permission.DISABLE_KEYGUARD"
3>
4#    </uses-permission>
实验几次之后(android4.1 和android4.2)发现在单个的activity里面有以下几个方法可以使用:

方法1:onSaveInstanceState方法
下面这个方法可以处理home的监听问题。
Java代码
1protected
2voidonSaveInstanceState(Bundle outState)  
但这个方法不是很好,不推荐


方法2:onUserLeaveHint方法

Java代码
1   * <a href="http://home.51cto.com/index.php?s=/space/5017954"target="_blank">@Override</a>
2   *     protected
3      voidonUserLeaveHint() {  
4   *         Log.d("aeon","onUserLeaveHint");  
5   *         super.onUserLeaveHint();  
6   *     }  
这个方法会在onSaveInstanceState之前执行,根据api的解释,这个方法还比较合适的。

方法3:ACTION_CLOSE_SYSTEM_DIALOGS

在使用广播监听方面可以使用ACTION_CLOSE_SYSTEM_DIALOGS


Java代码
1   *//注册Receiver
2   *
3 
4   *               HomeKeyEventBroadCastReceiver receiver = newHomeKeyEventBroadCastReceiver();  
5   *              registerReceiver(receiver, newIntentFilter(  
6   *                            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代码
01   *private
02      voidhandleLongPressOnHome() {  
03   *         // We can't initialize this in init() since the configuration hasn't been loaded yet.
04   *         if(mLongPressOnHomeBehavior < 0) {  
05   *             mLongPressOnHomeBehavior  
06   *                     = mContext.getResources().getInteger(R.integer.config_longPressOnHomeBehavior);  
07   *             if(mLongPressOnHomeBehavior < LONG_PRESS_HOME_NOTHING ||  
08   *                     mLongPressOnHomeBehavior > LONG_PRESS_HOME_RECENT_SYSTEM_UI) {  
09   *                 mLongPressOnHomeBehavior = LONG_PRESS_HOME_NOTHING;  
10   *             }  
11   *         }  
12   *
13 
14   *         if(mLongPressOnHomeBehavior != LONG_PRESS_HOME_NOTHING) {  
15   *             performHapticFeedbackLw(null, HapticFeedbackConstants.LONG_PRESS, false);  
16   *             sendCloseSystemWindows(SYSTEM_DIALOG_REASON_RECENT_APPS);  
17   *
18 
19   *             // Eat the longpress so it won't dismiss the recent apps dialog when
20   *             // the user lets go of the home key
21   *             mHomeLongPressed = true;  
22   *         }  
23   *
24 
25   *         if(mLongPressOnHomeBehavior == LONG_PRESS_HOME_RECENT_DIALOG) {  
26   *             showOrHideRecentAppsDialog(RECENT_APPS_BEHAVIOR_SHOW_OR_DISMISS);  
27   *         } else
28      if(mLongPressOnHomeBehavior == LONG_PRESS_HOME_RECENT_SYSTEM_UI) {  
29   *             try{  
30   *                 IStatusBarService statusbar = getStatusBarService();  
31   *                 if(statusbar != null) {  
32   *                     statusbar.toggleRecentApps();  
33   *                 }  
34   *             } catch(RemoteException e) {  
35   *                 Slog.e(TAG, "RemoteException when showing recent apps", e);  
36   *                 // re-acquire status bar service next time it is needed.
37   *                 mStatusBarService = null;  
38   *             }  
39   *         }  
40   *     }  
只要把handleLongPressOnHome里面做出相对应的处理就ok
0 0
原创粉丝点击