[Android] Android 物理键点击响应 Menu Home Back 键点击捕获

【需求说明】

捕获安卓手机的物理按键(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();
                }
            }
        }
    }
}

【效果展示】

[Android] Android 物理键点击响应 Menu Home Back 键点击捕获_第1张图片
  

你可能感兴趣的:(Android开发基础)