Android之Home鍵監聽封裝

來源:互聯網
上載者:User

眾所周知,我們監聽返回鍵事件,無法是下面兩個方法:[java] view plaincopyprint?
@Override 
    public void onBackPressed() { 
        //do something  
        //super.onBackPressed();  
    } 
     
    @Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
        if(keyCode == KeyEvent.KEYCODE_BACK){ 
            //do something  
        } 
        return super.onKeyDown(keyCode, event); 
    } 

@Override
 public void onBackPressed() {
  //do something
  //super.onBackPressed();
 }
 
 @Override
 public boolean onKeyDown(int keyCode, KeyEvent event) {
  if(keyCode == KeyEvent.KEYCODE_BACK){
   //do something
  }
  return super.onKeyDown(keyCode, event);
 }


於是乎,我們理所當然的想到,監聽Home鍵的方法是:if(keyCode == KeyEvent.KEYCODE_HOME)。但實際上,這樣是行不通的,因為此時home鍵的訊息在framework層就已經被攔截,所以,我們在應用中通過此方法是無法監聽到Home鍵的訊息的。那麼我們如何捕獲Home鍵事件,並作出相應處理呢?其實系統還是給我們發出廣播的,下面,就跟大家分享一下,封裝好了的監聽Home鍵的方法:

HomeWatcher類:

 

[java]
/**
 * Home鍵監聽封裝
 * 
 * @author way
 * 
 */ 
public class HomeWatcher { 
 
    static final String TAG = "HomeWatcher"; 
    private Context mContext; 
    private IntentFilter mFilter; 
    private OnHomePressedListener mListener; 
    private InnerRecevier mRecevier; 
 
    // 回調介面  
    public interface OnHomePressedListener { 
        public void onHomePressed(); 
 
        public void onHomeLongPressed(); 
    } 
 
    public HomeWatcher(Context context) { 
        mContext = context; 
        mFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); 
    } 
 
    /**
     * 設定監聽
     * 
     * @param listener
     */ 
    public void setOnHomePressedListener(OnHomePressedListener listener) { 
        mListener = listener; 
        mRecevier = new InnerRecevier(); 
    } 
 
    /**
     * 開始監聽,註冊廣播
     */ 
    public void startWatch() { 
        if (mRecevier != null) { 
            mContext.registerReceiver(mRecevier, mFilter); 
        } 
    } 
 
    /**
     * 停止監聽,登出廣播
     */ 
    public void stopWatch() { 
        if (mRecevier != null) { 
            mContext.unregisterReceiver(mRecevier); 
        } 
    } 
 
    /**
     * 廣播接收者
     */ 
    class InnerRecevier 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)) { 
                            // 短按home鍵  
                            mListener.onHomePressed(); 
                        } else if (reason 
                                .equals(SYSTEM_DIALOG_REASON_RECENT_APPS)) { 
                            // 長按home鍵  
                            mListener.onHomeLongPressed(); 
                        } 
                    } 
                } 
            } 
        } 
    } 

/**
 * Home鍵監聽封裝
 *
 * @author way
 *
 */
public class HomeWatcher {

 static final String TAG = "HomeWatcher";
 private Context mContext;
 private IntentFilter mFilter;
 private OnHomePressedListener mListener;
 private InnerRecevier mRecevier;

 // 回調介面
 public interface OnHomePressedListener {
  public void onHomePressed();

  public void onHomeLongPressed();
 }

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

 /**
  * 設定監聽
  *
  * @param listener
  */
 public void setOnHomePressedListener(OnHomePressedListener listener) {
  mListener = listener;
  mRecevier = new InnerRecevier();
 }

 /**
  * 開始監聽,註冊廣播
  */
 public void startWatch() {
  if (mRecevier != null) {
   mContext.registerReceiver(mRecevier, mFilter);
  }
 }

 /**
  * 停止監聽,登出廣播
  */
 public void stopWatch() {
  if (mRecevier != null) {
   mContext.unregisterReceiver(mRecevier);
  }
 }

 /**
  * 廣播接收者
  */
 class InnerRecevier 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)) {
       // 短按home鍵
       mListener.onHomePressed();
      } else if (reason
        .equals(SYSTEM_DIALOG_REASON_RECENT_APPS)) {
       // 長按home鍵
       mListener.onHomeLongPressed();
      }
     }
    }
   }
  }
 }
}

 

 

接下來,我們需要在應用中開啟監聽,下面是以在Activity中的應用為例:


[java] 
/**
 * 應用HomeWatcher小例
 * 
 * @author way
 * 
 */ 
public class MainActivity extends Activity { 
    private static final String TAG = "MainActivity"; 
    private HomeWatcher mHomeWatcher; 
 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main); 
 
        mHomeWatcher = new HomeWatcher(this); 
        mHomeWatcher.setOnHomePressedListener(new OnHomePressedListener() { 
            @Override 
            public void onHomePressed() { 
                Log.e(TAG, "onHomePressed"); 
            } 
 
            @Override 
            public void onHomeLongPressed() { 
                Log.e(TAG, "onHomeLongPressed"); 
            } 
        }); 
        mHomeWatcher.startWatch(); 
    } 
 
    @Override 
    protected void onPause() { 
        super.onPause(); 
        mHomeWatcher.stopWatch();// 在onPause中停止監聽,不然會報錯的。  
    } 

/**
 * 應用HomeWatcher小例
 *
 * @author way
 *
 */
public class MainActivity extends Activity {
 private static final String TAG = "MainActivity";
 private HomeWatcher mHomeWatcher;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  mHomeWatcher = new HomeWatcher(this);
  mHomeWatcher.setOnHomePressedListener(new OnHomePressedListener() {
   @Override
   public void onHomePressed() {
    Log.e(TAG, "onHomePressed");
   }

   @Override
   public void onHomeLongPressed() {
    Log.e(TAG, "onHomeLongPressed");
   }
  });
  mHomeWatcher.startWatch();
 }

 @Override
 protected void onPause() {
  super.onPause();
  mHomeWatcher.stopWatch();// 在onPause中停止監聽,不然會報錯的。
 }
}


 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.