【需求说明】
捕获安卓手机的物理按键(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.youkuaiyun.com/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();
}
}
}
}
}
【效果展示】