Android之Home键监听封装

众所周知,我们监听返回键事件,无法是下面两个方法:

@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);  
    }  
View Code

于是乎,我们理所当然的想到,监听Home键的方法是:if(keyCode == KeyEvent.KEYCODE_HOME)。

但实际上,这样是行不通的,因为此时home键的消息在framework层就已经被拦截,所以,我们在应用中通过此方法是无法监听到Home键的消息的。

那么我们如何捕获Home键事件,并作出相应处理呢?其实系统还是给我们发出广播的,下面,就跟大家分享一下,封装好了的监听Home键的方法:

HomeWatcher类:

/** 
 * 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中的应用为例:
/** 
 * 应用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中停止监听,不然会报错的。  
    }  
}  
View Code

 

 

posted @ 2013-11-08 11:23  无恨星晨  阅读(431)  评论(0编辑  收藏  举报