Firebase云消息传递 – Android:closures应用程序时的通知的点击操作不起作用

我正在使用Firebase云消息传递将数据消息传递给正在开发的应用程序。 根据FCM文档,当应用程序在前台:

客户端应用程序在onMessageReceived()中接收数据消息,并可以相应地处理键值对。

它工作正常。 当应用程序在后台时,行为是不同的:

可以在用于启动活动的Intent中检索数据有效负载。

而且它似乎不能很好地工作。 我在通知JSON中使用了“click_action”参数,在那里我指定了Android Manifest中我想要打开的“activity”标签内使用的intentfilter的名称。 例如,我的通知可能是:

{ "to" : "APA91bHun4MxP5egoKMwt2KZFBaFUH-1RYqx...", "notification" : { "body" : "This is a test", "title" : "Test", "click_action" : "com.test.click" }, "data" : { "key" : "data" } } 

我的清单在“MainActivity”中有这个意图filter:

 <intent-filter> <action android:name="com.test.click" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> 

当我的应用程序在后台,我启动通知,一切似乎运作良好:我点击通知,并显示正确的活动,数据键在收到意图的“额外”。 问题出现在我的应用程序closures时:当我点击通知,应用程序正确启动并打开“com.test.click”意图filter的活动,但如果我尝试发送另一个通知,当我点击它什么都没有发生,并且后台通知不再工作,直到我重新启动应用程序。

要更清楚:通知工作正常,而我的应用程序在前台或后台。 如果我的应用程序closures,第一个通知处理正确,但其他的后台通知不再工作,直到我重新启动应用程序:如果我点击一个通知,我的应用程序显示最后一个活动,如果我select了从应用程序“最近的应用程序”菜单。 如果我closures并重新启动应用程序,通知将恢复正常工作。

这是Android中的数据消息或FCM问题的错误? 有没有办法解决这个问题?

我正在使用Nexus 5 API 23进行testing。

Solutions Collecting From Web of "Firebase云消息传递 – Android:closures应用程序时的通知的点击操作不起作用"

我将尝试描述它是如何在我的情况下工作的

通知有效载荷示例:

 { "notification": { "body": "This is a test message", "title": "Message", "click_action" : "OPEN_ACTIVITY_1" }, "data": { "key": "test key" } 

在活动中体现

 <intent-filter> <action android:name="OPEN_ACTIVITY_1" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> 

当应用程序处于后台或closures状态时,FCM将创build一个“通知消息”,onClick将打开正确的活动,然后在应用程序closures时处理通知,在onCreate()方法中调用getIntent

例如。

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_hub); handleIntents(getIntent()); //for simplicity I'm passing the value forward } 

当应用程序位于前台时,我正在FirebaseMessagingService上的onMessageReceived方法中创build一个自定义通知。

例如。

  Intent intent = new Intent(this, HubActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); intent.putExtra("url", remoteMessage.getData().get("url")); 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_launcher) .setContentTitle("Message") .setContentText("This is a test message") .setAutoCancel(true) .setSound(defaultSoundUri) .setContentIntent(pendingIntent); NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.notify(0 /* ID of notification */, notificationBuilder.build()); 

并在活动中适当地处理它我重写的方法onNewIntent(意图意图)。

例如。

 @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); handleIntents(intent); //for simplicity I'm passing the value foward } 

所以我认为你错过了onNewIntent(意图意图),因为这处理新的意图时,已经创build的活动。