Android之Home键监听封装

来源:互联网 发布:梦幻之星nova捏脸数据 编辑:程序博客网 时间:2024/05/16 09:25
众所周知,我们监听返回键事件,无法是下面两个方法:
[java] view plaincopy
  1. @Override  
  2.     public void onBackPressed() {  
  3.         //do something  
  4.         //super.onBackPressed();  
  5.     }  
  6.       
  7.     @Override  
  8.     public boolean onKeyDown(int keyCode, KeyEvent event) {  
  9.         if(keyCode == KeyEvent.KEYCODE_BACK){  
  10.             //do something  
  11.         }  
  12.         return super.onKeyDown(keyCode, event);  
  13.     }  


于是乎,我们理所当然的想到,监听Home键的方法是:if(keyCode == KeyEvent.KEYCODE_HOME)。但实际上,这样是行不通的,因为此时home键的消息在framework层就已经被拦截,所以,我们在应用中通过此方法是无法监听到Home键的消息的。那么我们如何捕获Home键事件,并作出相应处理呢?其实系统还是给我们发出广播的,下面,就跟大家分享一下,封装好了的监听Home键的方法:

HomeWatcher类:

[java] view plaincopy
  1. /** 
  2.  * Home键监听封装 
  3.  *  
  4.  * @author way 
  5.  *  
  6.  */  
  7. public class HomeWatcher {  
  8.   
  9.     static final String TAG = "HomeWatcher";  
  10.     private Context mContext;  
  11.     private IntentFilter mFilter;  
  12.     private OnHomePressedListener mListener;  
  13.     private InnerRecevier mRecevier;  
  14.   
  15.     // 回调接口  
  16.     public interface OnHomePressedListener {  
  17.         public void onHomePressed();  
  18.   
  19.         public void onHomeLongPressed();  
  20.     }  
  21.   
  22.     public HomeWatcher(Context context) {  
  23.         mContext = context;  
  24.         mFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);  
  25.     }  
  26.   
  27.     /** 
  28.      * 设置监听 
  29.      *  
  30.      * @param listener 
  31.      */  
  32.     public void setOnHomePressedListener(OnHomePressedListener listener) {  
  33.         mListener = listener;  
  34.         mRecevier = new InnerRecevier();  
  35.     }  
  36.   
  37.     /** 
  38.      * 开始监听,注册广播 
  39.      */  
  40.     public void startWatch() {  
  41.         if (mRecevier != null) {  
  42.             mContext.registerReceiver(mRecevier, mFilter);  
  43.         }  
  44.     }  
  45.   
  46.     /** 
  47.      * 停止监听,注销广播 
  48.      */  
  49.     public void stopWatch() {  
  50.         if (mRecevier != null) {  
  51.             mContext.unregisterReceiver(mRecevier);  
  52.         }  
  53.     }  
  54.   
  55.     /** 
  56.      * 广播接收者 
  57.      */  
  58.     class InnerRecevier extends BroadcastReceiver {  
  59.         final String SYSTEM_DIALOG_REASON_KEY = "reason";  
  60.         final String SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS = "globalactions";  
  61.         final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps";  
  62.         final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";  
  63.   
  64.         @Override  
  65.         public void onReceive(Context context, Intent intent) {  
  66.             String action = intent.getAction();  
  67.             if (action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) {  
  68.                 String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY);  
  69.                 if (reason != null) {  
  70.                     Log.e(TAG, "action:" + action + ",reason:" + reason);  
  71.                     if (mListener != null) {  
  72.                         if (reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY)) {  
  73.                             // 短按home键  
  74.                             mListener.onHomePressed();  
  75.                         } else if (reason  
  76.                                 .equals(SYSTEM_DIALOG_REASON_RECENT_APPS)) {  
  77.                             // 长按home键  
  78.                             mListener.onHomeLongPressed();  
  79.                         }  
  80.                     }  
  81.                 }  
  82.             }  
  83.         }  
  84.     }  
  85. }  


接下来,我们需要在应用中开启监听,下面是以在Activity中的应用为例:

[java] view plaincopy
  1. /** 
  2.  * 应用HomeWatcher小例 
  3.  *  
  4.  * @author way 
  5.  *  
  6.  */  
  7. public class MainActivity extends Activity {  
  8.     private static final String TAG = "MainActivity";  
  9.     private HomeWatcher mHomeWatcher;  
  10.   
  11.     @Override  
  12.     protected void onCreate(Bundle savedInstanceState) {  
  13.         super.onCreate(savedInstanceState);  
  14.         setContentView(R.layout.activity_main);  
  15.   
  16.         mHomeWatcher = new HomeWatcher(this);  
  17.         mHomeWatcher.setOnHomePressedListener(new OnHomePressedListener() {  
  18.             @Override  
  19.             public void onHomePressed() {  
  20.                 Log.e(TAG, "onHomePressed");  
  21.             }  
  22.   
  23.             @Override  
  24.             public void onHomeLongPressed() {  
  25.                 Log.e(TAG, "onHomeLongPressed");  
  26.             }  
  27.         });  
  28.         mHomeWatcher.startWatch();  
  29.     }  
  30.   
  31.     @Override  
  32.     protected void onPause() {  
  33.         super.onPause();  
  34.         mHomeWatcher.stopWatch();// 在onPause中停止监听,不然会报错的。  
  35.     }  
  36. }  
0 0
原创粉丝点击