如何在你的应用中处理Home键的点击和长按事件

首先一看到这个问题我们可能会想到用
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {}

来处理

但是结果却不如人意,这是为什么呢?
我们来看看系统对Home键的处理机制:


看完了这张图我们就会明白:Home键不同于Back键和软键盘,它属于系统键。但在按压时会发出一个广播。所以我们可以通过广播接收者的方式来处理它的按压事件

我们自定义一个Home键监听类,里面来定义一个广播接收者:

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.util.Log;

/** 
 * Home键监听封装 
 *  
 * @author way 
 *  
 */
public class HomeWatcher
{
    
    static final String TAG = "HomeWatcher";
    
    private Context mContext;
    
    private IntentFilter mFilter;
    
    private OnHomePressedListener mListener;
    
    private InnerRecevier mRecevier;
    
    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";
        
        
        public InnerRecevier(){
            
        }
        
        @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键事件的地方来实现:
// 回调接口  
public interface OnHomePressedListener
{
    public void onHomePressed();
    
    public void onHomeLongPressed();
}


接着在清单文件中定义接收器的属性:
        <receiver android:name="com.myapp.plugin.HomeWatcher$InnerRecevier">
            <intent-filter >
                <action android:name="android.intent.action.CLOSE_SYSTEM_DIALOGS"/>
            </intent-filter>
        </receiver>



接下来就可以在需要的地方来处理了:
        @Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_ptt_call_in);
		
		mHomeWatcher = new HomeWatcher(this);
		mHomeWatcher.setOnHomePressedListener(new OnHomePressedListener() {
			@Override
			public void onHomePressed() {
				Log.i(TAG, "onHomePressed");
				notification(); // 在后台运行,通知栏显示小图标				
			}

			@Override
			public void onHomeLongPressed() {
				Log.e(TAG, "onHomeLongPressed");
				// TODO
				
			}
		});
		mHomeWatcher.startWatch();	
	}
	
	@Override
	protected void onDestroy() {
		super.onDestroy();
		mHomeWatcher.stopWatch();		
	}

猜你喜欢

转载自zengyouyuan.iteye.com/blog/2121514