0

我有这个服务在后台做其他事情,并且必须始终运行。在其 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);
}

}

4

1 回答 1

1

如果该代码是您的服务所做的一切,那么您可以完全摆脱该服务。

该服务唯一要做的就是每天在警报管理器上安排一次广播,为什么不直接从活动中安排呢?

编辑:

鉴于您的评论,我的原始答案仍然是:AlarmManager 上设置的警报是永久性的,直到设备关闭或重新启动。因此,您可以通过设置第一个警报Activity并将其标记为活动SharedPreferences。创建一个BroadcastReceiver接收 onBoot 事件,此接收器将检查SharedPreferences警报是否处于活动状态,如果是,则在 AlarmManager 上重新注册。

您的服务仍然执行相同的 ContentObserver 内容,但与重复的 AlarmManager 事件没有关联。

我认为这将是最干净的解决方案。

或者(但我认为这不是一个好的/干净的解决方案),您可以使用AlarmManager.cancel()删除现有的 PendinIntent,然后重新触发它

http://developer.android.com/reference/android/app/AlarmManager.html#cancel(android.app.PendingIntent )

于 2012-12-27T14:10:21.770 回答