https://m.blog.naver.com/PostView.nhn?blogId=cosmosjs&logNo=221300518904&proxyReferer=https%3A%2F%2Fwww.google.com%2F



보통 푸시알림을 구현시 알림창을 클릭하게 되면 메인액티비티가 열리도록 만들게 된다. 이번 예제에서는 원하는 액티비티 이름을 알림을 요청할때 같이 전송하여 해당 액티비티가 실행되도록 하는 예제를 만들어 보기로 하자.
알림을 요청하는 툴은 앞서  사용했던 ARC(Advanced REST Client)를 사용하자. 다음편에서는 FCM에 알림을 요청하는 여러가지 방법에 대해서도 한번 알아 보기로 하고 일단 이 툴을 이용하자.
먼저 앱을 지우는 등 테스트 할때 매번 토큰을 복사해서 알림 요청 하기 귀찮으니 토픽을 구독하게 해서 쉽게 요청하도록 약간 수정하자.

//앱 실행되면서 자동으로 Firebase 토픽을 구독하게 설정, 버튼을 만들어 구독하게 할 수 있다. FirebaseMessaging.getInstance().subscribeToTopic("news");//구독 //구독 취소는 unsubscribeFromTopic()을 호출한다.

메인액티비티에 위와 같이 토픽을 구독하도록 해 주었다. news라는 토픽을 구독하는 모든 폰에 알림이 전달되게 될것이다.

ARC의 Body의 내용을 위 그림처럼 수정하고 보내기 버튼을 눌러 보자. 이제 news를 구독하는 모든 폰에게 알림이 전될 된다. 토픽이 생성 되고 적용되는 데는 어느정도 시간이 걸리기도 한다고 한다. 당장 안된다고 당황하지 말자.

테스트를 위해서 내용이 다른 두개의 액티비티를 만들었다. 첫번재는 지난 예제에서 만들었던 월드컵 한국팀 포토 슬라이드쇼를 보여 주는 것이고 두번째 액티비티도 임의로 대충 만들어 주었다. 이제 푸시알림 요청을 할때 이 액티비티 이름을 data에 실어서 보내면 해당 액티비티가 우선 열리도록 해 보자.

 
ARC 알림 내용

clickAction 키값에 원하는 액티비티 이름을 적어 주고 알림을 요청하면 된다. 그러면 전달된 FCM 메세지에서 키값에 따라 다른 액티비티를 오픈 하도록 할것이다.

public class MyFirebaseMessagingService extends FirebaseMessagingService { private static final String TAG = "MyFirebase"; @Override public void onMessageReceived(RemoteMessage remoteMessage) { //data payload로 보내면 실행 // ... // TODO(developer): Handle FCM messages here. // Not getting messages here? See why this may be: https://goo.gl/39bRNJ Log.d(TAG, "From: " + remoteMessage.getFrom()); //여기서 메세지의 두가지 타입(1. data payload 2. notification payload)에 따라 다른 처리를 한다. // Check if message contains a data payload. if (remoteMessage.getData().size() > 0) { Log.d(TAG, "Message data payload: " + remoteMessage.getData()); //화면을 깨운다. 그러나 이방법은 Deprecated 되었다. 더이상 사용되지 않는다는 것이다. 현재로 작동은 하지만 나중에 어떻게 될지 모른다. PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); PowerManager.WakeLock wakeLock = powerManager.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "TAG"); wakeLock.acquire(3000); String title = remoteMessage.getData().get("title"); String body = remoteMessage.getData().get("content"); String click_action = remoteMessage.getData().get("clickAction"); sendNotification(title, body, click_action); } // Check if message contains a notification payload. if (remoteMessage.getNotification() != null) { Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody()); // String title = remoteMessage.getNotification().getTitle(); // String body = remoteMessage.getNotification().getBody(); // String click_action = remoteMessage.getNotification().getClickAction(); // sendNotification(title, body, click_action); } // Also if you intend on generating your own notifications as a result of a received FCM // message, here is where that should be initiated. See sendNotification method below. } private void sendNotification(String title, String messageBody, String click_action) { if (title == null){ //제목이 없는 payload이면 title = "FCM Noti"; //기본제목을 적어 주자. } //전달된 액티비티에 따라 분기하여 해당 액티비티를 오픈하도록 한다. Intent intent; if (click_action.equals("MainActivity")) { intent = new Intent(this, MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); }else if(click_action.equals("NotiAcivity")){//이런 액티비티 이름을 잘못 타이핑했네.ㅋ intent = new Intent(this, NotiAcivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); } else if (click_action.equals("NewsActivity")){ intent = new Intent(this, NewsActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); } else { 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); Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) .setSmallIcon(R.mipmap.ic_launcher) .setContentTitle(title) .setContentText(messageBody) .setAutoCancel(true) .setSound(defaultSoundUri) .setVibrate(new long[]{1000, 1000}) .setLights(Color.BLUE, 1,1) .setContentIntent(pendingIntent); NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.notify(0 /* ID of notification */, notificationBuilder.build()); } }

MyFirebaseMessasingService 파일의 내용을 위 같이 수정했다. click_action의 값에 들어 있는 액티비티를 열게 된다. 이도 저도 없으면 메인액티비로 열린다.

ARC 내용 변경해서 보내느라 두번째 액티비티 여는데 시간이 걸린다. ㅎㅎ

메인액티비가 아니라 서브액티비티를 오픈 한 다음 액티비티를 바로 닫게 할것인지 메인액티비티로 갈것인지는 차후의 문제. 적절히 처리하면 될듯 하다. 아마도 메인액티비티로 가게 하는 경우가 많을것 같다. 단순히 액티비티뿐만 아니라 그외 여러 형태의 값들을 data 에 담아서 알림요청을 한다음 그 값을 받아서 더 다양한 동작을 하도록 할 수 있겠다.