2

我有一个应用程序,我得到GCM推送通知在GcmListenerService(如gcm android示例中给出)。每当我收到通知时,我都会收到一些JSON,其中包含与显示通知有关的数据。推送通知不打开正确的屏幕

现在假设我得到通知说,“有人书签我”,对于我得到该用户的pk(标识),当我点击该通知,它使用推送通知收到pk,以显示该用户的个人资料。

问题:如果我得到2个上述类型的通知,那么无论我点击哪个通知,我总是会去我最近收到通知的人的个人资料。

是否在其他顶部获取通知,是否覆盖之前通知的值,以便只有最新的通知才有效?这是否意味着我只能显示一个应用程序的推送通知?如果需要,我可以发布代码。

相关代码:

@Override 
    public void onMessageReceived(String from, Bundle data) { 
     tinyDB = new TinyDB(this); 
     if (tinyDB.getBoolean(AppConstants.LOGIN_STATE, false)) { 
      try { 
       Log.i("NOTIF", data.toString()); 
       String screen = data.getString("screen"); 
       String dataJson = data.getString("data"); 
       String displayJson = data.getString("display"); 
       String notification_id = data.getString("notif_id"); 
       String priority = data.getString("priority"); 
       String style = data.getString("style"); 

       Gson gson = new GsonBuilder().disableHtmlEscaping().create(); 
       NotificationVal notificationVal = gson.fromJson(displayJson, NotificationVal.class); 

       String title = notificationVal.getTitle(); 
       String text = notificationVal.getText(); 
       String largeText = notificationVal.getLargeText(); 
       String smallIcon = notificationVal.getSmallIcon(); 
       String largeIcon = notificationVal.getLargeIcon(); 

       Bitmap smallImage = null; 
       Bitmap largeImage = null; 

       if (!TextUtils.isEmpty(smallIcon)) { 
        smallImage = getBitmapFromURL(smallIcon); 
       } 

       if ("big_picture".equalsIgnoreCase(style) && (largeImage != null)) { 
        NotificationCompat.BigPictureStyle notificationStyle = new NotificationCompat.BigPictureStyle(); 
        notificationStyle.setBigContentTitle(title); 
        notificationStyle.setSummaryText(text); 
        notificationStyle.bigPicture(largeImage); 

        Intent intent = NotificationIntentBuilder.get(this, dataJson, screen, smallIcon, largeIcon, notification_id); 

        TaskStackBuilder stackBuilder = NotificationStackBuilder.get(this, screen, dataJson); 
        stackBuilder.addNextIntent(intent); 

        PendingIntent resultPendingIntent = 
          stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); 

        NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this); 

        mBuilder.setSmallIcon(R.drawable.white_square); 
        mBuilder.setAutoCancel(true); 
        mBuilder.setColor(Color.parseColor("#fac80a")); 
        mBuilder.setLargeIcon(largeImage); 
        mBuilder.setContentTitle(title); 
        mBuilder.setContentText(text); 
        mBuilder.setContentIntent(resultPendingIntent); 
        mBuilder.setDefaults(NotificationCompat.DEFAULT_VIBRATE); 
        mBuilder.setDefaults(NotificationCompat.DEFAULT_SOUND); 
        mBuilder.setPriority(NotificationCompat.PRIORITY_HIGH); 
        mBuilder.setStyle(notificationStyle); 

        mBuilder.setContentIntent(resultPendingIntent); 

        NotificationManager mNotificationManager = 
          (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
        if (notification_id != null) { 
         mNotificationManager.cancel(Integer.parseInt(notification_id)); 
         mNotificationManager.notify(Integer.parseInt(notification_id), mBuilder.build()); 
        } 
       } else { 
        Log.i("GCM", "Dummy Notification"); 
       } 
      } catch (Exception e) { 
       Log.i("NOTIF", "An exception occurred"); 
      } 
     } 
    } 

其他内部代码:

public class NotificationStackBuilder { 
    public static TaskStackBuilder get(Context context, String screen, String data) { 
     if ("IMAGE".equalsIgnoreCase(screen)) { 
      TaskStackBuilder stackBuilder = TaskStackBuilder.create(context); 
      stackBuilder.addParentStack(ImageActivity.class); 
      return stackBuilder; 
     } else { 
      TaskStackBuilder stackBuilder = TaskStackBuilder.create(context); 
      stackBuilder.addParentStack(NewHomeActivity.class); 
      return stackBuilder; 
     } 
    } 
} 

