이전 글에서 Google Developers 에 Project를 생성하고 GCM을 Enable 시킨 후 설정파일을 다운로드 받고 GCM server key를 발급 받았다.
참고
- Google의 Android Client 개발 참고 site는 https://developers.google.com/cloud-messaging/android/client?configured=true 이니 한번 읽어보는것이 좋다.
- 소스는 https://github.com/googlesamples/google-services 에 있다. 해당 git을 clone 시키고 android/gcm에 있는 project를 Android Studio에서 불러와 컴파일 후 테스트할 수 있다.
이제 Android App을 처음부터 개발해보자.
먼저 Android Studio에서 새 프로젝트를 생성한다.
다음으로 이전에 다운로드 받았던 google-services.json 파일을 app module 디렉토리에 복사해준다.
google-services에 GCM이 통합되었으므로 이를 사용하기 위해 gradle 스크립트에 plugin을 추가해준다.
추가 후 sync를 진행하면 자동으로 gradle에서 library들을 다운로드 받아 추가해준다.
먼저 top-level에 위치한 build.gradle 파일에 classpath를 추가해준다.
다음으로 app-level에 위치한 build.gradle 파일에 아래와 같이 plugin을 등록해주고 dependencies를 추가해준다.
위 작업을 마친 후 sync를 진행하면 external libraries에 라이브러리들이 추가된 것을 확인할 수 있다.
google-services 추가에 관련된 자세한 사항은 https://developers.google.com/android/guides/setup 를 참고해보자.
다음으로 AndroidMenifest.xml 파일에 필요한 권한을 등록한다.
그리고 필요한 receiver와 service들을 등록해준다.
이때 receiver는 google-services내에 정의되어 있기 때문에 별도의 class를 생성할 필요 없이 AndroidMenifest.xml 파일에 등록만 해주면 된다.
참고로 아래 캡쳐 화면에서 삭제된 부분은 앞에서 생성한 package name 이다.(com.test.gcm)
(테스트한 앱이 다른 앱이어서 혼돈을 일으킬 수 있기 때문에 부득이하게 삭제를 하였다.)
이제 token을 얻기위한 RegistrationIntentService class를 작성한다.
아래 코드에서 얻은 token을 server로 전송하여 등록하는 과정은 생략한다.
일단 logcat에 출력되는 token을 복사하여 추후 node.js에서 바로 사용할 것이다.
public class RegistrationIntentService extends IntentService {
private static final String TAG = "MyInstanceIDService";
public RegistrationIntentService() {
super(TAG);
Log.d(TAG, "RegistrationIntentService()");
}
@Override
protected void onHandleIntent(Intent intent) {
try {
InstanceID instanceID = InstanceID.getInstance(this);
String token = instanceID.getToken(getString(R.string.gcm_defaultSenderId),
GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);
//TODO server로 token 전송
Log.i(TAG, "token: " + token);
}
catch (Exception e) {
Log.d(TAG, "Failed to complete token refresh", e);
}
}
}
GCM을 받게되면 notification 알림을 주는 MyGcmListenerService class를 작성하자.
참고로 notification 알림 시 사용할 image는 res/drawable 디렉토리에 추가해준다.
(해당 이미지는 https://github.com/googlesamples/google-services 에서 다운로드 받은 image를 사용하였다.)
public class MyGcmListenerService extends GcmListenerService {
private static final String TAG = "MyGcmListenerService";
@Override
public void onMessageReceived(String from, Bundle data) {
String message = data.getString("message");
Log.d(TAG, "From: " + from);
Log.d(TAG, "Message: " + message);
//TODO message 처리
if (from.startsWith("/topics/")) {
// message received from some topic.
} else {
// normal downstream message.
}
sendNotification(message);
}
private void sendNotification(String 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.ic_stat_ic_notification)
.setContentTitle("GCM Message")
.setContentText(message)
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setContentIntent(pendingIntent);
NotificationManager notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
}
}
마지막으로 token이 refresh 될 때의 event를 처리하는 MyInstanceIDListenerService class를 작성한다.
public class MyInstanceIDListenerService extends InstanceIDListenerService {
private static final String TAG = "MyInstanceIDLS";
@Override
public void onTokenRefresh() {
// Fetch updated Instance ID token and notify our app's server of any changes (if applicable).
Intent intent = new Intent(this, RegistrationIntentService.class);
startService(intent);
}
}
이제 launcher activity인 MainActivity의 onCreate()에서 service를 실행하도록 하자.
public class MainActivity extends AppCompatActivity {
private static final int PLAY_SERVICES_RESOLUTION_REQUEST = 9000;
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (checkPlayServices()) {
// Start IntentService to register this application with GCM.
Intent intent = new Intent(this, RegistrationIntentService.class);
startService(intent); //서비스 실행
}
}
private boolean checkPlayServices() {
GoogleApiAvailability apiAvailability = GoogleApiAvailability.getInstance();
int resultCode = apiAvailability.isGooglePlayServicesAvailable(this);
if (resultCode != ConnectionResult.SUCCESS) {
if (apiAvailability.isUserResolvableError(resultCode)) {
apiAvailability.getErrorDialog(this, resultCode, PLAY_SERVICES_RESOLUTION_REQUEST)
.show();
} else {
Log.i(TAG, "This device is not supported.");
finish();
}
return false;
}
return true;
}
}
이제 App을 실행시키면 logcat에 token이 출력될 것이다.
이 token을 사용하여 node.js 서버에서 client(app)으로 GCM을 날려보자.
-GCM 테스트용 Android App 작성 끝-
'Android' 카테고리의 다른 글
GCM 테스트 앱(Android) + 서버(node.js) 개발 - 1. 사전준비 (0) | 2016.01.25 |
---|