2016-08-24 5 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

Верните START_NOT_STICKY из MyAlarmService.onStartCommand() вместо вызова метода super. Супер метод возвращает START_STICKY, который перезапустит вашу службу после того, как она будет убита системой, повторное инициирование уведомления.

Другой вопрос заключается в том, является ли использование услуги для этого хорошей идеей в целом. Я бы попробовал BroadcastReceiver, который не будет работать после того, как вы закончите.

1

Ваш код выглядит нормально. Но в соответствии с документацией:

Общим сценарием для запуска операции вне времени жизни вашего приложения является синхронизация данных с сервером. Это случай, когда у вас может возникнуть соблазн использовать повторяющийся сигнал. Но если у вас есть сервер, на котором размещаются данные вашего приложения, использование Google Cloud Messaging (GCM) в сочетании с адаптером синхронизации является лучшим решением, чем AlarmManager. Адаптер синхронизации предоставляет вам все те же параметры планирования, что и AlarmManager, но он предлагает вам значительно большую гибкость. Например, синхронизация может основываться на сообщении «новых данных» с сервера/устройства (см. «Запуск адаптера синхронизации для деталей»), активности пользователя (или бездействия), времени суток и т. Д. См. Связанные видео в верхней части этой страницы для подробного обсуждения того, когда и как использовать GCM и адаптер синхронизации.

Источник: Scheduling Repeating Alarms documentation

Может быть, вы могли бы попробовать использовать синхронизации адаптера. Также проверьте, получаете ли вы уведомление дважды (я думаю, что нет). Или проверьте, установлен ли будильник на период повторения 30 минут.

Надеюсь, это поможет.

Смежные вопросы