[Android] Android 物理鍵點選響應 Menu Home Back 鍵點選捕獲
阿新 • • 發佈:2019-02-03
【需求說明】
捕獲安卓手機的物理按鍵(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(); } } } } }
【效果展示】