天天看點

[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 鍵點選捕獲