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

时间:2013-08-08 10:51:42

标签: android android-service android-windowmanager

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

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

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

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

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

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

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

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

    其次,当有SYSTEM BACK / HARDWARE BACK按钮按下事件时,我还想忽略这个浮动视图。关于如何做到这一点的任何指示都会有所帮助。

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

    Floating View

5 个答案:

答案 0 :(得分:11)

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

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

答案 1 :(得分:6)

看看Standout库,这对处理浮动窗口有好处,似乎它也没有处理背压事件,联系开发人员可能会有所帮助。

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

答案 2 :(得分:2)

关于后退按钮 - 你应该覆盖&#34; onBackPressed()&#34;在你的视野内做任何你想做的事情

@Override
public boolean onBackPressed() {
    // Remove your view from the window...
}

无论如何,我使用SDK called Tooleap来直接显示浮动窗口。

答案 3 :(得分:1)

您是否希望HOME按钮同时关闭您的UI?如果这样做,听起来最好是在透明背景上打开活动,而不是在警报窗口打开。 为此,请使用以下样式作为活动的主题

<style name="Transparent">
    <item name="android:windowFrame">@null</item>
    <item name="android:windowBackground">@color/transparent</item>
    <item name="android:windowIsFloating">true</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
    <item name="android:windowSoftInputMode">stateUnspecified|adjustPan</item>
    <item name="android:windowFullscreen">true</item>
</style>

答案 4 :(得分:-1)

工作“onBackpressed”按钮跟随指令

1.转到示例中的FlotingFolder.java文件(非库)。

2.找到以下方法

@Override
public int getFlags(int id) {
    if (APP_SELECTOR_ID == id) {
        return super.getFlags(id);
    } else {
        return super.getFlags(id) | StandOutFlags.FLAG_BODY_MOVE_ENABLE
                | StandOutFlags.FLAG_WINDOW_EDGE_LIMITS_ENABLE
                | StandOutFlags.FLAG_WINDOW_FOCUSABLE_DISABLE;
    }
}
  1. 然后从上述方法中删除 - “StandOutFlags.FLAG_WINDOW_FOCUSABLE_DISABLE”
  2. 现在onBackPressed会起作用。