android - 如何向 Android 窗口管理器添加 float View 并监听系统/硬件后退按钮事件

标签 android android-service android-windowmanager

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

  1. 关于 float View 的实现
  2. 如何监听系统后退按钮事件以便我可以关闭 View 。

实现:

在 list 中我添加了权限:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

我有一个广播接收器,它将监听警报事件。收到事件后,我将启动一项服务来显示 float View 。以下是我用来创建 View 的代码。

LayoutParams layOutParams = new WindowManager.LayoutParams(
                WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
                WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
                PixelFormat.TRANSLUCENT);

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

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

其次,当有 SYSTEM BACK/HARDWARE BACK 按钮按下事件时,我还想关闭这个 float View 。有关如何执行此操作的任何指示都会有所帮助。

附上 float View 的屏幕截图以便更好地理解:

Floating View

最佳答案

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

  1. 将您想要的 View 包装到 ViewGroup(LinearLayout、Relative 或其他)
  2. 在包装器 View 中像这样覆盖 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);
        }
};
  1. 将包装器 View 添加到窗口管理器,并确保未在包装器布局参数上设置 WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE。

关于android - 如何向 Android 窗口管理器添加 float View 并监听系统/硬件后退按钮事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18124153/

相关文章:

android - 如何在多个 Activity 之间保持与 Android 服务的连接?

android - 有多少个 WindowInsets?

android - WindowManager 内的 RecyclerView 不更新

android - 在手机锁定时开始外部 Activity

java date/calendar -> 无时区,无转换

android - getAssets() 在 eclipse 中显示错误

android - 服务在被杀死后不会重新启动,即使在 Return_STICKY 之后

android - 如何在一天中的特定时间停止服务?

android - Cocos2dx 安卓 : Get data from file(assets/*) failed

带陀螺仪和罗盘的安卓平板电脑