Floating window를 WindowManager에 띄우기 위한 파라메터에서 FLAG_NOT_FOCUSABLE을 없애면 홈키를 제외한 나머지 키 이벤트를 받을 수 있습니다.
params= new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.TYPE_PHONE,
// WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
| WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
PixelFormat.TRANSLUCENT);그리고, 해당 파라메터를 이용해서 WindowManager에 "addview"를 할 레이아웃이 만약 FrameLayout이라면,
먼저, 아래와 같이 해당 레이아웃을 확장한 후,
public class MyTopLayout extends FrameLayout {
public MyTopLayout(Context context) {
super(context, null, 0);
:
}아래와 같이 dispatchKeyEvent 코드를 작성합니다.
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN ) {
switch (event.getKeyCode()) {
case KeyEvent.KEYCODE_BACK:
myCallbackListener.onKeyEvent(event);
break;
default:
}
}
return super.dispatchKeyEvent(event);
}
물론, 위에서 보이는 myCallbackListener의 모습은 아래와 같이 정의 되어 있겠죠?
public interface MyKeyEventCallbackListener {
void onKeyEvent(KeyEvent event);
}
해당 인터페이스의 구현은 키 이벤트를 받고자 하는 엑티비티 등에서 하시면 됩니다. 아래와 같이 말입니다.
public class MyActivity extends Activity implements MyKeyEventCallbackListener {
:
@override
void onKeyEvent(KeyEvent event) {
//키 이벤트를 받아 대응할 코드
}
}