【需求說明】
捕獲安卓手機的實體按鍵(Menu Home Back)三個按鍵的點選動作
【實作方案】
1. Back鍵點選動作最為簡單,通過監聽系統onKeyDown回調實作
2. Menu鍵點選動作,目前也可以通過監聽OnKeyDown回調實作,但是有些手機Menu鍵點選會喚起最近使用的app清單,
此時,長按menu鍵的點選動作才會被解釋為一次Menu KeyDown動作
3. Home鍵點選動作,參考網上已有的實作方案,通過注冊系統廣播的形式,在Activity中動态注冊廣播響應。
這裡需要注意,隻要求檢測App在前台時的home點選動作,是以需要在代碼中添加是否在前台的标志位。
此标志位直接在activity生命周期回調onstart和onstop中進行設定。
實作代碼如下:
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.KeyEvent;
import android.widget.Toast;
/**
* 功能:測試手機實體按鍵點選事件響應
* 作者:lexli
* 部落格:http://blog.csdn.net/csdn_lexli
*
*/
public class MainActivity extends AppCompatActivity {
private String TAG = this.getClass().getSimpleName();
private boolean appInBackground = false;
private HomeKeyClickReceiver homeKeyClickReceiver = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
homeKeyClickReceiver = new HomeKeyClickReceiver();
registerReceiver(homeKeyClickReceiver, new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS));
}
@Override
protected void onStart() {
super.onStart();
appInBackground = false;
}
@Override
protected void onStop() {
super.onStop();
appInBackground = true;
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_MENU:
Log.d(TAG, "menu key clicked!");
Toast.makeText(MainActivity.this, "菜單鍵點選", Toast.LENGTH_SHORT).show();
break;
case KeyEvent.KEYCODE_BACK:
Log.d(TAG, "back key clicked!");
Toast.makeText(MainActivity.this, "傳回鍵點選", Toast.LENGTH_SHORT).show();
break;
default:
break;
}
return super.onKeyDown(keyCode, event);
}
private class HomeKeyClickReceiver extends BroadcastReceiver {
String SYSTEM_REASON = "reason";
String SYSTEM_HOME_KEY = "homekey";
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) {
String reason = intent.getStringExtra(SYSTEM_REASON);
/**
* 這裡注意:隻需要檢測App在前台時的Home鍵點選動作,如果在背景,就不做任何動作
* 是以這裡需要添加appInBackground參數保證app當時不在背景
*/
if (TextUtils.equals(reason, SYSTEM_HOME_KEY) && !appInBackground) {
Log.d(TAG, "home key clicked!");
Toast.makeText(MainActivity.this, "首頁鍵點選", Toast.LENGTH_SHORT).show();
}
}
}
}
}
【效果展示】