Android Home鍵監聽
Android 普通鍵值可以直接在dispatchKeyEvent()中處理,但Home鍵,比較特殊,需要單獨監聽其廣播,且必須為動態廣播,其靜態廣播無效;
需求:Home鍵,設置 Kill 自己,但設置中有多個Activity,在每個Activiy 中年監聽Home鍵廣播不現實,必須把監聽廣播抽取出來在同一個類中實現,考慮到BaseActivity;
public class BaseActivity extends Activity {
private HomeWatcherReceiver mHomeWatcherReceiver = null;
private boolean isNeedFinish = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
registerReceiver();
}
public void setBackFinish(boolean flag) {
isNeedFinish = flag;
}
private void registerReceiver() {
mHomeWatcherReceiver = new HomeWatcherReceiver();
IntentFilter filter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
registerReceiver(mHomeWatcherReceiver, filter);
}
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
int KeyCode = event.getKeyCode();
if (event.getAction() == KeyEvent.ACTION_DOWN) {
if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
this.finish();
System.gc();
return true;
}
}
return super.dispatchKeyEvent(event);
}
public class HomeWatcherReceiver extends BroadcastReceiver {
private static final String SYSTEM_DIALOG_REASON_KEY = "reason";
private static final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";
@Override
public void onReceive(Context context, Intent intent) {
String intentAction = intent.getAction();
Log.i(MyAPP, "intentAction =" + intentAction);
if (TextUtils.equals(intentAction, Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) {
String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY);
Log.i(MyAPP, "reason =" + reason);
if (TextUtils.equals(SYSTEM_DIALOG_REASON_HOME_KEY, reason)) {
BaseActivity.this.finish();
}
}
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mHomeWatcherReceiver != null) {
try {
unregisterReceiver(mHomeWatcherReceiver);
}
catch (Exception e) {
e.printStackTrace();
}
}
}
}