5

Wenn meine Anwendung gestartet wird, führt sie einen API-Aufruf durch und plant dann Benachrichtigungen basierend auf den Ergebnissen. Dies entspricht ca. 10 geplanten Benachrichtigungen. Es scheint ein Problem mit dem Zeitstempel zu geben, der in der aktuellen Benachrichtigung angezeigt wird.Falscher Zeitstempel für zukünftige Benachrichtigungen

Da ich diese Benachrichtigungen erstelle und dann einen Alarm mit einer AlarmManager einplane, ist die Standardzeit für die Benachrichtigung die Zeit, zu der die Benachrichtigung erstellt wird (System.currentTimeMillis()).

Ich habe versucht, die .setWhen() Methode auf meinem Notification.Builder verwenden, um es auf die Zeit einzustellen, die ich verwende, um den zuvor erwähnten Alarm zu planen. Dies ist jedoch ein wenig besser, da Benachrichtigungen nicht garantiert zur angegebenen Zeit geliefert werden, bekomme ich oft Benachrichtigungen ein paar Minuten in der Vergangenheit.

Außerdem habe ich versucht, manuell über die Mitteilung der when Feld in meinem BroadcastReceiver außer Kraft zu setzen, kurz vor .notify() tatsächlich aufgerufen wird:

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); 
     notification.when = System.currentTimeMillis(); 
     int id = intent.getIntExtra(NOTIFICATION_ID, 0); 
     notificationManager.notify(id, notification); 

    } 
} 

jedoch in dem obigen Szenario, wie es scheint, dass .when ignoriert.

Ehrlich gesagt, ich bin einfach auf der Suche nach einer Möglichkeit, den Zeitstempel auf der Benachrichtigung angezeigt werden, die Uhrzeit, zu der es tatsächlich angezeigt wird.

Antwort

2

Ich würde vorschlagen, die Informationen Ihrer Benachrichtigung als Extras weiterzugeben und dann die Benachrichtigung innerhalb des BroadcastReceivers aufzubauen. Dadurch wird die Benachrichtigung unmittelbar vor der Ausgabe erstellt, sodass Ihr AlarmManager den BroadcastReceiver auslöst.

Von wo auch immer Sie planen die Benachrichtigung:

private void scheduleNotification(){ 

    // Create an intent to the broadcast receiver you will send the notification from 
    Intent notificationIntent = new Intent(this, SendNotification.class); 

    // Pass your extra information in 
    notificationIntent.putExtra("notification_extra", "any extra information to pass in"); 

    int requestCode = 1; 

    // Create a pending intent to handle the broadcast intent 
    PendingIntent alarmIntent = PendingIntent 
       .getBroadcast(this, requestCode, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT); 

    // Set your notification's trigger time 
    Calendar alarmStart = Calendar.getInstance(); 
    alarmStart.setTimeInMillis(System.currentTimeMillis()); 
    alarmStart.set(Calendar.HOUR_OF_DAY, 6); // This example is set to approximately 6am 

    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 

    // Set the alarm with the pending intent 
    // be sure to use set, setExact, setRepeating, & setInexactRepeating 
    // as well as RTC_WAKEUP, ELAPSED_REALTIME_WAKEUP, etc. 
    // where appropriate 
    alarmManager.set(AlarmManager.RTC_WAKEUP, alarmStart.getTimeInMillis(), alarmIntent); 
} 

Dann in Ihrem BroadcastReceiver des OnReceive:

String notificationExtra = null; 

// Retrieve your extra data 
if(intent.hasExtra("notification_extra")){ 
    notificationExtra = intent.getStringExtra("notification_extra"); 
} 

//Build the notification 
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context); 
mBuilder.setSmallIcon(notificationIcon) 
     .setContentTitle(notificationTitle) 
     .setContentText(notificationMessage) 
     .setAutoCancel(true); // Use AutoCancel true to dismiss the notification when selected 

// Check if notificationExtra has a value 
if(notificationExtra != null){ 
    // Use the value to build onto the notification 
} 

//Define the notification's action 
Intent resultIntent = new Intent(context, MainActivity.class); // This example opens MainActivity when clicked 

int requestCode = 0; 

PendingIntent resultPendingIntent = 
     PendingIntent.getActivity(
       context, 
       requestCode, 
       resultIntent, 
       PendingIntent.FLAG_UPDATE_CURRENT 
     ); 

//Set notification's click behavior 
mBuilder.setContentIntent(resultPendingIntent); 

// Sets an ID for the notification 
int mNotificationId = 1; 

// Gets an instance of the NotificationManager service 
NotificationManager mNotifyMgr = 
     (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 

// Builds the notification and issues it. 
mNotifyMgr.notify(mNotificationId, mBuilder.build()); 
+0

Dank helfen @sammy mir diesen einen lassen versuchen! – xbadal

+0

Thanksyou sammy! funktionierte perfekt – xbadal

+0

können Sie mir sagen, wie Sie mehrere Benachrichtigungen erstellen.? es kann getan werden, indem man mNotificationId bereitstellt? dann muss ich das selbe abbrechen! – xbadal

0

onReceive() Methode des Ihre NotificationPublisher wird invoked nur sein, wenn geplante alarm als time angegeben auslöst. Wenn Sie eine Benachrichtigung von onReceive() Methode erstellen, wird es definitiv die aktuelle Uhrzeit anzeigen. Keine Notwendigkeit zu erfordern .when oder .setWhen() Methode zu verwenden.

Versuchen Sie dieses:

public class NotificationPublisher extends BroadcastReceiver { 

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

    public void onReceive(Context context, Intent intent) { 

     int id = intent.getIntExtra(NOTIFICATION_ID, 0); 

     // Notification 
     Notification notification = new Notification.Builder(context)  
      .setContentTitle("This is notification title") 
      .setContentText("This is notification text") 
      .setSmallIcon(R.mipmap.ic_launcher).build(); 

     notification.flags |= Notification.FLAG_AUTO_CANCEL; 

     // Notification Manager 
     NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 

     notificationManager .notify(id, notification); 
    } 
} 

Wenn Sie auf ein activity umleiten möchten, wenn klicken Sie auf Notification, dann können Sie PendingIntent verwenden und setzen Sie ihn auf Ihrer Notification.

public class NotificationPublisher extends BroadcastReceiver { 

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

    public void onReceive(Context context, Intent intent) { 

     int id = intent.getIntExtra(NOTIFICATION_ID, 0); 

     Intent intent = new Intent(context, YourTargetActivity.class); 
     intent.putExtra("KEY_ID", id); // Pass extra values if needed 

     PendingIntent pI = PendingIntent.getActivity(context, id, intent, PendingIntent.FLAG_UPDATE_CURRENT); 

     // Notification 
     Notification notification = new Notification.Builder(context)  
      .setContentTitle("This is notification title") 
      .setContentText("This is notification text") 
      .setSmallIcon(R.mipmap.ic_launcher) 
      .setContentIntent(pI).build(); 

     notification.flags |= Notification.FLAG_AUTO_CANCEL; 

     // Notification Manager 
     NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 

     notificationManager .notify(id, notification); 
    } 
} 

Hope this ~

Verwandte Themen