如何添加一个浮动视图到Android窗口pipe理器,并听取系统/硬件后退button事件

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

  1. 关于浮动视图的实现
  2. 如何收听系统后退button事件,以便我可以解除视图。

执行:

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

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

我有一个广播接收机,将听取报警事件。 收到事件后,我开始显示浮动视图的服务。 以下是我用来创build视图的代码。

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

每当用户对视图执行任何操作时,我将从窗口pipe理器中删除该视图并杀死该服务。

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

其次,当有SYSTEM BACK / HARDWARE BACKbutton按下事件时,我也想消除这个浮动视图。 任何关于如何做到这一点的指针将是有帮助的。

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

浮动视图

Solutions Collecting From Web of "如何添加一个浮动视图到Android窗口pipe理器,并听取系统/硬件后退button事件"

在后退button检测方面 – 我使它以下面的方式工作(一切都在服务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); } }; 
  1. 将包装视图添加到窗口pipe理器,并确保WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE未在包装布局参数上设置。

看看图书馆,这是很好的处理浮动窗口,似乎也没有处理回来事件,联系开发人员可能会帮助。

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

关于后退button – 你应该重写你的视图内的“onBackPressed()”,并做任何你想要的

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

无论如何,我正在使用一个名为Tooleap的SDK ,以直接的方式显示浮动窗口。

你想要HOMEbutton也解雇你的用户界面吗? 如果这样做,听起来好像在透明背景上打开一个活动,而不是一个警报窗口。 为此,请使用以下样式作为活动的主题

 <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> 

为“工作”button按照以下说明

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

2.find下面的方法

 @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”

现在onBackPressed将工作。