2016-09-15 27 views
0

私のアプリでは、AlarmManagerを使用して、毎週特定の時間にサービスを開始しています。しかし、別の7日間を待つ代わりに、次の日にサービスに電話する必要がある場合もあります。そのため、私はアラームを再設定するのではなく、起動したサービスで新しいAlarmを作成して特定の日付に設定しています。このようなもの:AlarmManagerによって開始されたサービスから新しいアラームを開始

public class AlarmService extends Service { 
@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 

    //do something 

    //setting new alarm 
    AlarmManager alarmMng = (AlarmManager)getSystemService(Context.ALARM_SERVICE); 
    Intent i = new Intent(this,AlarmService.class); 
    PendingIntent alarmIntent = PendingIntent.getService(this, 0, i, 0); 
    Calendar c = Calendar.getInstance(); 
    if(something) alarmMng.set(AlarmManager.RTC_WAKEUP, c.getTimeInMillis()+1000*60*60*24,alarmIntent); 
    else alarmMng.set(AlarmManager.RTC_WAKEUP, c.getTimeInMillis()+1000*60*60*24*7,alarmIntent); 
    return START_STICKY; 
} 

@Nullable 
@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 

これはうまくいく方法ですか?ちょうど呼び出されたサービスから新しいアラームを作成するのは良い考えですか?それは悪いプログラミングの練習とみなされますか?もしそうなら、どうすればそれを扱うべきですか?

答えて

2

悪いプログラミング練習と見なされますか?

いいえ - これはアラームイベントを作成するのに最適です。ドキュメンテーションを見ると、実行中でなくても、あなたのアプリにイベントを送信するために、AlarmManagerの使用が意図されています。 Serviceでこれらのイベントを受信すると、別のアラームイベントがスケジュールされます。

はそれだけで 1によって呼び出されたサービスから新しいアラームを作成することをお勧めしますか?A:私の答えの残りの部分は、あなたが尋ねる他の質問に答えるためにどのように説明することを意図していますかあなたがServiceを必要とするかどうかを判断するために

は本当に多くのアラームを設定するよりも、あなたのコードの「何かを」の部分に依存します。たとえば、IntentService、さらにはBroadcastReceiverを使用しても問題ありません。

編集: つまり、これを処理するためのバックグラウンドプロセスが必要です。適切なバックグラウンドプロセス(ReceiverまたはService)の決定は、処理がどれだけ必要かによって異なります。一般に、アラームをすべて単独で設定することはおそらくReceiverで処理できますが、処理に時間がかかりすぎると(例えば10秒以上)、ANR(Application Not Responding)クラッシュが発生します。それはあなたがサービスを必要とする時です。これは、サービスについての良い記事がある

のEND EDIT

..:あなたのサービスが複数回呼び出された場合Service vs IntentService

具体的には、あなたが持つべき懸念は、おそらく以前をキャンセルするためのコードを含むべきであり、新しいアラームを設定する前に、アラームが作成します。

編集:また、毎回「新しいサービスを作成する」または「新しいアラーム」を作成しているわけではありません。インテントが(AlarmManagerまたはその他の手段によって)送信されるたびに、サービスにはonStartCommandが呼び出されます。新しいインスタンスはまだインスタンス化されていない限り作成されません。

+0

よく「do something」がほとんど通知を表示しています – matip

+0

私の回答を編集しました。それが役に立てば幸い。 – Jim

+0

彼は警報そのものでサービスをスケジュールすることを意味すると思う。そのアラームはサービスを開始し、アラーム自体がサービス内で初期化されます。 –

関連する問題