【Android 進階】Android Home 鍵監聽


Android Home鍵監聽

Android 普通鍵值可以直接在dispatchKeyEvent()中處理,但Home鍵,比較特殊,需要單獨監聽其廣播,且必須為動態廣播,其靜態廣播無效;

需求:Home鍵,設置 Kill 自己,但設置中有多個Activity,在每個Activiy 中年監聽Home鍵廣播不現實,必須把監聽廣播抽取出來在同一個類中實現,考慮到BaseActivity;

public class BaseActivity extends Activity {
    
    private HomeWatcherReceiver mHomeWatcherReceiver = null;
    private boolean isNeedFinish = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        registerReceiver();
    }
    
    public void setBackFinish(boolean flag) {
        isNeedFinish = flag;
    }
    
    private void registerReceiver() {
        mHomeWatcherReceiver = new HomeWatcherReceiver();
        IntentFilter filter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
        registerReceiver(mHomeWatcherReceiver, filter);
    }
    
    
    @Override
    public boolean dispatchKeyEvent(KeyEvent event) {
        
        int KeyCode = event.getKeyCode();
        
        if (event.getAction() == KeyEvent.ACTION_DOWN) {
            if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
                this.finish();
                System.gc();
                return true;
            }
        }
        return super.dispatchKeyEvent(event);
    }
    public class HomeWatcherReceiver extends BroadcastReceiver {

        private static final String SYSTEM_DIALOG_REASON_KEY = "reason";
        private static final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";
        
        @Override
        public void onReceive(Context context, Intent intent) {

            String intentAction = intent.getAction();
            Log.i(MyAPP, "intentAction =" + intentAction);
            if (TextUtils.equals(intentAction, Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) {
                String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY);
                Log.i(MyAPP, "reason =" + reason);
                if (TextUtils.equals(SYSTEM_DIALOG_REASON_HOME_KEY, reason)) {
                    BaseActivity.this.finish();
                }
            }
        }

    }
    
    @Override
    protected void onDestroy() {
        super.onDestroy();
        
        if (mHomeWatcherReceiver != null) {
            try {
                unregisterReceiver(mHomeWatcherReceiver);
            }
            catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,301評論 25 708
  • 1.什么是Activity?問的不太多,說點有深度的 四大組件之一,一般的,一個用戶交互界面對應一個activit...
    JoonyLee閱讀 5,760評論 2 51
  • 本文出自 Eddy Wiki ,轉載請注明出處:http://eddy.wiki/interview-androi...
    eddy_wiki閱讀 3,300評論 0 20
  • 須臾之間,都是人生最美好的年華,我似乎已經錯過很多,浪費很多,我只想留下一些心情,記錄一些片段,待我年老,可以微笑...
    秋千架_閱讀 381評論 0 0
  • 進入action.api文件夾輸入命令 apidoc -i . -o d:/ksjapi
    zhuxuewen閱讀 342評論 0 0