如何向Android窗口管理器添加浮动视图并侦听系统/硬件后退按钮事件

Han*_*oid 12 android android-service android-windowmanager

我有一个服务,在窗口管理器上显示浮动视图(使用WINDOW_TYPE_ALERT权限).我能够显示它并执行操作.但是,我有两个具体问题:

  1. 关于浮动视图的实现
  2. 如何监听系统后退按钮事件,以便我可以关闭视图.

执行:

在清单中,我添加了以下权限:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
Run Code Online (Sandbox Code Playgroud)

我有一个广播接收器,它将监听报警事件.收到活动后,我正在启动服务以显示浮动视图.以下是我用来创建视图的代码.

LayoutParams layOutParams = new WindowManager.LayoutParams(
                WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
                WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
                PixelFormat.TRANSLUCENT);
Run Code Online (Sandbox Code Playgroud)

每当用户对视图执行任何操作时,我都会从窗口管理器中删除该视图并终止该服务.

我想知道的是 - 如果这是解决问题的正确方法,或者有更好的方法吗?而且,我应该对LayoutParams进行更改还是保持原样?

其次,当有SYSTEM BACK/HARDWARE BACK按钮按下事件时,我还想忽略这个浮动视图.有关如何执行此操作的任何指示都会有所帮助.

附上浮动视图的屏幕截图以便更好地理解:

浮动视图

qba*_*sso 11

在后退按钮检测方面 - 我让它以下列方式工作(一切都在服务onCreate代码中发生):

  1. 将您想要的视图包装到ViewGroup(LinearLayout,Relative或其他)
  2. 在包装器视图中覆盖dispatchKeyEvent:

mView = new RelativeLayout(this) {
        @Override
        public boolean dispatchKeyEvent(KeyEvent event) {
            if (event.getKeyCode()==KeyEvent.KEYCODE_BACK) {
                // < your action >
                return true;
            }
            return super.dispatchKeyEvent(event);
        }
};
Run Code Online (Sandbox Code Playgroud)
  1. 将包装器视图添加到窗口管理器,并确保未在包装器布局参数上设置WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE.


Bal*_*aji 6

看看Standout Library,它有利于处理浮动窗口,似乎它也不处理背压事件,联系开发人员可能会有所帮助.

还有一种方法是你可以尝试用半透明背景/主题打开活动来获得在Any.do中浮动窗口中使用的类似效果,并且可以处理backpress事件

  • 谢谢你的回答,你绝对指出了我正确的方向.为了使这完全像Any.do一样工作,我必须执行以下操作:我们必须以启动模式"singleInstance"启动活动.我们必须在清单文件中提到它,例如`android:launchMode ="singleInstance"` (3认同)