본문 바로가기
Developer/Android, Java

[안드로이드] Firebase Cloud Messaging (FCM) 푸시 메시지에 따라 화면 이동하기

by Doony 2019. 5. 21.

앱에 푸시기능을 넣기 위해서는 FCM(Firebase Cloud Messaging) 서비스를 이용해야합니다. 보통 구현하는 기능은 크게 아래와 같습니다.

  • 단체 푸시 알람
  • 개별 푸시 알람
    단체 푸시의 경우, FCM이 설정된, 즉 해당 앱이 설치된 모든 유저에게 보내는 알람을 말합니다. 이런 경우, 기본적인 구성 외 별도의 코드 구성은 불필요하며, FCM 사이트에서 직접 푸시를 주는 것이 가능합니다.
    개별 푸시의 경우, 특정 디바이스에만 푸시를 보내는 것을 말합니다. 예를들어 도미노 피자를 시켰는데, 남은 시간이 얼마인지 푸시로 알람이 오는 것이 바로 그런 경우에 해당합니다. 개별 푸시는 개별 디바이스의 Token 정보가 필요합니다. 주소를 해당 토큰으로 설정하고, 메시지를 보내면 해당 토큰을 가진 디바이스에만 푸시 알람이 가게 됩니다.

서론이 길었네요. FCM 구현 자체에 대해서는 여기에서 자세한 설명이 되어 있습니다. 이중 FirebaseInstanceIDService 에서 화면 전환을 위한 코드를 삽입할 수 있습니다.

 

전체 코드는 아래와 같습니다.

public class FirebaseInstanceIDService extends FirebaseMessagingService {
 
 
    @Override
    public void onNewToken(String s) {
        super.onNewToken(s);
        Log.e("Firebase""FirebaseInstanceIDService : " + s);
    }
 
    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        // 메시지 수신 시 실행되는 메소드
        if (remoteMessage != null && remoteMessage.getData().size() > 0) {
            sendNotification(remoteMessage);
        }
    }
 
 
    /**
     * 메시지가 수신되었을 때 실행되는 메소드
     * **/
    private void sendNotification(RemoteMessage remoteMessage) {
 
        String message = remoteMessage.getData().get("data");
        // 수신되는 푸시 메시지
 
        int messageDivider = message.indexOf("|");
        // 구분자를 통해 어떤 종류의 알람인지를 구별합니다.
 
        String pushType = message.substring(messageDivider+1); // 구분자 뒤에 나오는 메시지
 
 
        Intent resultIntent = new Intent(this, FirstActivity.class);
        resultIntent.putExtra("pushType", pushType);
        PendingIntent pendingIntent = PendingIntent.getActivity(this1, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT);
 
    
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
 
            String channel = "채널";
            String channel_nm = "채널 이름"// 앱 설정에서 알림 이름으로 뜸.
 
            NotificationManager notichannel = (android.app.NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
            NotificationChannel channelMessage = new NotificationChannel(channel, channel_nm,
                    android.app.NotificationManager.IMPORTANCE_DEFAULT);
            channelMessage.setDescription("채널에 대한 설명입니다.");
            channelMessage.enableLights(true);
            channelMessage.enableVibration(true);
            channelMessage.setShowBadge(false);
            channelMessage.setVibrationPattern(new long[]{100200100200});
            notichannel.createNotificationChannel(channelMessage);
 
            NotificationCompat.Builder notificationBuilder =
                    new NotificationCompat.Builder(this, channel)
                            .setSmallIcon(R.drawable.maindriver)
                            .setContentTitle("알림이 왔어요!")
                            .setContentText(message.substring(0, messageDivider))
                            .setChannelId(channel)
                            .setAutoCancel(true)
                            .setColor(Color.parseColor("#0ec874"))
                            .setContentIntent(pendingIntent)
                            .setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE);
 
            NotificationManager notificationManager =
                    (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
 
            notificationManager.notify(9999, notificationBuilder.build());
 
 
        } else {
            NotificationCompat.Builder notificationBuilder =
                    new NotificationCompat.Builder(this"")
                            .setSmallIcon(R.drawable.maindriver)
                            .setContentTitle("푸시 타이틀")
                            .setContentText(message)
                            .setAutoCancel(true)
                            .setColor(Color.parseColor("#0ec874")) // 푸시 색상
                            .setContentIntent(pendingIntent)
                            .setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE);
 
            NotificationManager notificationManager =
                    (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
 
            notificationManager.notify(9999, notificationBuilder.build());
 
        }
    }
}
 
 
cs

이 중 화면 전환에 사용하는 부분은 주석으로 표시된 구분자입니다. 구분자로는 |를 사용하고 있는데요. 처음에 푸시 알람을 줄 때 구분자 뒤로 알람 종류에 따른 pushType 을 구분하여 주는 것이 좋습니다. 앱에서는 해당 pushType을 읽고, PendingIntent로 앱을 실행시킬 때, 해당 액티비티로 pushType을 넘기게 됩니다.
첫 액티비티에서는 Intent로 받은 pushType의 종류에 따라, 원하는 화면 또는 액티비티로 다시 인텐트를 넘기는 등의 방식으로 전환할 수 있습니다.

댓글