I'm targetting my application to Android O. In my application I have a job service that shows a window over all other applications, so when it triggered it needs to show this window even when the screen is turned off & unlocked and turn it on. I've achieved this behaviour in preior Android versions, but in Android O it doesn't work as I expected.
I've read that I need to use the flag TYPE_APPLICATION_OVERLAY
and added also the permission <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
in the manifest file.
So it works fine when the screen is on, but when the screen is off I've noticed that it doesn't turn the screen on, and when I turned the screen I saw that the window was created on top of other applications.
So my question is since the flags FLAG_TURN_SCREEN_ON
and FLAG_SHOW_WHEN_LOCKED
are deprecated in Android API 27, what are the alternatives way of doing that?
this is my current code:
private void showView()
{
if (!wakeLockAcquired)
{
wakeLock.acquire();
wakeLockAquired = true;
}
windowManager = (WindowManager)context.getSystemService(WINDOW_SERVICE);
final WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT, 0, 0,
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
,
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
| WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
| WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON ,
PixelFormat.RGBA_8888);
RelativeLayout layout = buildView();
windowManager.addView(layout, layoutParams);
windowManager.updateViewLayout(layout, layoutParams);
}
Notes:
OK so I've managed to solved it with some workaround and the help from the answer of @Umair.
As I said I'm displaying a view that was created in a background service using the WindowManager and with the code I've added to my question above, the view is displayed above all the other applications but not turning the screen on when Android version is Android 8.
The methods that now replaceing the Flags: FLAG_SHOW_WHEN_LOCKED
FLAG_TURN_SCREEN_ON
are visible to activities and not for services or for the WindowManager, and casting the context to Activity is not a good idea and will not help you :)
So What I did for now (temporary solution) is to create a transparent activity and when I'm calling to showView()
method from my background service, I'm also starting the transparent activity.
In the activity - inside the onCreate method, I'm calling to the methods:
setShowWhenLocked(true)
setTurnScreenOn(true)
and when the view is destroyed, the activity will also get destroyed with the help of broadcast receiver :) so the screen is now turned on and the view is above all the other applications.
I know that you can tell me that I can move my code that inside my service into the new activity.
The reason I did it in that way:
I'm using speech recognizer.. and when I coded it in the activity, things didn't work. I mean when the screen is locked with pattern, the activity goes to pause state and I can't get the results. so the pattern dismissed my activity..
So I decided to create a view using the window manager and it worked fine until now - when Google (Android team) decided to deprecate these flags. So this is my solution for now.. and I hope that someone will find a better solution for this problem.