关于警报注册和触发器启动服务的几个问题。
如果在当前时间前几分钟设置了闹钟,然后如果手机关机,是否会在预定时间过去后触发下一部手机的闹钟?
如何取消/更新服务中的待处理意图?如何在
startCommand()
服务方法中获取请求代码?如果每隔 10 秒触发一次警报,是否会创建多个服务实例?
关于警报注册和触发器启动服务的几个问题。
如果在当前时间前几分钟设置了闹钟,然后如果手机关机,是否会在预定时间过去后触发下一部手机的闹钟?
如何取消/更新服务中的待处理意图?如何在startCommand()
服务方法中获取请求代码?
如果每隔 10 秒触发一次警报,是否会创建多个服务实例?
将闹钟时间存储在 SharedPreferences 中。然后为android.intent.action.BOOT_COMPLETED注册一个receiver(记得在你的manifest中添加一个android.permission.RECEIVE_BOOT_COMPLETED的权限),然后在receiver中,它会在启动时执行,你可以在SharedPreferences中查看alarm的,如果是这样,如果它还没有过去,你可以重置它,或者如果时间已经过去,你可以决定做什么。
不会。服务的 onCreate 只会被调用一次。它的 onStart 和 onStartCommand 每次都会被调用。
如果“关闭”意味着完全关闭电源,而不仅仅是“一旦短按电源按钮关闭屏幕”,答案是“否”
我认为您根本无法获得请求代码。正如getService上的文档所述,该requestCode
字段“当前未使用”。您应该使用 Intent(getService 的第三个参数)传递所有数据。
对该方法的每次调用都会导致对目标服务的 onStartCommand(Intent, int, int) 方法的相应调用
从我正在开发的我自己的应用程序中,如果在手机关闭时设置了警报,则它已在下一部手机开机/启动时执行。那是没有 BOOT_COMPLETED 的接收器存在。我不确定这是否是预期的行为,或者它是否与电话变体一致。
我相信如果您希望闹钟在指定时间执行意图,您需要使用带有 WakeLock 的 getBroadcast PendingIntent,因为 PendingIntent 的其他变体不能保证手机在再次关闭之前会保持足够长的清醒状态。这是来自 CommonsWare 的另一篇文章的信息,我将尝试查找并链接到。
我相信您可以使用以下功能删除发送到警报管理器的pendingintent:
public void unregisterEvent(PendingIntent sender) { ((AlarmManager) this.getSystemService(Context.ALARM_SERVICE)).cancel(sender);
}
PendingIntent 的创建与您尝试删除的原始意图完全相同。您可以在再次调用 AlarmManager 时通过提供正确的 id 以及新的 PendingIntent 来更新它:
AlarmManager am = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), sender);
这是我用来创建/重建 PendingIntent 的:
PendingIntent.getService(this, uniqueIndexToIntent, theIntentItself, PendingIntent.FLAG_UPDATE_CURRENT);
如果该标志已经存在,它将更新意图,否则将创建一个新的。
我不认为它会。但是,我建议您的服务在完成工作后调用 stopSelf(),以便最大限度地减少电池使用量。如果它无关紧要,则无需运行它!