2016-09-29 14 views
3

EDIT3を実行していない場合intent.putExtra()が動作しません。 [OK]を私は問題を発見:アプリが殺されている場合は、両方datanotificationonMessageReceivedをトリガしません送信します。ターゲットデバイスがAndroidの場合はnotificationをnullに設定する必要があります。FirebaseMessagingService:アプリは

これは本当にばかげた動作です。

オリジナルのポスト:

私は成功したアプリが起動される活動にnotificationBuilderから渡された意図からバンドルを取得することができます。

しかし、アプリを終了すると、通知は引き続き機能しますが、インテントのGetExtras()はnullです。私FirebaseMessagingService子クラスで

アプリが殺され
@Override 
public void onMessageReceived(RemoteMessage remoteMessage) 
{ 
    Intent intent = new Intent(this, MainActivity.class);   
    intent.putExtra("key_1","value"); 
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
    //also tried with PendingIntent.FLAG_CANCEL_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, notificationBuilder.build()); 

} 

firebaseMessagingServiceでもファイルを書き込むことができません。クラッシュしたり、ビルドしたり、通知を表示したりしますが、ディスクに行われたことは機能しません。

EDIT:次のように私はonMessageReceived方法の内容を交換した

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

アプリは何も実行されていないときは、expected- -asを起こるが、アプリが殺されたときに通知がwhith表示されますタイトルとしては名前アプリ、内容テキストとしてはremoteMessage.getNotification().getBody()である。

onMessageReceivedは発砲していないようです。代わりに別の魔法の機能を...と呼ばれる

EDIT2:要求されたよう、これはサーバから送信されたものである:あなたの第二編集後

{ 
    "data": 
    { 
      "form_id":"33882606580812", 
      "recipientUserId":10500 
    } 
    , 
    "to":"e0bU2jIVO9g:APA91bHsS-s3G1gQLcTFtRUC77pJUWcZvD7h9NfUgFLD-bFam1S0dddngVcmrQlXR5i6DfTsc69T8JbIrSuzyF1iv0c4ac1gmkwvGVMwZo_yA4KwOh82Nx-weYeL79r79si4qH3QBEgs", 
    "notification": 
    { 
      "body":"you have a new notification", 
      "badge":"1", 
      "sound":"default" 
    }, 
    "delay_while_idle":false 
} 
+1

あなたはデータや通知を送信するために使用しているあなたのFCMのJSONを共有することができますしてください? –

+0

また、このコードをここに置いていますか? '//メッセージにデータペイロードが含まれているかどうかを確認します。 場合(remoteMessage.getData()サイズ()> 0){ Log.d(TAG、 "メッセージデータペイロード:" + remoteMessage.getData())。 //そしてあなたの他のコードすなわちインテントとすべて } ' –

+0

は、あなたは私にあなたがこれを上のテスト携帯電話のメーカーやモデルを伝えることができます。多くの製造業者**(特に中国に拠点を置くメーカー)**は奇妙なバックグラウンドサービスを持っているため、サービスのバックグラウンドアプリなどで多くの問題を引き起こすアーキテクチャ上のアプリを抹消します。それだけでも少し問題があるかもしれません。 –

答えて

1

あなたの質問に私が最初に答えたのは、両方ともあなたのケースでは、onMessageReceived()が呼び出されたと感じたので削除を終了しました。アプリがバックグラウンドで動作しているか、殺され、送信されたメッセージは、両方のデータと通知ペイロードが含まれている場合なら、これはそれが本当に

onMessageReceivedは何かということです()メソッドは、と呼ばれることはありません。

アプリはとにかく通知を受け取ることになります実行されていません。あなたはonMessageReceivedを介してデータを傍受したい場合でも、()、あなたはFCMのエンドポイントにのみデータペイロードを送信するカスタムアプリケーションサーバーを作成する必要があります。

このような何か:

{ 
    "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...", 
    "data" : { 
    "Title" : "Title for Notification", 
    "body" : "Notification body can go here", 
    "Room" : "Something extra" 
    }, 
} 

が、これはあなたの問題を解決を願っています。

EDIT:は、私はちょうどあなたが通知とデータペイロードの両方を送信したい場合はアプリが殺され、バックグラウンドで、その後意図はランチャー活動にを傍受することができながら気づいたときに通知をユーザーがクリックします。単純にこれを行うことにより:

Intent fcmIntent = getIntent(); 

しかし、これは通知だけクリックが起動されるランチャーの活動で動作します。 あなたはonCreate()メソッドに単純に入れることができます。

2

を、我々はあなたが送ることがわかります両方notification FCMへのペイロードはdataです。 FCM Documentationを確認すると、アプリケーションはフォアグラウンドまたはバックグラウンドで動作するかどうかを確認できます。 (アプリケーションが殺さ持つことは、バックグラウンドで実行されていると同じである。)

[例外2]通知及びデータペイロードの両方を有するメッセージ、背景及び前景の両方。この場合、通知はデバイスのシステムトレイに配信され、データペイロードはランチャーアクティビティの意図の余分に配信されます。

これは、onMessageReceivedメソッドがこの状態で呼び出されないことを意味します。 FCMサービスは内部的にメインアクティビティを開始する通知を作成し、dataペイロードをインテントバンドルに自動的に渡します。

この状況を正しく処理するか、ペイロードdataだけを使用して組み込み動作をオプトアウトする必要があります。

関連する問題