1

ユーザーがボタンをクリックするたびに特定の時刻に通知を設定しようとしています。このよう異なる時刻に複数の通知を受け取ることができません

try { 
      Date date3 = todayTimeDateFormat.parse(todayTimeDate); 
      Date date4 = todayTimeDateFormat.parse(newTime); 

      holder.handlerGap = date4.getTime() - date3.getTime(); 
      holder.handlerGapTV.setText(String.valueOf(holder.handlerGap)); 
      holder.handlerGapTV.setVisibility(View.INVISIBLE); 
      Log.d("handlerGapTV.getText()", holder.handlerGapTV.getText().toString()); 
     } catch (ParseException e) { 
      e.printStackTrace(); 
     } 

がここにgetNotification()です:

private Notification getNotification(int repeat) { 
      mBuilder = 
        new NotificationCompat.Builder(itemView.getContext()) 
          .setSmallIcon(R.mipmap.app_icon_1) 
          .setContentTitle("Notif title") 
          .setContentText("Notif text"); 

      Intent resultIntent = new Intent(itemView.getContext(), AcceptedRequest.class); 
      // Because clicking the notification opens a new ("special") activity, there's 
      // no need to create an artificial back stack. 
      PendingIntent resultPendingIntent = 
        PendingIntent.getActivity(
          itemView.getContext(), 
          repeat, 
          resultIntent, 
          PendingIntent.FLAG_UPDATE_CURRENT 
        ); 

      mBuilder.setContentIntent(resultPendingIntent); 
      return mBuilder.build(); 
     } 

を、ここでNotificationARBroadcastReceiver.javaです:

// make this duration fifteen minutes before startTime 
         long futureInMillis = SystemClock.elapsedRealtime() + Long.parseLong(holder.handlerGapTV.getText().toString()); 
         AlarmManager alarmManager = (AlarmManager) holder.itemView.getContext().getSystemService(Context.ALARM_SERVICE); 
         ArrayList<PendingIntent> intentArray = new ArrayList<PendingIntent>(); 

         for (int i=0; i<10; ++i) { 
          Intent notificationIntent = new Intent(holder.itemView.getContext(), NotificationARBroadcastReceiver.class); 
          notificationIntent.putExtra(NotificationARBroadcastReceiver.NOTIFICATION, holder.getNotification(i)); 
          PendingIntent pendingIntent = PendingIntent.getBroadcast(holder.itemView.getContext(), 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
          alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, futureInMillis, pendingIntent); 
          intentArray.add(pendingIntent); 
         } 

Long.parseLong(holder.handlerGapTV.getText().toString())は次のように計算された

public class NotificationARBroadcastReceiver extends BroadcastReceiver { 

    public static String NOTIFICATION = "notification"; 

    @Override 
    public void onReceive(Context context, Intent intent) { 

     Random random = new Random(); 
     int m = random.nextInt(9999 - 1000) + 1000; 

     NotificationManager mNotifyMgr = 
       (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE); 

     Notification notification = intent.getParcelableExtra(NOTIFICATION); 
     notification.defaults |= Notification.DEFAULT_SOUND; 
     notification.defaults |= Notification.DEFAULT_VIBRATE; 
     mNotifyMgr.notify(m, notification); 

    } 
} 

問題はLong.parseLong(holder.handlerGapTV.getText().toString())がボタンがあると私はカード2最初のボタンとカード2ボタンを押すと、それはカード1のボタンの100秒であるならば、それはカード2のボタンの65であると仮定し、その上CardViewごとに異なるということですその後、通知はカード2のタイミング、すなわち100に従って設定され、カード1のタイミング通知は決して表示されません!

は、100秒後に設定されているか、65の後に設定されているかをすべて通知します。

私にこれを手伝ってください。これに

long futureInMillis = SystemClock.elapsedRealtime() + Long.parseLong(holder.handlerGapTV.getText().toString()); 
         AlarmManager alarmManager = (AlarmManager) holder.itemView.getContext().getSystemService(Context.ALARM_SERVICE); 
         ArrayList<PendingIntent> intentArray = new ArrayList<PendingIntent>(); 

         for (int i=0; i<10; ++i) { 
          Intent notificationIntent = new Intent(holder.itemView.getContext(), NotificationARBroadcastReceiver.class); 
          notificationIntent.putExtra(NotificationARBroadcastReceiver.NOTIFICATION, holder.getNotification(i)); 
          PendingIntent pendingIntent = PendingIntent.getBroadcast(holder.itemView.getContext(), 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
          alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, futureInMillis, pendingIntent); 
          intentArray.add(pendingIntent); 
         } 

:ここからコードを変更

答えて

0

まあ、

int m = (int) ((new Date().getTime()/1000L) % Integer.MAX_VALUE); 

         // make this duration fifteen minutes before startTime 
         long futureInMillis = SystemClock.elapsedRealtime() + Long.parseLong(holder.handlerGapTV.getText().toString()); 
         ArrayList<PendingIntent> intentArray = new ArrayList<PendingIntent>(); 

         Intent notificationIntent = new Intent(holder.itemView.getContext(), NotificationARBroadcastReceiver.class); 
         notificationIntent.putExtra(NotificationARBroadcastReceiver.NOTIFICATION, holder.getNotification()); 
         PendingIntent pendingIntent = PendingIntent.getBroadcast(holder.itemView.getContext(), m, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
         AlarmManager alarmManager = (AlarmManager) holder.itemView.getContext().getSystemService(Context.ALARM_SERVICE); 
         alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, futureInMillis, pendingIntent); 

は私のために働きました!

関連する問題