2012-02-27 116 views
0

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

  1. 如果报警设定在夫妇分钟的提前当前的时间,然后如果这款手机是由开关关闭,将在下一个电话交换机上的报警触发对计划的时间后通过呢?

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

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

+0

“取消/更新待处理服务意图” - 原因是什么? – Olegas 2012-02-27 14:00:54

回答

1
  1. 如果“关闭”表示完全断电,而不只是“一次短按电源键打开屏幕关闭”的答案是“否”

  2. 我认为你不能获取请求代码。如getService所述的文档所述,requestCode字段为“当前未使用”。你应该用Intent(getService的第三个参数)传递所有的数据。

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

这种方法每次调用会导致对目标服务的onStartCommand(意向,INT,INT)方法的

+0

感谢Olegas的投入 – Ravibhushan 2012-02-27 14:58:48

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每次都会被调用。

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已经创建正是因为你试图原意去掉。您可以通过用新的PendingIntent再次调用AlarmManager当沿着提供正确的ID更新:

    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(),以便将电池使用量降至最低。没有必要让它运行,如果它无事可做!