一、前言:
本篇文章介紹如何在Android中實現監聽返回鍵,主鍵,菜單鍵。一般情況下,我們都可以在Android手機底部看到三個按鈕,這三個按鈕就分別是返回鍵,主鍵,菜單鍵。
接下來介紹監聽這三個鍵的實現。
二、監聽返回鍵
1、第一種方法通過onBackPressed()方法來實現
/** * 注意: * super.onBackPressed()會自動調用finish()方法,關閉當前Activity. */ @Override public void onBackPressed() { super.onBackPressed(); Toast.makeText(this, "按下了back鍵 onBackPressed()", Toast.LENGTH_SHORT).show(); }
說明:onBackPressed()提供的功能有限,它這是在退出之前通知onBackPressed()方法,並不能改變用戶原來的行為
2、利用onKeyDown方法,就可以實現
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { if ((keyCode == KeyEvent.KEYCODE_BACK)) { Toast.makeText(this, "按下了back鍵 onKeyDown()", Toast.LENGTH_SHORT).show(); return false; }else { return super.onKeyDown(keyCode, event); } }
說明:onKeyDown方法返回true表示退出,返回false便不退出。
3、還可以通過跳轉來實現退出
1 @Override 2 public boolean onKeyDown(int keyCode, KeyEvent event) { 3 if(keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN){ 4 Intent intent = new Intent(Intent.ACTION_MAIN); 5 intent.addCategory(Intent.CATEGORY_HOME); 6 startActivity(intent); 7 } 8 return super.onKeyDown(keyCode, event); 9 }
4、通過onKeyDown我們可以實現,實現“再按一次返回鍵退出程序”的功能
1 private long exitTime = 0; 2 @Override 3 public boolean onKeyDown(int keyCode, KeyEvent event) { 4 if(keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN){ 5 if((System.currentTimeMillis()-exitTime) > 2000){ 6 Toast.makeText(getApplicationContext(), "再按一次退出程序", Toast.LENGTH_SHORT).show(); 7 exitTime = System.currentTimeMillis(); 8 } else { 9 finish(); 10 System.exit(0); 11 } 12 return true; 13 } 14 return super.onKeyDown(keyCode, event); 15 }
三、監聽 主鍵(Home鍵)
監聽Home鍵可以通過onUserLeaveHint()方法來實現,
1 @Override 2 protected void onUserLeaveHint() { 3 super.onUserLeaveHint(); 4 Toast.makeText(this, "onUserLeaveHint", Toast.LENGTH_SHORT).show(); 5 }
說明:在這個方法中,我們可以觀察出,如果onUserLeaveHint方法是不能改變用戶的行為的。
四、監聽 菜單鍵
在手機下方的三個鍵中,最右邊的鍵就是菜單鍵,通常是用方括號表示的。經過筆者的測試發現,如果輕點一下,那么會跳出菜單界面,如果長點的話,那么會退出程序。這個過程會自動調用onUserLeaveHint方法,也就是主鍵。
1、菜單的監聽也可以通過onKeyDown()方法來實現
1 @Override 2 public boolean onKeyDown(int keyCode, KeyEvent event) { 3 if (keyCode == KeyEvent.KEYCODE_MENU) { 4 Toast.makeText(this, "onkeyDown clicked", Toast.LENGTH_SHORT) 5 .show(); 6 super.openOptionsMenu(); // 調用這個,就可以彈出菜單 7 } 8 return true; // 最后,一定要做完以后返回 true,或者在彈出菜單后返回true,其他鍵返回super,讓其他鍵默認 9 }
2、處理上面這樣的方法,onOptionsMenuClosed()方法也可以實現。
1 @Override 2 public void onOptionsMenuClosed(Menu menu) { 3 super.onOptionsMenuClosed(menu); 4 Toast.makeText(this, "onOptionsMenuClosed clicked", Toast.LENGTH_SHORT) 5 .show(); 6 }
經過筆者的測試,發生這些方法在高版本中可能出現不兼容的情況,關於菜單可以查看 Android中Menu菜單
五、onKeyDown詳解:
監聽返回鍵,通過在 Activity 中重寫onKeyDown方法。
1 override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { 2 return super.onKeyDown(keyCode, event) 3 }
-
onKeyDown方法,該方法是接口KeyEvent.Callback中的抽象方法,所有的View全部實現了該接口並重寫了該方法,該方法用來捕捉手機鍵盤被按下的事件。
-
參數keyCode,該參數指的是被按下的鍵的鍵盤碼,手機鍵盤中每個按鈕都會有其對應的鍵盤碼,在應用程序都是通過鍵盤碼才知道用戶按下的是哪個鍵。
-
當用戶按下按鍵時,系統會自動將事件封裝成KeyEvent對象供應用程序使用。按鍵事件KeyEvent按鍵事件有多種常量類型,比如 KEYCODE_BACK
-
返回值,該方法的返回值為一個boolean類型的變量,當返回true時,表示已經完整地處理了這個事件,並不希望其他的回調方法再次進行處理,而當返回false時,表示並沒有完全處理完該事件,更希望其他回調方法繼續對其進行處理,例如Activity中的回調方法。
鏈接:https://www.jianshu.com/p/9da340c237d3