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