Android覆盖窗口中的后退按钮回调

Android覆盖窗口中的后退按钮回调,android,overlay,keyevent,Android,Overlay,Keyevent,我正在我的应用程序中显示一个来自服务的覆盖窗口。当按下后退按钮时,我想隐藏窗口。因此,要获取back按钮事件,我需要执行以下代码 class MyView extends MyLayout{ public MyView(Context context){ super(context); LayoutInflater.from(context).inflater(R.layout.my_view,this); } } Class MyLayout

我正在我的应用程序中显示一个来自服务的
覆盖窗口
。当按下后退按钮时,我想隐藏窗口。因此,要获取
back按钮事件
,我需要执行以下代码

class MyView extends MyLayout{
    public MyView(Context context){
        super(context);
        LayoutInflater.from(context).inflater(R.layout.my_view,this);
    }
}

Class MyLayout extends FrameLayout{
    public MyLayout(Context context){
       super(context);
    }

   @Override
    public boolean dispatchKeyEvent(KeyEvent event) {
        Log.e("key event", "" + event.getKeyCode());
        return super.dispatchKeyEvent(event);
    }
}
//service code
final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
                WindowManager.LayoutParams.MATCH_PARENT,
                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
                        | WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS |
                WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION | WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
                PixelFormat.TRANSLUCENT);

final MyView myview = new MyView(this);
windowManager.addView(myview,param);

但按下
后退按钮时,从未调用
dispatchKeyEvent
方法。我在谷歌上搜索,发现这是一种捕捉后退按钮事件的方法。不知怎么的,我的案子不管用。我缺少什么?

如果您只想捕获按下的
后退按钮,请使用:

@override
public void onBackPressed(){
// Do what you need done here 
// ... or pass super.onBackPressed();
}

如果您只想捕获按下的
后退按钮
事件,请使用:

@override
public void onBackPressed(){
// Do what you need done here 
// ... or pass super.onBackPressed();
}

真正的问题是
窗口参数
。我只需要
WindowManager.LayoutParams.FLAG\u WATCH\u OUTSIDE\u TOUCH flags
,它阻止其他应用程序
获取关键事件。所以正确的代码如下

//服务代码

final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
                WindowManager.LayoutParams.MATCH_PARENT,
                WindowManager.LayoutParams.MATCH_PARENT,
                WindowManager.LayoutParams.TYPE_PHONE,
WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH | WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS |
                WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION | WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
                PixelFormat.TRANSLUCENT);

真正的问题是
窗口参数
。我只需要
WindowManager.LayoutParams.FLAG\u WATCH\u OUTSIDE\u TOUCH flags
,它阻止其他应用程序
获取关键事件。所以正确的代码如下

//服务代码

final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
                WindowManager.LayoutParams.MATCH_PARENT,
                WindowManager.LayoutParams.MATCH_PARENT,
                WindowManager.LayoutParams.TYPE_PHONE,
WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH | WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS |
                WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION | WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
                PixelFormat.TRANSLUCENT);