1

は、私は現在、自分のアプリケーション内の通知で問題をデバッグしています。いくつかの文脈では、私がしたいのは、ロケット打ち上げが発生したときにポップアップする通知をスケジュールすることです。私がしていたのは、APIからの予定された起動のリストを取得した後、開始日(1970年1月1日からのミリ秒単位)をとり、System.currentTimeMillis()を引きます。私は結果として、将来通知をスケジュールするために結果の時間を使用するでしょう。これはSystem.currentTimeMillis() + timeDifferenceで表されます。私は何らかの理由で1つの通知しか表示されないことに気づいた。スケジューリング複数の将来の通知

しかし私は、通知はわずか6分のマークで表示されている将来的には2、4、6分、でスケジュールの通知により、デバッグを試みました。

いくつかの関連するコードは以下の通りです:

public void scheduleNotifications(List<Launch> launches) { 

     for(int i = 0; i < launches.size(); i++) { 

      SimpleDateFormat format = new SimpleDateFormat("MMMM dd, yyyy HH:mm:ss z"); 
      Date date = null; 
      try { 
       date = format.parse(launches.get(i).getWindowstart()); 
      } catch (ParseException e) { 
       e.printStackTrace(); 
      } 
      long timeBetween = date.getTime() - System.currentTimeMillis(); 

      Integer id = Long.valueOf(date.getTime()).intValue(); 

      Intent notificationIntent = new Intent(this, NotificationPublisher.class); 
      notificationIntent.putExtra(NotificationPublisher.NOTIFICATION_ID, id); 
      notificationIntent.putExtra(NotificationPublisher.NOTIFICATION, getNotification(launches.get(i).getRocket().getName(), launches.get(i).getLocation().getPads().get(0).getName())); 
      PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, notificationIntent, 0); 
      AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
      //Debug. Schedule at 2, 4, 6 minutes. 
      if (i == 0) { 
       alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 120000, pendingIntent); 
      } 
      if (i == 1) { 
       alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 240000, pendingIntent); 

      } 
      if (i == 2) { 
       alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 360000, pendingIntent); 

      } 
     } 
    } 

private Notification getNotification(String rocketName, String padName) { 
     Notification.Builder builder = new Notification.Builder(this); 
     PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, MainActivity.class), 0); 
     builder.setContentIntent(pendingIntent); 
     builder.setContentTitle("Upcoming Launch"); 
     builder.setContentText("A launch of a " + rocketName + " is about to occur at " + padName + ". Click for more info."); 
     builder.setSmallIcon(R.drawable.rocket_icon); 
     return builder.build(); 
} 

放送受信機:

public class NotificationPublisher extends BroadcastReceiver { 

    public static String NOTIFICATION_ID = "notification_id"; 
    public static String NOTIFICATION = "notification"; 

    public void onReceive(Context context, Intent intent) { 

     NotificationManager notificationManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE); 

     Notification notification = intent.getParcelableExtra(NOTIFICATION); 
     int id = intent.getIntExtra(NOTIFICATION_ID, 0); 
     notificationManager.notify(id, notification); 

    } 

} 

私は、単一の通知がこれまでに提示された理由を知りたいのですが、だけでなく、私は追加するために必要なもの先に述べた目標を達成する。

答えて

1

あなたがAlarmManagerを使用してアラームを設定すると、それが自動的にマッチングPendingIntentを持っている既存のアラームを解除します。 PendingIntentにはすべて同じコンポーネントが含まれているため、アラームを設定するたびに以前に設定されたアラームは自動的にキャンセルされます。

あなたが複数のアラームを設定したい場合は、PendingIntent Sのそれぞれがユニークであることを確認する必要があります。あなたは、次のいずれかの方法でこれを行うことができます。

  • は(PendingIntent.getBroadcast()に2つ目のパラメータ)異なるrequestCodeを使用し、各PendingIntent
  • Intentあなたは各PendingIntent
ため PendingIntent.getBroadcast()に渡すの異なるアクションを使用するために
+0

よろしくお願い致します。私は 'requestCode'パラメータを一意の整数(この場合は' i'の値)に置き換え、複数の通知を受け取っています。 – Orbit