public class NotificationIntentBuilder { 
    public static Intent get(Context context, String data, String screen, String smallIcon, String largeIcon, String notificationId) { 
     if ("IMAGE".equalsIgnoreCase(screen)) { 
      String pk = ""; 
      JSONObject jsonObject = null; 
      try { 
       jsonObject = new JSONObject(data); 
       if (jsonObject.has("pk")) { 
        pk = jsonObject.getString("pk"); 
       } 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
      Intent intent = new Intent(context, ImageActivity.class); 
      intent.putExtra("ID", pk); 
      intent.putExtra("notificationId", notificationId); 
      return intent; 
     } else if ("GALLERY".equalsIgnoreCase(screen)) { 
      String pk = ""; 
      JSONObject jsonObject = null; 
      try { 
       jsonObject = new JSONObject(data); 
       if (jsonObject.has("pk")) { 
        pk = jsonObject.getString("pk"); 
       } 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
      Intent intent = new Intent(context, GalleryActivity.class); 
      intent.putExtra("ID", pk); 
      intent.putExtra("notificationId", notificationId); 
      return intent; 
     } else { 
      return new Intent(context, NewHomeActivity.class); 
     } 
    } 
} 

编辑这个问题是不是与不同类型的两个通知的发生(打开不同的活动),因此只能与发生通知打开相同的屏幕。

编辑1这里是推送通知接收到的值:

Bundle[{google.sent_time=1469254984538, priority=0, screen=IMAGE, data={"pk":650}, style=big_picture, google.message_id=0:1469254984541527%e07f0e28f9fd7ecd, notif_id=4267, display={"large_icon":"https:\/\/d2r0rrogy5uf19.cloudfront.net\/photos\/971c03f8-6a5d-30a3-9e49-0ab416cb8fa0.jpg","small_icon":"","text":"Random hi5'd your photo to 'Diwali'","title":"random","large_text":""}, collapse_key=do_not_collapse}] 

这其中有notificationId为4267,现在假设我得到了相同的屏幕的另一个通知,请与notificationId说,4268,那么当我记录了在图像屏幕上收到的notificationId,我在打开这两个通知时得到了4268。

编辑2我猜这个问题与PendingIntent.FLAG_UPDATE_CURRENT有关。这里是文档中写的内容:

Flag indicating that if the described PendingIntent already exists, then keep it but replace its extra data with what is in this new Intent. 

这就是发生了什么事。意向演员的内容被最新通知的意图演员覆盖。所以,我尝试了使用FLAG_ONE_SHOT,但是随着我点击最新的意图,我能够打开旧的意图,但注意打开。

我希望这两个通知都在推送通知列表中,并且它们都应该具有不同的意向附加值的相应屏幕。

+0

你可以分享你的自定义JSON接收器的代码,如果有的话?您可以将目标值设置为最新推送覆盖的变量。 – SlashG

+0

您必须根据响应中的通知类型区分各种通知,例如:{msg_typ:“profile”}或{msg_type:“bookmark”},然后您可以导航至特定屏幕。 –

+0

@SlashG我会分享代码。 –

回答

1

您需要为每个通知提供唯一的请求代码,否则将被替换为新的通知。

从的PendingIntent documentation的摘录:

在数组中的最后的意图表示用于的PendingIntent的关键。 换句话说,它是匹配的重要元素(如完成 与赋予getActivity的单一意图(上下文,int,意图, INT),其内容将成为发送替换的主题(上下文, INT,意向)和FLAG_UPDATE_CURRENT等,这是因为它是 最具体提供的意图,并且UI用户实际 时看到的意图启动

所以更换下面一行:

PendingIntent resultPendingIntent = stackBuilder. getPendingIntent(0, 
             PendingIntent.FLAG_UPDATE_CURRENT); 

麝香摹notification_id是唯一的整数,只需更换它象下面这样:

PendingIntent resultPendingIntent = 
      stackBuilder.getPendingIntent(Integer.parseInt(notification_id) 
       , PendingIntent.FLAG_UPDATE_CURRENT); 
相关问题