2016-08-24 114 views
0

我正计划在Firebase服务收到消息时启动通知,但通知触发两次(一次,第二次可能30分钟后)触发的问题是我的代码:Firebase onMessageReceived会触发两次

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); 

这是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); 
} 

这里是Vb.net发送通知功能:

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 

有没有更好的方式发送通知?,AlarmManager中是否有任何问题? 谢谢。

回答

1

从MyAlarmService.onStartCommand()返回START_NOT_STICKY而不是调用super方法。超级方法返回START_STICKY,它会在服务被系统杀死后重新启动服务,重新触发通知。

另一个问题是,为此使用服务是否是一个好主意。我会尝试一个BroadcastReceiver,完成后不会继续运行。

1

你的代码似乎没问题。但根据文档:

在应用程序生命周期外触发操作的常见情况是将数据与服务器同步。这种情况下,您可能会试图使用重复闹铃。但是,如果您拥有托管应用数据的服务器,则将Google Cloud Messaging(GCM)与同步适配器一起使用是比AlarmManager更好的解决方案。同步适配器为您提供与AlarmManager相同的时间安排选项,但它为您提供了更大的灵活性。例如,同步可以基于来自服务器/设备的“新数据”消息(请参阅运行同步适配器了解详细信息),用户的活动(或不活动),一天中的时间等。有关何时以及如何使用GCM和同步适配器的详细信息,请参阅本页顶部的链接视频。

来源:Scheduling Repeating Alarms documentation

也许你可以尝试使用同步适配器。同时检查你是否收到两次通知(我认为你不是)。或者检查闹钟是否设置为30分钟的重复时间。

希望这会有所帮助。