點選系統back鍵和menu鍵走的是一個套路,home鍵還沒仔細研究,今天隻說說back和menu
back鍵的順序:
手指按下的時候:dispatchKeyEvent()---->dispatch()---->onkeyDown()
手指擡起的時候:dispatchKeyEvent()---->dispatch()---->onkeyUp()---->onBackPressed()
menu鍵的順序和back鍵類似,隻是在手指擡起的時候不會走onBackPressed()這個方法,如下
手指按下的時候:dispatchKeyEvent()---->dispatch()---->onkeyDown()
手指擡起的時候:dispatchKeyEvent()---->dispatch()---->onkeyUp()
下面是同網上尋找的demo,但是我都已經測試過了哦~
1.Back鍵的監聽
對于Back鍵的監聽比較容易,可以在多個系統回調處攔截,比如在activity的下列方法中都可以收到Back鍵按下的事件:
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
Log.d("FF", "dispatchKeyEvent 1");
switch(event.getKeyCode()){
case KeyEvent.KEYCODE_MENU:
Log.d("FF", "dispatchKeyEvent 1 KEYCODE_MENU");
break;
case KeyEvent.KEYCODE_HOME:
Log.d("FF", "dispatchKeyEvent 1 KEYCODE_HOME");
break;
case KeyEvent.KEYCODE_BACK:
Log.d("FF", "dispatchKeyEvent 1 KEYCODE_BACK");
break;
}
return super.dispatchKeyEvent(event);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
Log.d("FF", "onKeyDown 1");
switch(keyCode){
case KeyEvent.KEYCODE_MENU:
Log.d("FF", "onKeyDown 1 KEYCODE_MENU");
break;
case KeyEvent.KEYCODE_HOME:
Log.d("FF", "onKeyDown 1 KEYCODE_HOME");// 收不到
break;
case KeyEvent.KEYCODE_BACK:
Log.d("FF", "onKeyDown 1 KEYCODE_BACK");
break;
}
return super.onKeyDown(keyCode, event);
}
@Override
public void onBackPressed() {
Log.d("FF", "onBackPressed 1");
// super.onBackPressed(); //注釋掉這行,back鍵不退出activity
}
Home鍵的廣播監聽
雖然可以攔截home鍵,但是同僚和我說這個不是根本解決辦法,對于廣播監聽home鍵,這個廣播會有其他視窗啥的會觸發,具體其他的觸發不太了解,根本方法是修改framework,太深奧了,我就不會了
android back/menu鍵觸發順序

對于Home鍵的監聽不是那麼容易,因為Home鍵可以将程式退出放在背景,是以這個事件是直接分發給系統,系統接收到之後做相應處理,Home鍵的事件不是直接傳遞到應用裡面.是以在上述監聽Back鍵的代碼中, 相應的回調中是收不到Home鍵的事件的 .
參考部落格連結:http://blog.csdn.net/way_ping_li/article/details/8953622
但是做測試的時候發現,在onPause()中停止監聽的話,長按會報錯,注釋掉就OK,具體原因為啥還不太清楚
@Override
protected void onPause() {
super.onPause();
//mHomeWatcher.stopWatch();// 在onPause中停止監聽,不然會報錯的。
}