您的位置:首页 > 移动开发 > Android开发

Android_监听Home按键的封装

2014-10-17 14:38 363 查看
众所周知,我们监听返回键事件,无法是下面两个方法:

[java] view
plaincopy

@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] view
plaincopy

/** 

 * 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] view
plaincopy

/** 

 * 应用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中停止监听,不然会报错的。  

    }  

}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: