Eli*_*ior 15 android android-windowmanager android-8.0-oreo
我正在将我的应用程序定位到Android O.在我的应用程序中,我有一个作业服务,显示所有其他应用程序的窗口,因此当它触发时,即使屏幕关闭和解锁并打开它,也需要显示此窗口.我已经在preior 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);
}
Run Code Online (Sandbox Code Playgroud)
笔记:
Dmi*_*yov 13
如果attr turnScreenOn为true,则KeyguardManager会打开屏幕,因此方法顺序和调用requestDismissKeyguard是必需的。我将此代码用于活动,希望对您有所帮助:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
setShowWhenLocked(true)
setTurnScreenOn(true)
val keyguardManager = getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager
keyguardManager.requestDismissKeyguard(this, null)
} else {
this.window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD or
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED or
WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON)
}
}
Run Code Online (Sandbox Code Playgroud)
Eli*_*ior 10
好的,所以我设法通过一些解决方法和@Umair答案的帮助来解决它.
正如我所说,我正在使用WindowManager显示在后台服务中创建的视图,并且我在上面的问题中添加了代码,视图显示在所有其他应用程序之上但在Android版本时没有打开屏幕是Android 8.
现在替换Flags的方法:FLAG_SHOW_WHEN_LOCKED FLAG_TURN_SCREEN_ON对于活动而不是对于服务或WindowManager是可见的,并且将上下文转换为Activity不是一个好主意,并且不会帮助你:)
所以我现在所做的(临时解决方案)是创建一个透明的活动,当我showView()从后台服务调用方法时,我也开始透明活动.
在活动中 - 在onCreate方法内部,我正在调用方法:
setShowWhenLocked(true)
setTurnScreenOn(true)
Run Code Online (Sandbox Code Playgroud)
当视图被破坏时,活动也会在广播接收器的帮助下被破坏:)所以屏幕现在打开,视图高于所有其他应用程序.
我知道您可以告诉我,我可以将我的服务中的代码移动到新活动中.
我这样做的原因是:
我正在使用语音识别器..当我在活动中编码时,事情不起作用.我的意思是当屏幕被模式锁定时,活动进入暂停状态,我无法得到结果.所以模式驳回了我的活动..
所以我决定使用窗口管理器创建一个视图,它一直运行到现在 - 当谷歌(Android团队)决定弃用这些标志时.所以这是我现在的解决方案..我希望有人能找到更好的解决方案来解决这个问题.
因此根据android文档,这些方法已被弃用,因此您需要使用showWhenLocked or setShowWhenLocked(boolean).
FLAG_TURN_SCREEN_ON
Run Code Online (Sandbox Code Playgroud)
int FLAG_TURN_SCREEN_ON 此常量在API级别27中已弃用.请改用turnScreenOn或setTurnScreenOn(boolean)来防止无意的双生命周期事件.
窗口标志:当设置为正在添加或显示窗口时,一旦显示窗口,系统将激活电源管理器的用户活动(就像用户已唤醒设备一样)以打开屏幕.
和 FLAG_SHOW_WHEN_LOCKED
int FLAG_SHOW_WHEN_LOCKED 此常量在API级别27中已弃用.请改用showWhenLocked或setShowWhenLocked(boolean)来防止无意的双生命周期事件.
窗口标志:在屏幕锁定时显示窗口的特殊标志.这将使应用程序窗口优先于密钥保护或任何其他锁定屏幕.可以与FLAG_KEEP_SCREEN_ON一起使用,在显示键保护窗口之前直接打开屏幕并显示窗口.可与FLAG_DISMISS_KEYGUARD一起使用,以自动完全取消非安全密钥保护.此标志仅适用于最顶层的全屏窗口.
因此,根据文档,弃用这些方法的原因是为了避免an unintentional double life-cycle event.您可以在这里阅读更多相关信息.
https://developer.android.com/reference/android/view/WindowManager.LayoutParams.html
| 归档时间: |
|
| 查看次数: |
10453 次 |
| 最近记录: |