应用程序被杀或背景时,FCM导航无法正常工作。

时间:2016-12-02 10:02:46

标签: android firebase-cloud-messaging

我已将FCM集成到我的应用程序中,我可以在应用程序运行或被杀等时收到通知但是如果应用程序正在运行,那么我可以导航特定的屏幕。但如果应用程序被杀或关闭,那么如果我点击通知,那么它始终会重定向到主屏幕而不是导航区域。 这是我使用的代码:

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {

    // Check if message contains a data payload.
    //  if (remoteMessage.getData().size() > 0) {
    L.d(TAG, "Message data payload: " + remoteMessage.getData());


    //  if (remoteMessage.getNotification() != null) {
    String msg = remoteMessage.getNotification().getBody();

    if (!TextUtils.isEmpty(msg)) {

        sendNotification(remoteMessage.getData(), msg);
    }
}
 private void sendNotification(Map<String, String> data, String messageBody) {

  String referenceKey = data.get("ReferenceKey");
    String referenceValue = data.get("ReferenceValue");

 switch (referenceKey) {
                case Repository.ModuleCode.BRAND:
                        intent = new Intent(this, WebViewActivity.class);
                        intent.putExtra("ID", referenceValue);
                        intent.putExtra("browser", false);
                    break;

                case Repository.ModuleCode.NEWS:
                        intent = new Intent(this, NewDetailActivity.class);

                    break;

                    }
                     intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
            PendingIntent.FLAG_ONE_SHOT);

    Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
            .setSmallIcon(R.drawable.ic_notification)
            .setContentTitle(getString(R.string.app_name))
            .setContentText(messageBody)
            .setAutoCancel(true)
            .setSound(defaultSoundUri)
            .setContentIntent(pendingIntent);

    NotificationManager notificationManager =
            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

    notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
}
                    }
清单中的

 <service
        android:name=".fcm.MyFirebaseMessagingService"
        android:enabled="true"
        android:exported="true">

        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
    </service>

    <service android:name=".fcm.MyFirebaseInstanceIDService">
        <intent-filter>
            <action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
        </intent-filter>
    </service>
在App Gradle中

  compile 'com.google.android.gms:play-services:9.6.1'
compile 'com.google.android.gms:play-services-maps:9.6.1'

如果应用程序仅杀死或关闭了案例,我无法浏览确切的页面。 提前致谢

3 个答案:

答案 0 :(得分:3)

最后我从后端更改了Payload,然后它解决了我的问题。

以前我像这样使用PayLoad

{ "notification": {
"text": "Your Text1"
},
"data": {
"ReferenceKey": "PR" ,
"ReferenceValue": "10," 
},
"to" : "pushtoken"
} 

然后我删除通知并像这样使用。

 {
"data": {
"Message": "Test",
"ReferenceKey": "PR" ,
"ReferenceValue": "10," 
},
"to" : "pushtoken"
}

然后它正在为前景/杀/关闭工作。

此后我无法在xiaomi note3中收到通知。

答案 1 :(得分:2)

它按预期工作..如果应用程序被杀或在后台,则不会触发.onMessageReceived。如果您的应用程序在后台或关闭,则通知中心会显示通知消息,该消息中的任何数据都是传递给因用户点击通知而启动的意图。

您可以使用getIntent().getExtras();在启动时获取意图以获取意图。

更多信息here;

例如:

      Bundle bundle = getIntent().getExtras();
      if (bundle != null) {
          if (bundle.containsKey("data")) {
          Intent intent = new Intent(mContext, ExpectedActivity.Class)
          intent.putExtras("PUSH_KEY",bundle.get("data").toString());
          startActivity(intent)
        }
      }

将此代码放入您的启动器活动中。即使应用程序被终止或处于后台,这也会导航您的预期活动。

如果您的应用处于后台,可以通过调用此处https://stackoverflow.com/a/37599088/3111083给出的用于火力消息传递的rest service api来点击通知来调用您的自定义活动。

答案 2 :(得分:0)

onMessageReceived仅在您的应用程序位于前台时才有效,如果应用程序在后台或被杀死它将无法正常工作,通知将使用标题和消息正文膨胀。如果您单击通知,它将引导您进入应用程序启动器活动,并且可以从onCreate中的getIntent检索通知的数据对象。

数据的对象键/值已经成为意图的系列,因此只需使用数据对象中的键/ varible提取数据。

例如:

Bundle extras  = getIntent().getExtras();
String msg = extras.getString("time");

请注意,只有点击通知才能获取数据。