안드로이드에서 구현할 사항은 newToken 생성하여 DB에 저장되도록 하는 것, PUSH 메시지를 수신하면 팝업된 메시지 창을 누르면 해당 게시글로 이동하여 해당 게시글을 읽어서 내용을 확인하도록 하는 것이 주요 목적이다.
last Update : 2019.8.31
https://firebase.google.com/docs/cloud-messaging/android/client?authuser=0 를 참고하여 파일을 구현한다.
https://medium.com/android-school/firebaseinstanceidservice-is-deprecated-50651f17a148 에
FirebaseInstanceIdService is deprecated 내용이 나온다.
이걸 참조해서 newToken 생성하는 코드를 추가한다. (다음 게시글에 코드 추가했음)
AndroidManifest.xml 파일 수정사항
<service android:name=".FCMListenerService" android:stopWithTask="false"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service> |
FCMListenerService.java 파일
public class FCMListenerService extends FirebaseMessagingService { private static final String TAG = "FCM";
@Override public void onNewToken(String s) { super.onNewToken(s); Log.d(TAG, "token[" + s + "]" ); /* * 기존의 FirebaseInstanceIdService에서 수행하던 토큰 생성, 갱신 등의 역할은 이제부터 * FirebaseMessaging에 새롭게 추가된 위 메소드를 사용하면 된다. */ }
// [START receive_message] @Override public void onMessageReceived(RemoteMessage remoteMessage) { // 메시지를 받았을 때 동작하는 메소드 String title = remoteMessage.getData().get("title"); String message = remoteMessage.getData().get("message"); Log.d(TAG, "From: " + remoteMessage.getFrom()); Log.d(TAG, "Title: " + title); Log.d(TAG, "Message: " + message);
NotificationHelper notificationHelper = new NotificationHelper(getApplicationContext()); notificationHelper.createNotification(title,message); } }
|
Android 8.0(API 수준 26) 이상부터는 알림 채널이 지원 및 권장된다. FCM은 기본적인 설정으로 기본 알림 채널을 제공한다.
NotificationHelper 는 https://link2me.tistory.com/1514 코드를 참조하면 된다.
===========================================================================
Update : 2017.9.2
FCM(Firebase Clouding Messaging) 을 서버(PHP)에서 PUSH 메시지를 보내면 안드로이드폰에서 받기 위해서는 관련 코드를 구현해야 한다.
GCM 에서 FCM 으로 Migrate 하는 방법에 대해서는 https://developers.google.com/cloud-messaging/android/android-migrate-fcm 에 자세히 설명되어 있다.
1. 토큰 등록 코드
파일명은 본인이 지정하고 싶은데로 지정하면 된다.
이 코드에 추가해서 member id 에 연계하여 토큰정보를 수집하도록 해도 되고, 로그인 코드에 추가해도 된다.
public class FCMInstanceIDListenerService extends FirebaseInstanceIdService { private static final String TAG = "MyFirebaseIDService";
@Override public void onTokenRefresh() { // Get updated InstanceID token. String token = FirebaseInstanceId.getInstance().getToken(); Log.d(TAG, "Refreshed token: " + token); } |
2. FCM 메시지를 수신 받아서 처리하는 코드
보통 메시지를 수신하면 메시지 제목만 팝업 메시지로 띄우고,
클릭하면 메시지 내용을 볼 수 있는 UI로 이동하도록 코드를 구현한다.
public class FCMListenerService extends com.google.firebase.messaging.FirebaseMessagingService { private static final String TAG = "FCM";
int mLastId = 0; ArrayList<Integer> mActiveIdList = new ArrayList<Integer>(); NotificationManager nm;
// [START receive_message] @Override public void onMessageReceived(RemoteMessage remoteMessage) { // 메시지를 받았을 때 동작하는 메소드 String title = remoteMessage.getData().get("title"); String message = remoteMessage.getData().get("message"); Log.d(TAG, "From: " + remoteMessage.getFrom()); Log.d(TAG, "Title: " + title); Log.d(TAG, "Message: " + message);
sendPushNotification(title,message); }
private void createNotificationId() { int id = ++mLastId; mActiveIdList.add(id); }
public void sendPushNotification(String title, String message) { nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); nm.cancel(mLastId); createNotificationId();
Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); // 하위 호환성을 위해 NotificationCompat.Builder 사용
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this) .setSmallIcon(R.mipmap.icon) .setContentTitle(title) .setSound(defaultSoundUri) .setLights(000000255,500,2000) .setAutoCancel(true) .setWhen(System.currentTimeMillis()) .setContentText(message);
Intent popupIntent = new Intent(getApplicationContext(), Popup_Noti.class); popupIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); popupIntent.putExtra("msg", title); popupIntent.putExtra("LastId", mLastId); startActivity(popupIntent); // 메시지 팝업창을 바로 띄운다.
PendingIntent resultPendingIntent =PendingIntent.getActivity(this, 0, popupIntent, PendingIntent.FLAG_UPDATE_CURRENT); mBuilder.setContentIntent(resultPendingIntent);
nm.notify(mLastId, mBuilder.build()); } } |
getActivity(Context, int, Intent, int) -> Activity를 시작하는 인텐트를 생성함
getBroadcast(Context, int, Intent, int) -> BroadcastReceiver를 시작하는 인텐트를 생성함
getService(Context, int, Intent, int) -> Service를 시작하는 인텐트를 생성함
사용자가 알림 창의 알림 텍스트를 클릭했을 때 Activity를 시작하려면, setContentIntent()를 호출하여 PendingIntent를 추가한다.
참조 : https://developer.android.com/guide/topics/ui/notifiers/notifications?hl=ko
public class Popup_Noti extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE); // 키잠금 해제 및 화면 켜기 getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
AlertDialog.Builder builder = new AlertDialog.Builder(Popup_Noti.this); builder.setTitle(R.string.app_name); // 앱의 이름 builder.setMessage(getIntent().getStringExtra("msg")); // 넘겨받은 메시지 제목 builder.setCancelable(false); builder.setPositiveButton("내용 보기", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Intent intent = new Intent(Popup_Noti.this, Notice.class); // 공지사항 정보 팝업 및 파싱처리 startActivityForResult(intent, 0); NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); nm.cancel(getIntent().getIntExtra("LastId", -1)); finish(); } }); builder.setNegativeButton("닫기", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Intent intent = new Intent(Popup_Noti.this, Intro.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); startActivity(intent); finish(); } }); AlertDialog alertDialog = builder.create(); alertDialog.show(); } } |
3. AndroidManifest.xml 파일에 추가할 사항
<service android:name="com.tistory.link2me.fcm.FCMListenerService"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service> <service android:name="com.tistory.link2me.fcm.FCMInstanceIDListenerService"> <intent-filter> <action android:name="com.google.firebase.INSTANCE_ID_EVENT" /> </intent-filter> </service> |