FirebaseCloudMessaging

Firebase Cloud Messaging でバックグラウンドでも処理する

Firebase Cloud Messaging で通知を受信して、独自の通知表示を行いたい場合、FirebaseMessagingService#onMessageReceived がアプリがバックグラウンド時には呼び出されないことで困ります。

FirebaseMessagingService#handleIntent をオーバーライドすれば、フォアグラウンド・バックグラウンドに関わらず、処理を記述することができます。

public class YourMessagingService extends FirebaseMessagingService {
    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        // handleIntentをオーバーライドしているので呼び出されない
    }

    @Override
    public void handleIntent(Intent intent) {
        // intentからデータを取得して使う
        final String body = intent.getStringExtra("gcm.notification.body");

        // your code here
        final NotificationCompat.Builder builder = new NotificationCompat.Builder(getApplicationContext());
        builder.setSmallIcon(R.mipmap.appicon);
        builder.setContentText(R.mipmap.appicon);
        ...
    }
}

super.handleIntent を呼び出すと、Firebaseの標準動作である「バックグラウンドの場合はシステムトレイに入る」が実行されるので、自前で通知を組み立てる場合は呼び出さないこと。


Firebase SDK を 11.6.0 にすると FirebaseMessagingService#handleIntent が final になるので、上記のコードはコンパイルできません。11.4.2 では大丈夫です。

そもそもバックグラウンドにいる場合にメッセージをハンドリングできないという仕様が謎ですが…… SDK がオープンソースになったら final を外す Pull Request を送りたいと思います。