Android Back Home鍵監聽


Back鍵的監聽

  對於Back鍵的監聽比較容易,可以在多個系統回調處攔截,比如在activity的下列方法中都可以收到Back鍵按下的事件:

復制代碼
    @Override
    public void onBackPressed() {
        // super.onBackPressed();//注釋掉這行,back鍵不退出activity

        Log.i(LOG_TAG, "onBackPressed");
    }

    @Override
    public boolean dispatchKeyEvent(KeyEvent event) {
        Log.i(LOG_TAG, "dispatchKeyEvent: keyCode -- " + event.getKeyCode());
        return super.dispatchKeyEvent(event);
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        Log.i(LOG_TAG, "onKeyDown: keyCode -- " + keyCode);

        switch (keyCode) {
        case KeyEvent.KEYCODE_BACK:
            Log.i(LOG_TAG, "KeyEvent.KEYCODE_BACK");
            break;
        case KeyEvent.KEYCODE_MENU:
            Log.i(LOG_TAG, "KeyEvent.KEYCODE_MENU");
            break;
        case KeyEvent.KEYCODE_HOME:
            Log.i(LOG_TAG, "KeyEvent.KEYCODE_HOME");
            // 收不到
            break;
        case KeyEvent.KEYCODE_APP_SWITCH:
            Log.i(LOG_TAG, "KeyEvent.KEYCODE_APP_SWITCH");
            // 收不到
            break;
        default:
            break;
        }

        return super.onKeyDown(keyCode, event);

    }
復制代碼

 

Home鍵的廣播監聽

  對於Home鍵的監聽不是那么容易,因為Home鍵可以將程序退出放在后台,所以這個事件是直接分發給系統,系統接收到之后做相應處理,Home鍵的事件不是直接傳遞到應用里面.所以在上述監聽Back鍵的代碼中,相應的回調中是收不到Home鍵的事件的.

  參考文后的博客鏈接,對Home鍵的監聽主要通過注冊廣播接收器實現,攔截讓窗口關閉的系統動作,然后根據Intent里面的具體參數,分析當前到底是Home鍵, 應用切換鍵,還是其他功能按鍵.

  接收器實現如下:

復制代碼
package com.mengdd.hellohome;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class HomeWatcherReceiver extends BroadcastReceiver {
    private static final String LOG_TAG = "HomeReceiver";
    private static final String SYSTEM_DIALOG_REASON_KEY = "reason";
    private static final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps";
    private static final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";
    private static final String SYSTEM_DIALOG_REASON_LOCK = "lock";
    private static final String SYSTEM_DIALOG_REASON_ASSIST = "assist";

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        Log.i(LOG_TAG, "onReceive: action: " + action);
        if (action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) {
            // android.intent.action.CLOSE_SYSTEM_DIALOGS
            String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY);
            Log.i(LOG_TAG, "reason: " + reason);

            if (SYSTEM_DIALOG_REASON_HOME_KEY.equals(reason)) {
                // 短按Home鍵
                Log.i(LOG_TAG, "homekey");

            }
            else if (SYSTEM_DIALOG_REASON_RECENT_APPS.equals(reason)) {
                // 長按Home鍵 或者 activity切換鍵
                Log.i(LOG_TAG, "long press home key or activity switch");

            }
            else if (SYSTEM_DIALOG_REASON_LOCK.equals(reason)) {
                // 鎖屏
                Log.i(LOG_TAG, "lock");
            }
            else if (SYSTEM_DIALOG_REASON_ASSIST.equals(reason)) {
                // samsung 長按Home鍵
                Log.i(LOG_TAG, "assist");
            }

        }
    }

}
復制代碼

  注意不同手機的按鍵不同,所以需要對不同理由做區分.

 

Home鍵監聽廣播注冊

  廣播接收器的注冊有兩種方式,一種是靜態注冊,即寫在manifest里面聲明;另一種是動態注冊,即在Java代碼里面注冊.

  上面對Home鍵實現監聽的這個receiver,靜態注冊如下:

        <receiver android:name="com.mengdd.hellohome.HomeWatcherReceiver" >
            <intent-filter>
                <action android:name="android.intent.action.CLOSE_SYSTEM_DIALOGS" />
            </intent-filter>
        </receiver>

  但是發現靜態注冊不起作用,即收不到onReceive回調.

 

  采用動態注冊:

復制代碼
    private static HomeWatcherReceiver mHomeKeyReceiver = null;

    private static void registerHomeKeyReceiver(Context context) {
        Log.i(LOG_TAG, "registerHomeKeyReceiver");
        mHomeKeyReceiver = new HomeWatcherReceiver();
        final IntentFilter homeFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);

        context.registerReceiver(mHomeKeyReceiver, homeFilter);
    }

    private static void unregisterHomeKeyReceiver(Context context) {
        Log.i(LOG_TAG, "unregisterHomeKeyReceiver");
        if (null != mHomeKeyReceiver) {
            context.unregisterReceiver(mHomeKeyReceiver);
        }
    }
復制代碼

  

  在Activity的onResume和onPause里面分別調用:

復制代碼
    @Override
    protected void onResume() {
        super.onResume();

        registerHomeKeyReceiver(this);
    }

    @Override
    protected void onPause() {

        unregisterHomeKeyReceiver(this);
        super.onPause();
    }
復制代碼

  當然也可以根據需要在其他合適的時機注冊和注銷.

 

 

android app全屏終極方案

/** * 隱藏虛擬按鍵,並且全屏 */ protected void hideBottomUIMenu() { //隱藏虛擬按鍵,並且全屏 if (Build.VERSION.SDK_INT > 11 && Build.VERSION.SDK_INT < 19) { // lower api View v = this.getWindow().getDecorView(); v.setSystemUiVisibility(View.GONE); } else if (Build.VERSION.SDK_INT >= 19) { //for new api versions. View decorView = getWindow().getDecorView(); int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_FULLSCREEN; decorView.setSystemUiVisibility(uiOptions); } } private void showBottomUIMenu(){ //恢復普通狀態 if (Build.VERSION.SDK_INT > 11 && Build.VERSION.SDK_INT < 19) { // lower api View v = this.getWindow().getDecorView(); v.setSystemUiVisibility(View.VISIBLE); } else if (Build.VERSION.SDK_INT >= 19) { //for new api versions. View decorView = getWindow().getDecorView(); int uiOptions = View.SCREEN_STATE_OFF; decorView.setSystemUiVisibility(uiOptions); } }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM