I have a service which displays a floating view on the window manager (using WINDOW_TYPE_ALERT permission). I'm able to display it and perform actions. But, I have two specific questions:
- Regarding the implementation of the floating view
- How to listen to system back button event so that I can dismiss the view.
Implementation:
In the manifest I added permissions for:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
I have a broadcast receiver which will listen for Alarm events. Upon receiving the event, I'm starting a service to display the floating view. The following is the code I'm using to create the view.
LayoutParams layOutParams = new WindowManager.LayoutParams(
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
PixelFormat.TRANSLUCENT);
Whenever a user performs any action on the view, I'm removing the view from window manager and killing the service.
What I would like to know is - if this is the right way to approach the problem or are there any better ways to do it? And, should I make changes to the LayoutParams or keep them as is?
Secondly, I would also like to dismiss this floating view when there is SYSTEM BACK/HARDWARE BACK button press event. Any pointers on how to do this would be helpful.
Attaching a screenshot of the floating view for better understanding:
In terms of back button detection - I made it to work in a following way (everything happens in service onCreate code):
- Wrap your desired view into ViewGroup (LinearLayout, Relative or other)
- override dispatchKeyEvent like this in wrapper view:
mView = new RelativeLayout(this) {
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
if (event.getKeyCode()==KeyEvent.KEYCODE_BACK) {
// < your action >
return true;
}
return super.dispatchKeyEvent(event);
}
};
- add wrapper view to the window manager, and be sure that WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE is not set on wrapper layout params.
Have a look at Standout Library , which is good for handling floating windows , it seems it is also not handling back press event , contacting developer might help.
And one more way is you can try opening activity with semi transparent background/theme to get the similar effect used in floating window in Any.do and backpress event can be handled
Regarding the Back button - You should override the "onBackPressed()" inside your view and do whatever you want
@Override
public boolean onBackPressed() {
// Remove your view from the window...
}
Anyway, I'm using an SDK called Tooleap, to display floating windows in a straight-forward way.
Do you want the HOME button to also dismiss your UI? If you do, it sounds like it is better to have an activity that opens on a transparent background, instead of an alert window. To do this use the following style as the theme for your activity
<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>
FOR WORKING "onBackpressed" BUTTON FOLLOW BELOW INSTRUCTION
1.Go to FlotingFolder.java file in example (Not library).
2.Find below method
@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;
}
}
- Then remove - "StandOutFlags.FLAG_WINDOW_FOCUSABLE_DISABLE" from the above method
Now onBackPressed will work.
来源:https://stackoverflow.com/questions/18124153/how-to-add-a-floating-view-to-android-window-manager-and-listen-to-system-hardwa