如何防止使用Server重新创建AlarmManager?

时间:2012-12-27 13:48:45

标签: android alarmmanager android-pendingintent repeatingalarm

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

}

1 个答案:

答案 0 :(得分: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