0

私はバックグラウンドで他のことを行うこのサービスを持っており、常に実行されている必要があります。onCreateで、1日に1回メールを送信するアラームを設定しました。サーバーはフォアグラウンドで実行されていないため、システムによって強制終了されてから再度作成されることがあります。その場合、サーバーは再度アラームを作成し、発生するたびに別の電子メールを送信します。だから私の質問は、それがすでにシステムで繰り返すように設定されている場合、それがアラームをトリガーするのを防ぐ方法はありますか?または、サービス内に、アラームを一度作成して、それを使用して再作成されないようにすることができる別の「場所」はありますか?

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

そのコードがサービスのすべてである場合、サービスを完全に取り除くことができます。

サービスが行う唯一のことは、アラーム マネージャーで 1 日 1 回ブロードキャストをスケジュールすることです。このスケジュールをアクティビティから直接実行してみませんか?

編集:

あなたのコメントを考えると、私の元の答えはそのままです。AlarmManagerに設定されたアラームは、デバイスの電源がオフになるか再起動されるまで永続的です。そのため、 で最初のアラームを設定し、ActivityでアクティブとしてマークすることができますSharedPreferencesBroadcastReceiveronBoot イベントを受信する を作成します。このレシーバーは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 に答える