Android Galaxy S4 -- 在锁定屏幕上可见的活动
Posted
技术标签:
【中文标题】Android Galaxy S4 -- 在锁定屏幕上可见的活动【英文标题】:Android Galaxy S4 -- Activity that is visible over lock screen 【发布时间】:2013-09-30 23:10:05 【问题描述】:几年前,我编写了一个可在 android 2 上运行的闹钟应用程序,现在我正在尝试将其升级为可在 Android 4 上运行。特别是在三星 Galaxy S4 上。
在 Android 2 上,如果手机处于睡眠状态,它会唤醒手机并在锁定屏幕上显示“贪睡或关闭”屏幕。
在Android 4上,它会唤醒手机,但你必须解锁它,然后打开通知区域,然后点击闹钟的通知,然后才能点击“关闭”。
我一直使用这段代码来唤醒:
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
| WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
| WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
我已经阅读了关于这个问题的 8 个不同的 *** 问题。他们中的大多数人都给出了上面的代码,这些代码几年前在 Android 2 中对我有用,但在 Android 4 中不起作用。但他们都没有帮助我解决这个问题。以下是我阅读并尝试过的问题:
Android: remove or disable programmatically the Lock Screen on Samsung Galaxy S2 device
How to display a fullscreen TYPE_SYSTEM_ALERT window?
How do I create an Activity that is visible on top of the lock screen
How to start a dialog (like alarm dimiss /snooze) that can be clicked without unlocking the screen
Android activity over default lock screen
android device locked, yet want alarm to sound and dialog to appear
Android dialog over lock screen
Show dialog with touch events over lockscreen in Android 2.3
是否有人对可能导致此问题的 Android 4 中的更改有任何想法?
编辑:这是我见过的最简单的警报对话框之一,它没有出现“最小化”。它不会像所写的那样出现在锁定屏幕上,但您可以使用 WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
修复它
http://wptrafficanalyzer.in/blog/setting-up-alarm-using-alarmmanager-and-waking-up-screen-and-unlocking-keypad-on-alarm-goes-off-in-android/
它是用 FragmentActivity 和 DialogFragment 编写的,但它仍然可以作为 Activity 工作。它使用 AlertDialog.Builder 来制作对话框,如果您尝试使用 XML 布局进行操作,它将无法正常工作。为什么?
【问题讨论】:
你已经在清单中设置了这个权限?? -->我想通了,答案与我的预期大相径庭。
这段代码包含在 Android 2 的闹钟示例中,在 AlarmAlert.java Activity 中:
@Override
protected void onStop()
super.onStop();
// Don't hang around.
finish();
作为参考,你可以从Git过去right here的示例代码中看到该文件,其中包含上面的onStop
函数。它从未在 Android 2 中造成问题。
但在 Android 4 中,如果手机处于关机状态,onStop
会在手机唤醒之前立即触发,从而有效地“最小化”活动。一旦我删除了这个功能,它立即再次起作用。
但我想知道,这是像 @radley 和 @Guardanis 这样的其他人遇到的问题吗?这似乎不太可能,但如果这也能解决您的问题,请告诉我。
如果您将来访问此答案,并且遇到此问题,我会尝试:
取出任何onStop
函数。
将此代码添加到活动中:
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
| WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
| WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
确保您使用的是全屏主题,而不是对话框主题。
这对我没有任何影响,但您可以尝试在清单中明确设置 showOnLockScreen:<activity android:name="com.example.MyActivity" android:showOnLockScreen="true"/>
对我来说没有什么不同但您可以尝试的第二件事是添加标志 WindowManager.LayoutParams.FLAG_FULLSCREEN
我希望这对其他人有帮助!
【讨论】:
特别是不使用对话框主题会有所不同! 有谁知道为什么 onStop() 应该在手机休眠时被调用?我也在观察这一点,当我想在锁定屏幕前放置一个活动时,它会导致问题。任何更新将不胜感激! 对话主题有什么替代品吗?我想在锁定的屏幕上显示一个类似消息框的弹出窗口,我不能使用对话框主题,只能全屏.. @OfekAgmon,我在第 3 点中写道:“确保您使用的是全屏主题,而不是对话框主题。”但是,那是在 2014 年,我不确定在当前版本的 Android 中这是什么状态。 @XcodeNOOB 我不知道为什么在这种情况下它会调用 onStop() ,这没有多大意义。但我认为超类方法 Activity.onStop() 不会造成问题;我相信这是导致问题的 finish() 。除非你看到不同的东西?【参考方案2】:在 Kotlin 中,
API 级别 28 或以下,您只需在需要打开的 Activity 中添加以下方法:
override fun onAttachedToWindow()
super.onAttachedToWindow()
toBeShownOnLockScreen()
private fun toBeShownOnLockScreen()
window.addFlags(
WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
or WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1)
setTurnScreenOn(true)
setShowWhenLocked(true)
else
window.addFlags(
WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
or WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
)
为了让它在 Android Pie 及以上版本上运行,除了上述步骤,我们还需要在 AndroidManifest 中进行设置:
<activity
android:name=".view.activity.LockScreenActivity"
android:showOnLockScreen="true"
android:showWhenLocked="true"
android:turnScreenOn="true" />
我已经从 Api 级别 21 到 29 测试了这段代码,并且像魅力一样工作!
【讨论】:
【参考方案3】:不确定这是否是所有情况下的问题,但 ShowWhenLocked 上的文档说它仅适用于最顶部的 全屏 窗口。我有一个以对话框为主题的窗口,但它不起作用,但是一旦我将其更改为常规的全屏窗口,它就可以正常工作。
【讨论】:
在 styles.xml 中,我设置了android:Theme.DeviceDefault.Light.NoActionBar.Fullscreen
的父级,并添加了标志 WindowManager.LayoutParams.FLAG_FULLSCREEN
,但它仍然无法正常工作。我还需要做什么才能使其全屏并正常工作吗?【参考方案4】:
您链接到的其中一个问题的答案似乎可以为我解决此问题。
这是我正在使用的似乎可以工作的代码:
@Override
public void onAttachedToWindow()
Window window = getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
| WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
| WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
| WindowManager.LayoutParams.FLAG_FULLSCREEN);
super.onAttachedToWindow();
我也在清单的活动定义中明确声明了这一点:
<activity
android:name="com.example.MyActivity"
android:label="@string/app_name"
android:showOnLockScreen="true"
>
Android activity over default lock screen
【讨论】:
处理标志列表时,使用 + 或 | 应该产生相同的结果。由于所有标志都是 2 的幂,按位 OR 和加法是等价的,但使用按位 OR 会稍微快一些。我还测试了这个特定的例子,它们都产生了整数值 6815872。它们都没有在 Galaxy S4 上解决这个问题,抱歉。 我尝试了您更新的答案,但如果屏幕关闭,则 Activity 基本上仍会“最小化”启动。您必须打开通知栏并单击通知才能看到它。关于我可能遗漏的任何其他想法? 你在使用全屏标志吗?【参考方案5】:是的 - 所以我最近一直在努力解决这个问题,但使用的是 5.0.2 Galaxy Tab A。不出所料,适用于所有其他设备的功能不适用于三星(自第一款三星 Galaxy 设备以来就是这种情况,他们每个版本都有新的突破!)
在大多数设备的锁定屏幕上显示 Activity 的一般解决方案是
//wake up device and show even when on lock screen
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON |
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON |
WindowManager.LayoutParams.FLAG_FULLSCREEN);
但这不适用于三星设备。但是,删除 FLAG_DISMISS_KEYGUARD
可以做到这一点。
查看我们拥有的这个标志的文档
窗口标志:设置窗口时会导致键盘锁被解除,只有当它不是安全锁键盘锁时。因为安全性不需要这样的键盘保护,所以如果用户导航到另一个窗口,它永远不会重新出现(与 FLAG_SHOW_WHEN_LOCKED 相比,它只会暂时隐藏安全和非安全的键盘保护,但确保它们在用户移动到时重新出现另一个不隐藏它们的 UI)。如果键盘保护当前处于活动状态并且是安全的(需要解锁模式),那么用户在看到此窗口之前仍需要确认它,除非还设置了 FLAG_SHOW_WHEN_LOCKED。
对于FLAG_SHOW_WHEN_LOCKED
,我们有
窗口标志:特殊标志,让窗口在屏幕显示时显示 锁定。这将使应用程序窗口优先于键 守卫或任何其他锁屏。可以与 FLAG_KEEP_SCREEN_ON 一起使用 在显示键之前直接打开屏幕并显示窗口 防护窗。 可以和 FLAG_DISMISS_KEYGUARD 一起使用来自动 完全消除不安全的键盘保护。此标志仅适用于 最顶部的全屏窗口。
您可以看到它们可以一起使用,但如果设备被锁定并且存在FLAG_DISMISS_KEYGUARD
,三星似乎不会打扰FLAG_SHOW_WHEN_LOCKED
。我的应用程序需要设置锁定屏幕,因此删除关闭键盘保护标志实际上允许我在锁定屏幕上显示全屏活动。对我来说是的,对三星来说不是。
【讨论】:
你好,我试过你的解决方案,还是不行。如果我去解锁我的屏幕,我会看到应用程序的主页已启动,而不是应该显示为通知的活动 如果您在锁定屏幕的顶部或下方根本看不到新活动,那么这表明您一开始没有启动活动。 我的是全屏接管 那不是真正的相关回应!您是否首先检查过 Activity 是否实际上正在启动? 是的.. 看起来像.. 因为当我解锁设备时(没有任何通知)它会显示我的家庭活动。我也提交了我的问题***.com/questions/38596347/…以上是关于Android Galaxy S4 -- 在锁定屏幕上可见的活动的主要内容,如果未能解决你的问题,请参考以下文章
三星 Galaxy S3、S4、S5 的 Android 相机/图片方向问题