Saturday, December 29, 2018

Xử lý sự kiện nút home



Để bắt sự kiện nút home, ta có thể dùng onWindowFocusChanged để biết ứng dụng đã mất focus, hoặc ta tạo một hàm nghe riêng nút home như sau.
public class HomeWatcher {
    static final String TAG = "hg";
    private Context mContext;
    private IntentFilter mFilter;
    private OnHomePressedListener mListener;
    private InnerReceiver mReceiver;

    public HomeWatcher(Context context) {
         mContext = context;
         mFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
    }

    public void setOnHomePressedListener(OnHomePressedListener listener) {
         mListener = listener;
         mReceiver = new InnerReceiver();
    }

    public void startWatch() {
         if (mReceiver != null) {
             mContext.registerReceiver(mReceiver, mFilter);
         }
    }

    public void stopWatch() {
         if (mReceiver != null) {
             mContext.unregisterReceiver(mReceiver);
         }
    }
    class InnerReceiver extends BroadcastReceiver {
         final String SYSTEM_DIALOG_REASON_KEY = "reason";
         final String SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS = "globalactions";
         final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps";
         final String SYSTEM_DIALOG_REASON_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_DIALOG_REASON_KEY);
                 if (reason != null) {
                      //Log.e(TAG, "action:" + action + ",reason:" + reason);
                      if (mListener != null) {
                          if (reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY)) {
                               mListener.onHomePressed();
                          } else if (reason
                                   .equals(SYSTEM_DIALOG_REASON_RECENT_APPS)) {
                               mListener.onHomeLongPressed();
                          }
                      }
                 }  
             }
         }
    }
}
Tại class chính, khai báo biến.
HomeWatcher mHomeWatcher = new HomeWatcher(this);
Copy hàm sau vào trên ngoặc đóng cuối cùng.
public interface OnHomePressedListener {
         void onHomePressed();
         void onHomeLongPressed();
  }
Copy vào trong onCreate()
mHomeWatcher.setOnHomePressedListener(new OnHomePressedListener() {
    @Override
public void onHomePressed() {
   finish();
 Intent intent = new Intent(getBaseContext(), ac.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT)  
startActivity(intent);
}
@Override
public void onHomeLongPressed() {
}
}); 
mHomeWatcher.startWatch();

Ở đây ta muốn khi người dùng ấn nút home quay về màn hình đầu, class có tên ac vẫn sẽ được mở lại. Bạn có thể sửa đi nếu muốn thực hiện tác vụ khác.Cuối cùng thêm đoạn sau vào để dừng hẳn khi thoát class.
@Override
    protected void onDestroy() {
         mHomeWatcher.stopWatch();
         super.onDestroy();
  }
Nếu bạn canh các nút trên điện thoại theo cách sau.
@Override
 public boolean onKeyDown(int keyCode, KeyEvent event) {
if ((keyCode == KeyEvent.KEYCODE_HOME)) {

 return true;
 }
if ((keyCode == KeyEvent.KEYCODE_BACK)) {
        
  return true;
 }
if ((keyCode == KeyEvent.KEYCODE_MENU)) {
          
return false;
}
return super.onKeyDown(keyCode, event);
}
Thực tế nút home sẽ không có phản ứng gì khi ấn nó. Nếu thêm đoạn sau vào.
@Override
    public void onPause() {
         super.onPause();
//do smt
         }
Lúc này nút home sẽ có thể bắt được sự kiện chạm vào, lệnh xảy ra khi ấn nút home sẽ là lệnh ở trong onPause(). Tuy nhiên cả nút home và nút menu đều có phản ứng như nhau nếu trong KEYCODE_MENU bạn để là return true; muốn phân biệt chúng phải để là return false; và đặt thêm các biến phụ. Dùng cách trên chỉ có nút home phản ứng khi chạm vào.

No comments:

Post a Comment