屏幕关闭时启动活动

6
我设置了一个AlarmManager来启动一个活动。这个活动还会播放声音,类似于闹钟应用或来电。
如果屏幕开着,即使锁屏也可以正常工作。
如果屏幕关闭,它根本不起作用。我尝试在onCreate中的第一件事使用以下内容:
getWindow().setFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON,  WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);

如果未启用屏幕锁定,则会打开屏幕,我可以看到我的活动正在关闭。但我听不到声音播放。如果启用了屏幕锁定,则根本不会打开屏幕。
有时我会得到以下信息,但并非总是:
07-18 23:52:13.685: E/OpenGLRenderer(14148):   GL_INVALID_OPERATION

当屏幕关闭时,我该如何使其正确启动?
3个回答

7

我部分地从这里找到了答案。

        lock = ((KeyguardManager) getSystemService(Activity.KEYGUARD_SERVICE)).newKeyguardLock(KEYGUARD_SERVICE);
        powerManager = ((PowerManager) getSystemService(Context.POWER_SERVICE));
        wake = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "TAG");

        lock.disableKeyguard();
        wake.acquire();

        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
                | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON);

2

前段时间,我读到过一个关于FLAG_TURN_SCREEN_ON的要求,你的应用程序必须处于全屏状态才能正常工作。

"** 重要提示。为了使上述标志组合起作用,您的活动必须是全屏的。在我的应用程序中,我尝试在不是全屏的活动(对话框主题)中使用这些标志,但它没有起作用。在查看文档后,我发现这些标志要求窗口为全屏窗口。" -唤醒Android设备

引用某人发布的有关FLAG_X类似问题的评论。


没有运气,同样的情况。屏幕恰好在我活动关闭之前打开了。 - KKO
听起来你好像遇到了启用屏幕锁定的问题。希望这可以解决它。如果您的应用程序在手机唤醒时关闭,则运行时功能应检查屏幕是否已唤醒,然后再执行。或者采用@jgriffsta的方法,它也可以起作用。 - just.Blaise

1

那么让活动启动一个服务,然后服务再启动活动呢?这会有什么区别吗?打开屏幕的操作应该在哪里进行? - KKO
MainActivity启动服务。即使屏幕关闭,服务仍在后台运行。服务可以显示通知/启动活动等。 - johng
所以你的意思是使用服务而不是闹钟。嗯,我选择闹钟的原因是该活动可能会在一天内甚至几天内显示,因此没有必要让服务在后台运行那么长时间。此外,它被系统杀死的可能性也较小。 - KKO

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接