본문 바로가기
Android

FCM 파이어베이스 포그라운드 백그라운드 알림 및 백그라운드 작업처리

by 일용직 코딩노동자 2019. 10. 24.
728x90
반응형

저번 게시글에 있던 소스코드는 단순히 푸시알림을 받기만 하면 되는 코드였습니다.

이번 코드는 웹에서 통해 보내주는 제이슨 형식의 푸시알림을 변경하여 포그라운드 및 백그라운드 푸시알림 +

백그라운드 알림이 왔을때 앱딴에서의 동작처리까지 가능하게 했습니다.

웹에서 보내주는 여기 제이슨형식의 파일에서 notification을 아애 삭제해주시고 앱딴에서 data형식으로 받아서 쓰시면

백그라운드 상태에서도 처리가 가능합니다.

 

우선 MyFBMessageService 클래스를 만들어서 FirebaseMessagingService를 상속받습니다.

 

@RequiresApi(api = Build.VERSION_CODES.O)
public class MyFBMessageService extends FirebaseMessagingService {

    String id = "my_channel_02";
    CharSequence name = "fcm_nt";
    String description = "push";
    int importance = NotificationManager.IMPORTANCE_LOW;
    MediaPlayer mediaPlayer;

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {

        if (remoteMessage.getNotification() != null) { //포그라운드
            sendNotification(remoteMessage.getNotification().getBody(),remoteMessage.getNotification().getTitle());
            up_Nt(remoteMessage.getData().get("orderCnt1"),null,null);
        }
        else if (remoteMessage.getData().size() > 0) { //백그라운드
            sendNotification(remoteMessage.getData().get("body"),remoteMessage.getData().get("title"));
            up_Nt(remoteMessage.getData().get("orderCnt1"),null,null);

        }
    }

    private void sendNotification(String messageBody, String messageTitle)  {
        //////////////////////////// 포그라운드 및 백그라운드 푸시알림 처리 ////////////////////////////
        Intent intent = new Intent(this, MainActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
                PendingIntent.FLAG_ONE_SHOT);

        NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        NotificationChannel mChannel = new NotificationChannel(id, name, importance);

        mChannel.setDescription(description);
        mChannel.enableLights(true);
        mNotificationManager.createNotificationChannel(mChannel);
        mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

        int notifyID = 2;

        String CHANNEL_ID = "my_channel_02";

        try{
            Notification notification = new Notification.Builder(MyFBMessageService.this)
                    .setContentTitle(URLDecoder.decode(messageTitle, "UTF-8"))
                    .setContentText(URLDecoder.decode(messageBody, "UTF-8"))
                    .setSmallIcon(R.drawable.icon)
                    .setChannelId(CHANNEL_ID)
                    .setContentIntent(pendingIntent)
                    .build();

            mediaPlayer = MediaPlayer.create(this,R.raw.alarm);
            mediaPlayer.start();

            mNotificationManager.notify(notifyID, notification);
        }
        catch(Exception e){
            e.printStackTrace();
        }

        //////////////////////////// 포그라운드 및 백그라운드 푸시알림 처리 ////////////////////////////
    }

웹에서 data형식으로 받아와서 앱딴에서 처리해줍니다.

onMessageReceived안에서 처리해줍니다. onMessageReceived메소드가 fcm의 호출입니다.

 

sendNotification안에 

.setContentTitle(URLDecoder.decode(messageTitle, "UTF-8"))
.setContentText(URLDecoder.decode(messageBody, "UTF-8"))

부분은 UTF-8로 디코딩을 해줘서 푸시알림이 한글로 뜰 수 있도록 해줍니다.

 

클래스딴 전역으로 

String id = "my_channel_02";
CharSequence name = "fcm_nt";
String description = "push";

int importance = NotificationManager.IMPORTANCE_LOW;

를 선언해주어서 푸시알림의 소리를 죽였습니다.

 

그 후 

mediaPlayer = MediaPlayer.create(this,R.raw.alarm);
mediaPlayer.start();

미디어 플레이어를 통해서 알림음을 임의로 변경해주었습니다.

 

up_Nt 메소드는 제가 따로 기능을 넣은것 뿐이니 없애도 무관합니다.

 

궁금하신 사항은 댓글 남겨주세요.

728x90
반응형

댓글