我需要通过以下方式提醒用户某些事件:
- 振动
- 通知
在用户确认通知之前,振动应无限期保持。
问题是当设备进入睡眠状态时振动停止。我已阅读以下问题:
屏幕关闭时允许手机
振动 即使在 Android 中屏幕进入睡眠模式后仍继续振动
上面提到的一个问题有一个答案,说没有模式的振动可以解决问题。因此,我尝试调用Vibrator.vibrate
接受毫秒的版本,而不是具有大量数字的模式,但无论如何振动都会停止。
其他答案建议在操作上注册接收器ACTION_SCREEN_OFF
。如果设备在警报开始后进入睡眠状态,这将允许我恢复振动,但如果设备已经睡眠,则不会工作。
但是,如果我能够先打开屏幕,然后注册接收器以处理从那里可能发生的任何屏幕关闭事件,我就可以让它工作。因此,我尝试在收到触发事件时,在开始声音或振动之前获取完整的唤醒锁,但尽管我使用了标志 FULL_WAKE_LOCK 和 ACQUIRE_CAUSES_WAKEUP,但它不起作用。唤醒部分有效,但不久之后设备再次进入睡眠状态。我想认为FULL_WAKE_LOCK标志不起作用,因为它在 API 17 中已被弃用,但我的设备是运行 4.1.2 即 API 16 的三星!
现在推荐的方法似乎是使用 WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON但这应该从活动中调用,除非用户单击通知,否则我没有任何屏幕,如果发生这种情况,声音和振动应该已经有被阻止了。
所以它看起来像一个死胡同。
我还能尝试什么?
更新:
我没有运气通过唤醒锁保持屏幕始终打开,但另一方面,它们允许我打开屏幕几秒钟。我实际上不需要保持屏幕打开,所以我在Intent.ACTION_SCREEN_OFF
动作上注册了接收器,当屏幕关闭时,接收器再次恢复振动。这在三星中运行良好,但我现在已经切换到华为继续测试并且接收器无法正常工作。
更新:
这是华为设备中异常的堆栈跟踪:
java.util.NoSuchElementException: Death link does not exist
at android.os.BinderProxy.unlinkToDeath(Native Method)
at com.android.server.VibratorService.unlinkVibration(VibratorService.java:294)
at com.android.server.VibratorService.removeVibrationLocked(VibratorService.java:284)
at com.android.server.VibratorService.cancelVibrate(VibratorService.java:213)
at android.os.IVibratorService$Stub.onTransact(IVibratorService.java:83)
at android.os.Binder.execTransact(Binder.java:338)
at dalvik.system.NativeStart.run(Native Method)