关于触发警报注册和启动服务的问题。
如果在当前时间之前将闹钟设置为几分钟,然后如果手机关闭,那么在预定时间过后,下一部手机上的闹钟触发是否会开启?
如何取消/更新服务中的待处理意图?如何在startCommand()
服务方法中获取请求代码?
如果每隔10秒触发一次警报,是否会创建多个服务实例?
答案 0 :(得分:1)
如果“关闭”意味着完全断电而不只是“一旦按下电源按钮关闭屏幕”,则答案为“否”
我认为你根本无法得到请求代码。作为getService州的文档,requestCode
字段是“当前未使用”。您应该使用Intent传递所有数据(第三个getService)。
对此方法的每次调用都将导致对目标服务的onStartCommand(Intent,int,int)方法的相应调用
答案 1 :(得分:1)
将警报的时间存储在SharedPreferences中。然后为android.intent.action.BOOT_COMPLETED注册一个接收器(记得向你的清单添加android.permission.RECEIVE_BOOT_COMPLETED的权限),然后在启动时执行的接收器中,你可以看到在SharedPreferences中是否有警报,如果是的话,你可以重置它,如果还没有通过,或者决定如果时间已经过去该怎么办。
没有。服务的onCreate只会被调用一次。每次都会调用它的onStart和onStartCommand。
答案 2 :(得分:0)
我正在开发的自己的应用程序,如果手机关闭时设置了闹钟,则已在/ boot上的下一部手机上执行。没有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(),以便最大限度地减少电池使用量。如果没有任何关系,就不需要让它运行!