一、首先談一下HOME鍵(主頁鍵),因爲HOME鍵比較特殊,根據系統的不同處理,來處理的,以下是我常用的方式
1、系統廣播方式
private HomeKeyBroadcastReceiver mHomeKeyBroadcastReceiver;
//註冊監聽hone鍵廣播
if (mHomeKeyBroadcastReceiver == null) {
mHomeKeyBroadcastReceiver = new HomeKeyBroadcastReceiver();
registerReceiver(mHomeKeyBroadcastReceiver, new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS));
}
//註銷監聽hone鍵廣播。防止內存泄漏
if (mHomeKeyBroadcastReceiver != null) {
unregisterReceiver(mHomeKeyBroadcastReceiver);
mHomeKeyBroadcastReceiver = null;
}
class HomeKeyBroadcastReceiver extends BroadcastReceiver {
private final String SYSTEM_REASON = "reason";
private final String SYSTEM_HOME_KEY = "homekey";// home key
@Override
public void onReceive(Context context, Intent intent) {
if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(intent.getAction())) {
String reason = intent.getStringExtra(SYSTEM_REASON);
if (TextUtils.equals(reason, SYSTEM_HOME_KEY)) {
//做相應的邏輯,比如退出應用,殺死進程
}
}
}
}
}
2、onkey事件來監聽,可以用onkeydown,也可以用dispatchKeyEvent,一個道理,這裏寫dispatchKeyEvent方法的使用
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_UP) {
if (event.getKeyCode() == KeyEvent.KEYCODE_HOME) {
//做相應的邏輯,比如退出應用,殺死進程
}
}}
這裏用ACTION_UP和ACTION_DOWN,都可以,不過還是要看使用場景是怎麼樣的
其他按鍵,其實有兩種方式,一種是onkey事件,一種是dispatchKeyEvent,最開始接觸的同學,可能都會先用onkey事件,比如onKeyDown和onKeyUp,不過Android TV開發時間久了,
dispatchKeyEvent事件也得知道,因爲是根據一些特別的情況,例如要通過接口回調,來進行按鍵事件的傳遞,舉個例子,可能寫了一個工具類,專門用來做些事件的處理,這個時候,你要是用onKeyDown,就比較費事,還不如直接傳遞
KeyEvent,直接按下和擡起的事件都傳遞了,節省代碼行數,下面我寫一個簡單的用法示例
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
try {
if (event.getAction() == KeyEvent.ACTION_DOWN) {
if (event.getKeyCode() == KeyEvent.KEYCODE_DPAD_DOWN) {
//下鍵
return true;
} else if (event.getKeyCode() == KeyEvent.KEYCODE_DPAD_UP) {
//上鍵
return true;
} else if (event.getKeyCode() == KeyEvent.KEYCODE_DPAD_LEFT) {
//左鍵
return true;
} else if (event.getKeyCode() == KeyEvent.KEYCODE_DPAD_RIGHT) {
//右鍵
return true;
} else if (event.getKeyCode() == KeyEvent.KEYCODE_BACK || event.getKeyCode() == KeyEvent.KEYCODE_ESCAPE) {
//返回鍵,不同設備鍵值可能不一樣,最好兼容
return true;
} else if (event.getKeyCode() == KeyEvent.KEYCODE_ENTER || event.getKeyCode() == KeyEvent.KEYCODE_DPAD_CENTER) {
//確認鍵,不同設備鍵值可能不一樣,最好兼容
return true;
} else if (event.getKeyCode() == KeyEvent.KEYCODE_MENU) {
//菜單鍵
return true;
}
}
//ACTION_UP同理
} catch (Exception e) {
Log.e(TAG, "dispatchKeyEvent:Exception:" + e.toString());
}
return super.dispatchKeyEvent(event);
}