[Firebase Notifications] 백그라운드에도 PUSH 알림을 표시하는 방법을 적용합니다.

onMessageReceived()가 호출되지 않은 문제


FireBase 콘솔의 Notifications에서 메시지를 보낼 때 응용 프로그램이 백그라운드인 경우 계승 FirebaseMessagingService 클래스 onMessageReceived() 를 호출하지 않고 상태 표시줄에 자동으로 알림을 표시합니다.
이 사양은 FCM문서에도 기재되어 있습니다.
응용 프로그램이 백그라운드에서 실행될 때 Android는 시스템 트레이에 알림 메시지를 보냅니다.사용자가 알림을 누르면 기본적으로 프로그램 이니시에이터가 열립니다.
여기에는 알림과 데이터의 유효한 하중을 동시에 포함하는 메시지(공지 콘솔에서 보내는 모든 메시지)가 포함되어 있습니다.알림은 터미널의 알림 영역(시스템 트레이)에 분배되고 데이터의 유효 하중은 이니시에이터 활동의 임시 추가 부분에 분배됩니다.
그럼에도 불구하고 응용 프로그램이 프론트 데스크톱이 아니더라도 플래카드 모양의 PUSH 알림이 표시됩니다.

백그라운드에서도 PUSH 알림 방법 표시


실제로 프로그램이 백그라운드에 있는 상태에서도 계승된 클래스FirebaseMessagingService가 호출된다.
다만, 도착하지 않았다onMessageReceived().
onMessageReceived() 이전에 호출된 것은 handleIntent(Intent intent).
매개변수의 intent에는 PUSH 알림 메시지가 저장됩니다.
참고로 프로그램이 프론트 데스크톱이라도 호출할 수 있다handleIntent().
FireBase Console에서 메시지를 만들 때 사용자 정의 데이터를 다음과 같이 설정합니다.

디버그 모드에서 Intent 를 보려면 다음과 같이 하십시오.
Bundle[{google.c.a.udt=0, google.sent_time=1510755428922, gcm.notification.e=1, google.c.a.c_id=xxxxxxxxxx, google.c.a.ts=xxxxxxxx, gcm.notification.sound=default, gcm.n.e=1, url=https://xxxx/yyyyy/zzzz, body=ボディ, from=xxxxxxxxx, gcm.notification.sound2=default, title=タイトル, google.message_id=0:xxxxxxxxxxxxx, gcm.notification.body=android---, google.c.a.e=1, collapse_key=jp.co.xxxxxxxxxx}]
body, title, url에 FireBase 콘솔에서 메시지를 만들 때 설정한 사용자 정의 데이터가 추가되었습니다.
그런 다음 값을 가져와서 PUSH 알림을 일반적으로 표시합니다.
전체적인 실현은 이렇다.
public class MyFirebaseMessagingService extends FirebaseMessagingService {

    @Override
    public void handleIntent(Intent intent) {
        if (intent.getExtras() == null) return;

        Map<String, String> data = new HashMap<>();
        data.put("body", intent.getExtras().getString("body"));
        data.put("title", intent.getExtras().getString("title"));
        data.put("url", intent.getExtras().getString("url"));
        sendNotification(data);
    }

    private void sendNotification(Map<String, String> data) {

        String title = data.get("title");
        String message = data.get("body");
        String url = data.get("url");

        Intent intent = new Intent(this, HomeActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent,
                PendingIntent.FLAG_ONE_SHOT);
        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
                .setContentTitle(title)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentText(message)
                .setAutoCancel(true)
                .setPriority(1 /* Notification.PRIORITY_HIGH */)
                .setFullScreenIntent(null, true)
                .setContentIntent(pendingIntent);

        NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        notificationManager.notify(0, notificationBuilder.build());

    }

끝내다


이게 정확한 방법인지는 모르겠지만 기본적으로 문제가 없어요.
다른 좋은 방법이 있으면 알려주세요!

좋은 웹페이지 즐겨찾기