저번 게시글에 있던 소스코드는 단순히 푸시알림을 받기만 하면 되는 코드였습니다.
이번 코드는 웹에서 통해 보내주는 제이슨 형식의 푸시알림을 변경하여 포그라운드 및 백그라운드 푸시알림 +
백그라운드 알림이 왔을때 앱딴에서의 동작처리까지 가능하게 했습니다.
웹에서 보내주는 여기 제이슨형식의 파일에서 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 메소드는 제가 따로 기능을 넣은것 뿐이니 없애도 무관합니다.
궁금하신 사항은 댓글 남겨주세요.
'Android' 카테고리의 다른 글
안드로이드 스튜디오 FCM 기기 고유의 토큰값 받아오기. (0) | 2019.10.24 |
---|---|
안드로이드 스튜디오 구글맵을 통한 위도랑 경도만 받아오기 (0) | 2019.10.24 |
WebView SSL에러로 인해 흰색페이지에서 멈춰있을때 (0) | 2019.10.24 |
WebView 뒤로가기버튼 및 2번 터치시 앱종료 (0) | 2019.10.24 |
안드로이드 화면을 세로로 고정시키고싶을때 (0) | 2019.10.17 |
댓글