在Android上使用RTC闹钟时允许手机休眠

6

我在Android中使用Alarm Manager时遇到了一些奇怪的问题,尽管我使用的是RTC(非Wakeup)模式,但手机仍会可靠地按正确的重复间隔发送PendingIntent。

我的测试细节如下:

  • 设备未充电,在我睡觉时放在床头柜上
  • 每次服务都会在其重复间隔(30分钟,我知道这很极端)唤醒
  • 服务记录了它的活动情况,以便我早上可以阅读

据我所知,除非我将其唤醒,否则手机应该处于休眠状态,我的闹钟也不应在手机唤醒之前发送。

  • 为什么我的服务还在执行?
  • 如果其他服务行为不当并使用了alarm的_WAKEUP变体,我的服务也会被唤醒吗?
  • 我能避免被其他服务唤醒,只是在用户打开屏幕时唤醒吗?
2个回答

4

我的服务为什么在执行?

可能是其他东西在这些时刻使设备保持唤醒状态。

如果另一个服务行为不当并且使用了闹钟的_WAKEUP变体,那么我的服务也会被唤醒吗?

是的,尽管“行为不当”是主观的。

我能避免被另一个服务唤醒,只在用户打开屏幕时唤醒吗?

不能直接通过AlarmManager实现。您可以监听ACTION_SCREEN_OFFACTION_USER_PRESENT广播,并在其间禁用您的闹钟。


那这两个广播的限制呢?正如您在错误报告http://code.google.com/p/android/issues/detail?id=10735中所指出的,它们无法在清单中注册。对于活动来说这是可以接受的,但因为我正在处理服务,它们基本上是无用的,并且将在服务结束时(对于IntentService而言很快)被释放。广播也不是粘性的,所以我不能随意查询它们。我有什么遗漏吗?我能否从我的IntentService内部创建一个长期存在的BroadcastReceiver? - smith324
@smith324:“正如您在错误报告code.google.com/p/android/issues/detail?id=10735中所指出的,它们无法在清单中注册。” -- 是的,没错。很抱歉,我忘记了。 :-( “我可以从我的IntentService中创建一个长期存在的BroadcastReceiver吗?” -- IntentService 不是设计成“长期存在”的。 - CommonsWare
我想我可以创建另一个服务来监听屏幕的开/关,但那感觉就像是一个hack和浪费资源。:\ - smith324
@smith324:我知道的最接近按需检查的方法是使用 KeyguardManager 上的 inKeyguardRestrictedInputMode() - CommonsWare
谢谢,看起来正是我需要的。 - smith324

0
我刚刚花了一个小时试图找出为什么我的RTC闹钟在手机睡眠时仍然发送PendingIntents。答案非常简单,因为它插上了USB,所以手机的状态是“充电”。
引用: “可能是其他东西在那些时刻唤醒了设备。”
很多带有通知广告的应用程序(如AirPush、Leadbolt等)会唤醒设备。

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