我有这个服务在后台做其他事情,必须一直运行。在onCreate上我设置了一个警报,每天发送一次电子邮件。服务器没有在前台运行,因此有时会被系统杀死,然后再次创建,当发生这种情况时,它会再次创建警报,并在每次发生时发送另一封电子邮件。所以我的问题是,如果它已经设置为在系统中重复,有没有办法阻止它触发警报?或者在服务中还有另一个“地方”,我可以创建一次警报并防止它被重新创建吗?
public class ObserverService extends Service {
private String BABAS = "babas";
@Override
public void onCreate() {
setRecurringAlarm(this);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return START_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
private void setRecurringAlarm(Context context) {
Log.i(BABAS, "entrou no set alarme");
Calendar updateTime = Calendar.getInstance();
updateTime.setTimeZone(TimeZone.getDefault());//getTimeZone("GMT"));
updateTime.set(Calendar.HOUR_OF_DAY, 00);
updateTime.set(Calendar.MINUTE, 00);
Intent downloader = new Intent("ALARME");//context, AlarmReceiver.class);
PendingIntent recurringDownload = PendingIntent.getBroadcast(context,
0, downloader, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarms = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarms.setInexactRepeating(AlarmManager.RTC_WAKEUP, updateTime.getTimeInMillis(), AlarmManager.INTERVAL_DAY, recurringDownload);
}
}
答案 0 :(得分:1)
如果该代码是您的服务所做的一切,您可以完全摆脱服务。
该服务唯一能做的就是每天在闹钟管理器上安排一次广播,为什么不直接从活动中安排这个时间表?
修改强>
鉴于您的评论,我原来的答案仍然是:
AlarmManager上的警报设置是永久性的,直到设备关闭或重新启动。
因此,您可以通过Activity
设置第一个闹钟,并在SharedPreferences
上将其标记为有效。创建BroadcastReceiver
以接收onBoot事件,此接收器将检查SharedPreferences
警报是否处于活动状态,如果是,请在AlarmManager上重新注册。
您的服务仍然使用相同的ContentObserver,但与重复发生的AlarmManager事件无关。
我认为这是最干净的解决方案。
或者(但我认为这不是一个好/干净的解决方案),您可以使用AlarmManager.cancel()
删除现有的PendinIntent,然后重新触发它