2016-11-21 5 views
7

Firebase Cloud Messagingを使用して、開発中のアプリケーションにデータメッセージを配信しています。 FCMドキュメントによると、アプリがフォアグラウンドにあるとき:Firebase Cloud Messaging - Android:アプリケーションが閉じられたときに通知のクリックアクションが機能しない

クライアントアプリケーションは、onMessageReceived()でデータメッセージを受信し、それに応じてキーと値のペアを処理できます。

です。正常に動作します。アプリがバックグラウンドの場合、動作は異なります。

アクティビティの起動に使用されるインテントでデータペイロードを取得できます。

かなりうまくいくようです。 通知JSONの「click_action」パラメータを使用しています。ここでは、開きたい「activity」タグ内のAndroid Manifestで使用されるインテントフィルタの名前を指定します。例えば、私の通知は次のようになります。

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

そして、私のマニフェストは「MainActivity」で、このインテントフィルタを持っています

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

私のアプリがバックグラウンドで動作していると私は通知を起動すると、すべてのもの正常に動作しているようです:通知をクリックすると、正しいアクティビティが表示され、データキーは受け取ったインテントの「追加」にあります。 私のアプリが閉じられているときに問題が発生します:通知をタップすると、アプリが正しく起動し、「com.test.click」インテントフィルタでアクティビティが開きますが、別の通知を送信しようとすると、それは何も起こりませんし、バックグラウンド通知は、私がアプリケーションを再起動するまでもう動作しません。

さらに明確にするには、アプリがフォアグラウンドまたはバックグラウンドのときに通知がうまく機能するようにします。私のアプリが閉鎖されている場合、最初の通知は正しく処理されますが、アプリを再起動するまで、他のバックグラウンド通知は一切動作しません。通知をタップすると、アプリは最後のアクティビティが表示されます[最近使ったアプリ]メニュー私が終了し、アプリを再起動すると、通知は正常に動作するように戻ります。

これはAndroidのデータメッセージやFCMの問題のバグですか?この問題を解決する方法はありますか?

私はテストのためにNexus 5 API 23を使用しています。

+1

こんにちは、あなたはこれのための解決策を得ましたか? – Bahu

+0

@Bahu残念ながら、データメッセージのみを使用して解決策を見つけましたが、システムトレイ通知を使用してバグはまだ存在しています。 FCMのバグだと思う。私の質問に記載されている同じバグを試しましたか? –

+1

はい、私はこれを解決しようとしています。もしあなたが「データ・メッセージ、システム・トレイ通知を使用する」以外の提案があれば教えてください – Bahu

答えて

8

私はそれが私の場合に

通知ペイロードの例を働いている方法を説明しようとします:

{ 
"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> 

をアプリがバックグラウンドで動作しているか、閉じたときFCMは「通知メッセージ」を作成し、onClickは適切なアクティビティを開き、アプリケーションが閉じられたときに通知を処理するには、onCreatのgetIntent()を呼び出しますe()メソッド

たとえば、

@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方法でカスタム通知を作成していフォアグラウンドです。

例えば、

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(Intent intent)をオーバーライドしています。

例えば、

@Override 
protected void onNewIntent(Intent intent) { 
    super.onNewIntent(intent); 

    handleIntents(intent); //for simplicity I'm passing the value foward 


} 

活動が既に作成されたときに、これは新しいインテントを処理するので、私はあなたが欠落していた何を考えてonNewIntent(テントの意図)です。

関連する問題