【发布时间】:2018-01-16 08:53:03
【问题描述】:
我将我的应用程序定位到 Android O。 在我的应用程序中,我有一个工作服务,它在所有其他应用程序上显示一个窗口,所以当它触发时,即使屏幕关闭和解锁并打开它,它也需要显示这个窗口。 我已经在之前的 Android 版本中实现了这种行为,但在 Android O 中它并没有像我预期的那样工作。
我读到我需要使用标志 TYPE_APPLICATION_OVERLAY 并在清单文件中添加了权限 <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>。
所以当屏幕打开时它工作正常,但是当屏幕关闭时我注意到它没有打开屏幕,当我打开屏幕时我看到窗口是在其他窗口之上创建的应用程序。
所以我的问题是,由于标志 FLAG_TURN_SCREEN_ON 和 FLAG_SHOW_WHEN_LOCKED 在 Android API 27 中已被弃用,有哪些替代方法?
这是我当前的代码:
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);
}
注意事项:
- buildView 是一个返回 relativeLayout 的函数,在这个函数中我动态添加内容(TextView、ImageView 等...)。
- wakeLockAcquired 是一个布尔成员,当视图被销毁时它设置为 false。
【问题讨论】:
标签: android android-windowmanager android-8.0-oreo