http://trandent.com/board/Android/detail/739
Firebase Cloud Messaging을 사용하여 안드로이드 푸시 알림을 구현 하는 방법 입니다.
1. project level의 build.gradle 파일에 google-service를 추가합니다.
dependencies {
classpath 'com.android.tools.build:gradle:2.1.0'
//classpath 'com.google.gms:google-services:3.0.0'
classpath 'com.google.gms:google-services:3.0.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
2. app level의 build.gradle 파일에 firebase-messaging을 추가합니다. 그리고 google-service plugin을 apply 해줍니다.
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.4.0'
compile 'com.google.firebase:firebase-messaging:9.0.2'
}
apply plugin: 'com.google.gms.google-services'
3. Android-manifest.xml
<application></application> 태그 안에 아래 내용을 추가해 줍니다.
<service
android:name=".FirebaseMessagingService">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
<service
android:name=".FirebaseInstanceIDService" >
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
</intent-filter>
</service>
4. FirebaseInstanceIDService.java
/**
* Created by HKH on 2016-06-28.
*/
import android.util.Log;
import com.google.firebase.iid.FirebaseInstanceId;
import com.google.firebase.iid.FirebaseInstanceIdService;
public class FirebaseInstanceIDService extends FirebaseInstanceIdService {
private static final String TAG = "MyFirebaseIIDService";
// [START refresh_token]
@Override
public void onTokenRefresh() {
// Get updated InstanceID token.
String token = FirebaseInstanceId.getInstance().getToken();
}
}
사용자 기기별 token을 생성하는 클래스 입니다.
나중에 push 알림을 특정 타겟에게 보낼 때 사용되는 고유 키 값 입니다.
이 토큰값을 용도에 맞게 사용하시면 됩니다.
5. FirebaseMessagingService.java
/**
* Created by HKH on 2016-06-28.
*/
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.PowerManager;
import android.support.v4.app.NotificationCompat;
import com.google.firebase.messaging.RemoteMessage;
import java.io.BufferedInputStream;
import java.net.URL;
import java.net.URLConnection;
public class FirebaseMessagingService extends com.google.firebase.messaging.FirebaseMessagingService {
private static final String TAG = "FirebaseMsgService";
// [START receive_message]
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
sendPushNotification(remoteMessage.getData().get("message"));
}
private void sendPushNotification(String message) {
System.out.println("received message : " + message);
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);
Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.noti).setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher) )
.setContentTitle("Push Title ")
.setContentText(message)
.setAutoCancel(true)
.setSound(defaultSoundUri).setLights(000000255,500,2000)
.setContentIntent(pendingIntent);
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
PowerManager pm = (PowerManager) this.getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wakelock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "TAG");
wakelock.acquire(5000);
notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
}
}
푸시메세지가 들어왔을때 실제 사용자에게 푸시알림을 만들어서 띄워주는 클래스 입니다.
Api를 통해 푸시 알림을 전송하면 입력한 내용이 message에 담겨서 오게 됩니다.
6. MainActivity.java
import com.google.firebase.messaging.FirebaseMessaging;onCreate 함수 안에
FirebaseMessaging.getInstance().subscribeToTopic("notice");
-> 여기서 topic은 api를 사용하여 푸시 알림 전송시 같은 토픽명 그룹 전체에 메세지를 발송 할 수 있습니다.
테스트는 Firebase Console의 Notification 메뉴에서 가능합니다.
백그라운드 푸시알림 받기 :: https://trandent.com/board/Android/detail/744
+ 내용 추가
1. android sdk에 google play services 가 설치되어있지 않아서 오류가 발생한다면
android studio 사용중이시라면 tools -> android -> SDK manager -> SDK Tools 탭에 들어가셔서 Google Play services 설치해 보시기 바랍니다.
2. onTokenRefresh에서 뿐만 아니라 어느 시점에서든
String token = FirebaseInstanceId.getInstance().getToken(); 을 사용하게 되면 사용자 기기의 고유 토큰 값을 가져 올 수 있습니다.
여기서 얻은 토큰으로 특정 사용자에게 푸시알림 전송이 가능합니다.