使用活动和片段处理推送通知导航

时间:2017-07-03 17:26:57

标签: android android-activity push-notification fragment

我使用Firebase推送通知功能开发了一个应用程序。 我创建了一个MainActivity和五个片段A,B,C,D,E。 我想显示片段C,当我点击推送通知消息时,它在我的应用程序在屏幕上打开时工作正常。

但是当我杀了app然后推送通知时,我点击推送通知,MainActivity加载片段A,我的初始片段与MainActivity。

我的应用流程:

Splash Screen -> Login Screen (Silent Login) -> Main Activity -> Load a Specific Fragment

我的代码:

private void sendNotification(String title, String messageBody, int senderId) {
        Intent intent = new Intent(this, MainActivity.class);
        intent.putExtra(ARG_NOTIFICATION_FOR, ConstantValues.NOTIFICATION_FOR_CHAT_SCREEN);
        intent.putExtra(ARG_SENDER_ID, senderId);
        intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), 0 /* Request code */, intent, PendingIntent.FLAG_UPDATE_CURRENT);

        Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentTitle(title)
                .setContentText(messageBody)
                .setAutoCancel(true)
                .setSound(defaultSoundUri)
                .setContentIntent(pendingIntent);

        NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
}

对于MainActivity,如下所示:

if(getIntent() != null)
{
  if (getIntent().hasExtra(ARG_NOTIFICATION_FOR))
  {
    //Load Fragment C
  }
}

当我点击推送通知图标时,应用默认登录的启动画面打开应用程序 - >主要活动 - >加载片段A

主要活动没有hasExtra(ARG_NOTIFICATION_FOR)

2 个答案:

答案 0 :(得分:5)

推送通知的待定​​意图需要向活动发送参数以确定应用程序是从图标或通知中打开的。

 Intent notificationIntent = new Intent(getApplicationContext(), YourActivity.class);
    notificationIntent.putExtra("FromNotification", true);//or fragment Id
    notificationIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
    PendingIntent pendingNotificationIntent = PendingIntent.getActivity(getApplicationContext(),notificationIndex,notificationIntent,PendingIntent.FLAG_UPDATE_CURRENT);
    notification.flags |= Notification.FLAG_AUTO_CANCEL;
    notification.setLatestEventInfo(getApplicationContext(), notificationTitle, notificationMessage, pendingNotificationIntent);

您应该为此目的创建自定义通知。结帐此链接https://developer.android.com/training/notify-user/build-notification.html
同样在onCreate方法中,您应该从通知中接收数据。

protected void onCreate(Bundle bundle){
       super.onCreate(bundle);
       //bla bla bla
       boolean fromNotification = getIntent().getBooleanExtra("FromNotification",false);
       if(fromNotification){
            //open fragment c
       }else{
            //open fragment a
       }
}

答案 1 :(得分:0)

data json添加到通知的payload。在data内,您可以传递其他信息。

可以使用启动的活动中的getIntent().getExtras()来检索此信息。在此之后,您可以根据通知中包含的信息决定显示哪个片段。

payload data的示例如下: -

payload = {
  notification: {
    title: `You have a new like on your post!`,
    click_action : 'HANDLE_NOTIFICATION'

  },
  data : {
        liker_uid : xyz,
        post_id : postId,
    }}