Android警报和服务触发器

时间:2012-02-27 12:07:36

标签: android android-service android-alarms

关于触发警报注册和启动服务的问题。

  1. 如果在当前时间之前将闹钟设置为几分钟,然后如果手机关闭,那么在预定时间过后,下一部手机上的闹钟触发是否会开启?

  2. 如何取消/更新服务中的待处理意图?如何在startCommand()服务方法中获取请求代码?

  3. 如果每隔10秒触发一次警报,是否会创建多个服务实例?

3 个答案:

答案 0 :(得分:1)

  1. 如果“关闭”意味着完全断电而不只是“一旦按下电源按钮关闭屏幕”,则答案为“否”

  2. 我认为你根本无法得到请求代码。作为getService州的文档,requestCode字段是“当前未使用”。您应该使用Intent传递所有数据(第三个getService)。

  3. 不会。见http://developer.android.com/reference/android/content/Context.html#startService(android.content.Intent

  4.   

    对此方法的每次调用都将导致对目标服务的onStartCommand(Intent,int,int)方法的相应调用

答案 1 :(得分:1)

  1. 将警报的时间存储在SharedPreferences中。然后为android.intent.action.BOOT_COMPLETED注册一个接收器(记得向你的清单添加android.permission.RECEIVE_BOOT_COMPLETED的权限),然后在启动时执行的接收器中,你可以看到在SharedPreferences中是否有警报,如果是的话,你可以重置它,如果还没有通过,或者决定如果时间已经过去该怎么办。

  2. 请参阅problem with cancel the alarm manager pending intent

  3. 没有。服务的onCreate只会被调用一次。每次都会调用它的onStart和onStartCommand。

答案 2 :(得分:0)

  1. 我正在开发的自己的应用程序,如果手机关闭时设置了闹钟,则已在/ boot上的下一部手机上执行。没有BOOT_COMPLETED的接收器存在。我不确定这是否是预期的行为,或者它是否与手机变体一致。

    我相信如果您希望警报在指定时间执行意图,您需要使用带有WakeLock的getBroadcast PendingIntent,因为PendingIntent的其他变体不能保证手机在关闭之前保持足够长的清醒状态再次。这是来自CommonsWare的另一篇文章的信息,我将尝试查找并链接到。

  2. 我相信您可以使用例如以下函数删除发送到警报管理器的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);

    如果已经存在,该标志将更新意图,否则将创建一个新意图。

  3. 我认为不会。但是,我建议您在服务完成其工作后调用stopSelf(),以便最大限度地减少电池使用量。如果没有任何关系,就不需要让它运行!