2016-08-24 1 views
0

Ich plane eine Benachrichtigung, die gestartet wird, wenn eine Nachricht vom Firebase-Dienst empfangen wird, aber das Problem, dass die Benachrichtigung zweimal ausgelöst wird (einmal pünktlich und zweites Mal nach vielleicht 30 min), ist mein Code :Firebase onMessageReceived triggert zweimal

sharedPreferences = PreferenceManager 
      .getDefaultSharedPreferences(getApplicationContext()); 
    // Check if message contains a data payload. 
    if (remoteMessage.getData().size() > 0) { 
     Intent myIntent = new Intent(MyFirebaseMessagingService.this, MyAlarmService.class); 
     pendingIntent = PendingIntent.getService(MyFirebaseMessagingService.this, 0, myIntent, 0); 
     AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE); 
     long currentTime = System.currentTimeMillis(); 

     int hour=sharedPreferences.getInt("Hour",9); 
     int min=sharedPreferences.getInt("Min",0); 
     Calendar calendar = Calendar.getInstance(); 
     calendar.set(Calendar.HOUR_OF_DAY,hour); 
     calendar.set(Calendar.MINUTE,min); 



     alarmManager.set(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis() , pendingIntent); 

Dies ist MyAlarmService onStartCommand:

public int onStartCommand(Intent intent, int flags, int startId) { 


     Uri uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
     NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this); 
     mBuilder.setSmallIcon(R.mipmap.ic_launcher); 
     mBuilder.setContentTitle("Figures"); 
     mBuilder.setContentText("New Figures has been updated!"); 
     mBuilder.setAutoCancel(true); 
     mBuilder.setSound(uri); 
     Intent resultIntent = new Intent(this, LoginActivity.class); 
     TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); 
     stackBuilder.addParentStack(LoginActivity.class); 
     stackBuilder.addNextIntent(resultIntent); 
     PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); 
     mBuilder.setContentIntent(resultPendingIntent); 
     NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
     mNotificationManager.notify(0, mBuilder.build()); 


    return super.onStartCommand(intent, flags, startId); 
} 

Und hier ist Vb.net Senden einer Benachrichtigung Funktion:

Private Function sendNotification() As Integer 
    Try 
     Dim url As String = "https://fcm.googleapis.com/fcm/send" 
     Dim tRequest As WebRequest = WebRequest.Create(url) 

     tRequest.Method = "post" 
     tRequest.ContentType = "application/json" 
     Dim data = New With { _ 
      Key .[to] =myTopic, _ 
       Key .TTL = "109", _ 
      Key .data = New With { _ 
       Key .body = "Updated", _ 
       Key .title = "Daily" _ 
      } _ 
     } 
     Dim jssons As String = Newtonsoft.Json.JsonConvert.SerializeObject(data) 
     Dim bytearray As Byte() = Encoding.UTF8.GetBytes(jssons) 
     tRequest.Headers.Add(String.Format("Authorization: key={0}", MyKey)) 
     tRequest.Headers.Add(String.Format("Sender: id={0}", MySenderId)) 
     tRequest.ContentLength = bytearray.Length 
     tRequest.ContentType = "application/json" 
     Using datastream As Stream = tRequest.GetRequestStream() 
      datastream.Write(bytearray, 0, bytearray.Length) 

      Using tresponse As WebResponse = tRequest.GetResponse 

       Using dataStreamResponse As Stream = tresponse.GetResponseStream() 

        Using tReader As StreamReader = New StreamReader(dataStreamResponse) 

         Dim sResponseFromServer As String = tReader.ReadToEnd() 

         Log(sResponseFromServer, w) 
        End Using 
       End Using 

      End Using 
     End Using 

    Catch ex As WebException 
     Log(ex.Message, w) 
     Return ex.Status 



    End Try 
    Log("Notification sent", w) 
    Return 200 

End Function 

Gibt es eine bessere Möglichkeit, die Benachrichtigung zu senden?, Gibt es ein Problem innerhalb des AlarmManagers? Danke.

Antwort

1

Geben Sie START_NOT_STICKY von MyAlarmService.onStartCommand() zurück, anstatt die Super-Methode aufzurufen. Die Super-Methode gibt START_STICKY zurück, wodurch der Dienst neu gestartet wird, nachdem er vom System beendet wurde und die Benachrichtigung erneut ausgelöst wurde.

Die andere Frage ist, ob die Verwendung eines Dienstes für das ist eine gute Idee im Allgemeinen. Ich würde einen BroadcastReceiver versuchen, der nicht weiter läuft, nachdem Sie fertig sind.

1

Ihr Code scheint in Ordnung zu sein. Aber nach der Dokumentation:

Ein häufiges Szenario für die Auslösung eines Vorgangs außerhalb der Lebensdauer Ihrer App ist die Synchronisierung von Daten mit einem Server. In diesem Fall könnten Sie versucht sein, einen sich wiederholenden Alarm zu verwenden. Wenn Sie jedoch den Server besitzen, der die Daten Ihrer App hostet, ist die Verwendung von Google Cloud Messaging (GCM) in Verbindung mit dem Synchronisierungsadapter eine bessere Lösung als AlarmManager. Ein Sync-Adapter bietet Ihnen dieselben Planungsoptionen wie AlarmManager, bietet Ihnen aber wesentlich mehr Flexibilität. Eine Synchronisierung könnte beispielsweise auf einer Nachricht "neue Daten" vom Server/Gerät (Details zum Ausführen eines Sync-Adapters), der Aktivität (oder Inaktivität) des Benutzers, der Tageszeit usw. basieren. In den verknüpften Videos oben auf dieser Seite finden Sie ausführliche Informationen dazu, wann und wie GCM und Sync-Adapter verwendet werden.

Quelle: Scheduling Repeating Alarms documentation

Vielleicht versuchen Sie könnte den Sync-Adapter. Überprüfen Sie auch, ob Sie die Benachrichtigung zweimal erhalten (ich glaube, Sie sind es nicht). Oder prüfen Sie, ob der Alarm auf einen Wiederholungszeitraum von 30 Minuten eingestellt ist.

Hoffe, das hilft.

Verwandte Themen