2015-07-22 2 views
0

При получении уведомления я отправляю широковещательную рассылку, используя этот код.Сообщение получено несколько раз от gcm

Event event = requestManager.getEventById(comment.eventId); 
     Intent intent = new Intent(NOTIFICATION_ACTION).putExtra(EventFragment.EVENT, event); 
     builder.setContentIntent(PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)); 

Передача открывает различные действия, когда приложение работает или нет.

public class NotificationBroadCastReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     Event event = intent.getParcelableExtra(EventFragment.EVENT); 
     if (event != null) { 
      if (MainActivity.isRunning()) { 
       Bundle args = new Bundle(); 
       args.putParcelable(EventFragment.EVENT, event); 
       intent = OneFragmentActivity.getStartIntent(context, EventFragment.class, args, R.layout.toolbar); 
      } else { 
       intent = new Intent(context, MainActivity.class); 
       intent.putExtra(MainActivity.COMMENT_NOTIFICATION_EVENT, event); 
      } 
     } 
     intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP | 
       Intent.FLAG_ACTIVITY_SINGLE_TOP); 
     context.startActivity(intent); 
    } 
} 

Когда я нажимаю на уведомление, когда приложение работает, все работает должным образом. Но когда я убью приложение и откройте уведомление. Действие открывается, как ожидалось, но одно и то же уведомление получено снова.

Код сервиса gcm.

public class MyGcmListenerService extends GcmListenerService { 

    public static final String NOTIFICATION_ACTION = "com.khevents.Notification"; 

    private void setupCommentNotification(Comment comment, Notification.Builder builder) throws IOException { 
     RequestManager requestManager = EventsApp.getInstance().getRequestManager(); 

     VkUser vkUser = requestManager.getVkUserById(comment.userId); 
     builder.setLargeIcon(BitmapUtilities.getBitmapFromURL(vkUser.avatar)); 
     builder.setContentTitle(vkUser.name + " " + vkUser.lastName); 
     builder.setContentText(comment.text); 

     Event event = requestManager.getEventById(comment.eventId); 
     Intent intent = new Intent(NOTIFICATION_ACTION).putExtra(EventFragment.EVENT, event); 
     builder.setContentIntent(PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)); 
    } 

    private Notification.Builder createNotification(GCMData data) throws IOException { 
     Notification.Builder builder = new Notification.Builder(this); 
     if (data.comment != null) { 
      setupCommentNotification(data.comment, builder); 
     } 
     builder.setSmallIcon(R.drawable.add_icon); 
     return builder; 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
    } 

    @Override 
    public void onMessageReceived(String from, Bundle bundle) { 
     super.onMessageReceived(from, bundle); 
     String json = bundle.getString("data"); 
     Log.i("GCM", "message received: " + json); 
     GCMData data = Json.readNoThrow(json, GCMData.class); 
     if (data == null) { 
      return; 
     } 

     try { 
      Notification.Builder notification = createNotification(data); 

      new Handler(getMainLooper()).post(new Runnable() { 
       @Override 
       public void run() { 
        postNotification(notification); 
       } 
      }); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    private void postNotification(Notification.Builder builder) { 
     Notifications.notify(this, 1, builder); 
    } 
} 
+0

Вы упомянули, что после запуска приложения происходит повторное уведомление. Похоже, эта проблема может быть связана с вашим приемником GCM Broadcast. Не могли бы вы опубликовать код, связанный с этим? – jagsaund

+0

Да. Просто разместил его. Я использую стандартный GcmListenerService для получения уведомлений. –

+0

Проверьте, зарегистрировано ли ваше приложение для Android при каждом запуске приложения (получите новый токен)? И проверьте свое серверное приложение, если всякий раз, когда появляется новый токен клиента (идентификатор устройства), затем повторно отправляйте сообщение? – BNK

ответ

2

Я нашел проблему. Я начал GcmListenerService вручную, но я не должен этого делать. Проблема была устранена после удаления кода startService.

0

попытка установить флаг FLAG_ACTIVITY_CLEAR_TOP

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | 
      Intent.FLAG_ACTIVITY_SINGLE_TOP); 
+0

Это не помогает. –

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