由于项目需要,在虚拟键上折腾了不少时间,写下来总结一下,也给同样困惑的小伙伴一些启示。
Home、Recent键的监听
直接上代码:
//监听HOME键、RECENT键
private IntentFilter mHomeFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
private BroadcastReceiver mHomeListenerReceiver = new BroadcastReceiver() {
final String SYSTEM_DIALOG_REASON_KEY = "reason";
final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";
private final String SYSTEM_RECENT_APPS = "recentapps";//最近使用的应用键
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY);
if (action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)
&& null != reason) {
if (reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY)) {//按下Home
//你的操作
} else if (reason.equals(SYSTEM_RECENT_APPS)) {//按下Recent,这个方法会调两次
//你的操作
}
}
}
};
使用时调用:
this.registerReceiver(mHomeListenerReceiver, mHomeFilter);//注册
记得在不用的时候:
this.unregisterReceiver(mHomeListenerReceiver);//删除
Back键的监听
直接上代码:
view.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {//Back键
//你的操作
}
return false;
}
});
这个View:
import android.content.Context;
import android.support.design.widget.CoordinatorLayout;
import android.util.AttributeSet;
import android.view.KeyEvent;
/**
* 浮窗View
* Created by weifeiyang on 2017/2/6.
*/
public class FloatingWindowView extends CoordinatorLayout {
public FloatingWindowView(Context context) {
super(context);
}
public FloatingWindowView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public FloatingWindowView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
if (mOnKeyListener != null) {
mOnKeyListener.onKey(this, KeyEvent.KEYCODE_BACK, event);
return true;
}
}
return super.dispatchKeyEvent(event);
}
OnKeyListener mOnKeyListener = null;
@Override
public void setOnKeyListener(OnKeyListener l) {
mOnKeyListener = l;
super.setOnKeyListener(l);
}
}
需要注意的是,通过广播监听的事件,是没办法截取的,只能使用来处理自己的事件
在开发过程中,使用WindowManager搭起的View通过这种方式去处理虚拟键的事件。