【问题标题】:Android notification always open MainActivityAndroid 通知总是打开 MainActivity
【发布时间】:2017-01-15 18:19:55
【问题描述】:

设置 Firebase 后,我收到使用 Firebase 控制台创建的通知,当我单击它时,我的应用程序会打开清单上声明的 firstactivity

我想打开一个特定的 detailactivityfirstactivity 作为父级。

我的清单:

...
   <activity
        android:parentActivityName=".views.main.MainActivity"
        android:name=".views.detail.DetailActivity"
        android:screenOrientation="portrait">
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value=".views.main.MainActivity" />
    </activity>
....

我的自定义 FirebaseMessagingService:

Intent i = new Intent(this, DetailActivity.class);
    Intent intent2 = new Intent(this, MainActivity.class);
    i.putExtra(ProfileDescriptionActivity.USER_ID, 14);
    TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
    stackBuilder.addParentStack(ProfileDescriptionActivity.class);
    stackBuilder.addNextIntentWithParentStack(intent2);
    stackBuilder.addNextIntent(i);
 PendingIntent pendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);

    NotificationCompat.Builder builder = new NotificationCompat.Builder(this)
            .setAutoCancel(true)
            .setDefaults(Notification.DEFAULT_SOUND)
            .setContentTitle(title)
            .setContentText(message)
            .setSmallIcon(R.drawable.ic_notification)
            .setContentIntent(pendingIntent);

    NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    manager.notify(0, builder.build());

如果我在应用程序关闭时收到通知,它会在通知托盘中正确显示通知。但是当我点击打开时,就像上面说的那样,firstactivity

当应用程序打开并且我收到通知时,通知中心会显示一个空白视图,可以正确打开我想要的活动。

怎么了?谢谢。

【问题讨论】:

  • 您可能在推送消息的类型(数据或通知)上犯了一些错误。发布您的服务器发送到您的应用程序的有效负载。

标签: android firebase android-notifications firebase-notifications


【解决方案1】:

要通过 FCM 自动打开应用程序,您需要使用 data-message,它保证始终调用 onMessageReceived() 方法。

例如,您的有效负载可能是:

{
    "to" : "APA91bHun4MxP5egoKMwt2KZFBaFUH-1RYqx...",
    "notification" : {
      "body" : "great match!",
      "title" : "Portugal vs. Denmark",
      "icon" : "myicon"
    },
    "data" : {
      "Nick" : "Mario",
      "Room" : "PortugalVSDenmark"
    }
  }

为了测试发送此消息,您可以使用任何在线 FCM 测试器,例如this

【讨论】:

    【解决方案2】:

    在 FCM 中,如果您的应用程序在前台,它会在 FirebaseMessagingService 中调用 onMessageReceived,如果应用程序在后台,它会在您声明元数据时自动显示通知 AndroidManifest。

    所以在这种情况下,您必须处理 onMessageReceived 并生成通知。

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        // ...
    }
    

    如果您想处理这两种情况意味着如果您想同时处理这两种情况(前台中的背景),请不要在有效负载中发送通知对象。 例如。

    如果应用程序在后台,则不会调用 onMessageReceived,如果应用程序在前台,则会调用。

    {
        "to" : "APA91bHun4MxP5egoKMwt2KZFBaFUH-1RYqx...",
        "notification" : {
          "body" : "great match!",
          "title" : "Portugal vs. Denmark",
          "icon" : "myicon"
        },
        "data" : {
          "Nick" : "Mario",
          "Room" : "PortugalVSDenmark"
        }
    }
    

    如果应用程序同时位于前台和后台,则将其更改为以下有效负载和您的 onMessageReceived 在两种情况下都会触发只发送数据负载而不是通知负载。 这不能通过 FirebaseDashboard 完成,只能通过发送消息的 firebase api 完成。

    {
        "to" : "APA91bHun4MxP5egoKMwt2KZFBaFUH-1RYqx...",
    
        "data" : {
          "Nick" : "Mario",
          "Room" : "PortugalVSDenmark"
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多