2016-06-27 10 views
1

私は12時間ごとにチェックを実行し、それに応じて通知を行う必要があるアプリケーションを構築しています。通知のためのAlarmManagerを配置する場所

MainActivity(のonCreateメソッド内):このため、私は各12時間を繰り返し、条件が満たされた場合に通知を発射AlarmManagerを使用

//Set Notifications AlarmManager 
AlarmManager AM = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE); 
Intent notificationIntent = new Intent (this, NotificationAlarmReceiver.class); 
PendingIntent pending = PendingIntent.getBroadcast(this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
Calendar cal = Calendar.getInstance(); 
cal.setTimeInMillis(System.currentTimeMillis()); 
cal.setTimeInMillis(cal.getTimeInMillis() + 5000); //5 Seconds from now 
AM.setRepeating(AlarmManager.RTC, cal.getTimeInMillis(), AlarmManager.INTERVAL_HALF_DAY , pending); //12 Hour Interval 

通知が正しく機能していますしかし、ユーザがアプリケーションを開くたびにAlarmManagerがリセットされるため、onCreateメソッドにAlarmManagerを置くことによって間違いを犯していると思います。しかし、主なアクティビティが開かれるたびに繰り返し作成されるのではなく、いつどこで作成されるのかは分かりません。

私は普段そうイベントでアラームを起動し、私は私がサービスを使用する方法がわからないてきたが、それはServiceとは何かを持って感じているまだので、私はその

+1

ようなものです。 – apelsoczi

+0

はい、私はそう思っています。「AlarmManager」と通知についてのチュートリアルがたくさんあります。しかし、私はそのうちの1人がちょうど実際にコードを置く場所を言いたかったと思います。 –

+3

また、AlarmManagerを使用する場合、デバイスがオフになるとPendingIntentsがクリアされることに注意してください。アラームをスケジューリングするタスクにはIntentServiceを使用します(まだサービスですが、より簡単です)。デバイスの再起動時にアラームの再スケジュールを行うには、BroadcastReceiverを使用してIntent.BOOT_COMPLETEDを待機する必要があります。このBroadcast Receiverを使用して、作成したIntentServiceを再スケジュールします。 – apelsoczi

答えて

1

アラームを設定しているときに、アラームが存在するかどうかを確認する必要があります。そのアラームが存在しない場合は、 が新しいアラームを作成します。この方法は、 から複数のアラームを作成することを防ぎます。上記の例では

private void setAlarmIfRequired() { 

     Intent notificationIntent = new Intent(this, NotificationAlarmReceiver.class); 
     final PendingIntent pendingIntent = 
       PendingIntent.getBroadcast(this, 0, notificationIntent, 
         PendingIntent.FLAG_NO_CREATE); 
     if (pendingIntent == null) { 
      // There is no alarm set for same 
      //Set Notifications AlarmManager 
      AlarmManager AM = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE); 
      PendingIntent pending = PendingIntent.getBroadcast(this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
      Calendar cal = Calendar.getInstance(); 
      cal.setTimeInMillis(System.currentTimeMillis()); 
      cal.setTimeInMillis(cal.getTimeInMillis() + 5000); //5 Seconds from now 
      AM.setRepeating(AlarmManager.RTC, cal.getTimeInMillis(), AlarmManager.INTERVAL_HALF_DAY , pending); //12 Hour Interval 
     } 
    } 

私はあなたの質問に掲載のコードを使用していました。


アップデート1:ベターユーティリティクラスにこのメソッドを移動し、静的メソッドとしてそれを作ることですので、あなたが活動したり、デバイス・ブートを聞く受信機からそれを呼び出すことができます。

コードは、あなたがのonCreateが最適な場所ではないことを信じるに正しい

public static void setAlarmIfRequired(Context context) { 

     Intent notificationIntent = new Intent(context, NotificationAlarmReceiver.class); 
     final PendingIntent pendingIntent = 
       PendingIntent.getBroadcast(this, 0, notificationIntent, 
         PendingIntent.FLAG_NO_CREATE); 
     if (pendingIntent == null) { 
      // There is no alarm set for same 
      //Set Notifications AlarmManager 
      AlarmManager AM = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
      PendingIntent pending = PendingIntent.getBroadcast(context, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
      Calendar cal = Calendar.getInstance(); 
      cal.setTimeInMillis(System.currentTimeMillis()); 
      cal.setTimeInMillis(cal.getTimeInMillis() + 5000); //5 Seconds from now 
      AM.setRepeating(AlarmManager.RTC, cal.getTimeInMillis(), AlarmManager.INTERVAL_HALF_DAY , pending); //12 Hour Interval 
     } 
    } 
+0

私が理解していることは、アラームを呼び出す前に 'PendingIntent'フラグを' FLAG_NO_CREATE'に変更し、ヌルを確認することです。 しかし、私は質問がありますこれについて:私はまだmainActivityのonCreateメソッドでこの関数を呼び出すべきですか? –

+1

このメソッドをActivityから呼び出すと、設定されていない場合にのみアラームが作成されるため、問題はありません。しかし、はい、あなたはこのメソッド呼び出しを最適化すべき場所を探し求める必要があります。もう1つの選択肢は、アプリケーション要件に適合する場合は、このメソッドを 'ApplicationのonCreate'から呼び出すことです。 –

0

についてかなりよく分かりませんユーザーのやりとりに依存し、アクティビティのライフサイクルには依存しません。たとえば、ユーザーがボタンを押したときに実行しました。

アラームを開始させたくない場合は、サービスをまだ使用していない場合にのみサービスを使用してアクティビティから呼び出す必要があります。

https://developer.android.com/reference/android/app/Service.html

あなたのアラームがそれ自身のライフサイクルを持つことになりますし、リセットされませんを参照してください。

+0

私はイベントを開始する予定がありません。アラームをオンにして、初めてアプリケーションを実行したときに、アプリケーション全体に対して1回だけ設定したいとします。 –

+0

サービスを使用して設定する方法を詳しく教えてください。 –

+0

Androidのドキュメントで詳しく説明されています) –

関連する問題