티스토리 뷰



안녕하세요 박스여우입니다.

이번에는 GCM(Google Cloud Messaging)을 사용해서 안드로이드의 Push Message(푸시 알람)을 구현해 보도록 하겠습니다.

이번 프로젝트는 저도 2일 동안 헤메다가 겨우 완성한 프로젝트라 조금 쉽게 소개해 드리기 위해 2번에 걸쳐서 완성해 보도록 하겠습니다.


GCM을 사용하는 이유는 앱마다 독자적인 push를 구현하면 배터리 소모가 증가하고, 데이터 처리량도 많아지기 때문에 안드로이드에서 기본적으로 내장되어 있는 push 기능을 사용하는 편이 사용자들에겐 훨씬 바람직 할 것입니다. 안드로이드에 내장되어있는 push 기능을 서비스 하는 게 GCM(Google Cloud Messaging)입니다.


1 - 구조

우선 구현하기에 앞서, push 메세지의 동작 과정과 구현하게 될 프로그램의 구조를 짚고 넘어가 보도록 합시다.


앱이 처음 기기에 설치되어 실행하게 되면 Google Cloud Messaging Service에 해당 프로젝트에 대한 ID를 부여받게 됩니다. 이를 Registeration ID, regID라 부르겠습니다. 이 regID는 해당 기기에 찾아가기 위한 식별ID입니다. 이 부여받은 regID를 서버에 전송하고, 서버는 다시 자신의 DataBase에 저장합니다.


DB에 저장하는 이유는 regID를 서버가 알고 있어야 해당 기기에 push를 전송할 수 있기 때문에 전송할때 다시 regID를 DB에서 꺼내서 메세지와 함께 Cloud Messaging에 보내게 되면 해당 기기에 push메시지가 전송되게 됩니다. 이번에는 DB까지는 아니고 클라이언트와 서버만 구현해 보도록 하겠습니다.


구현 해 보고 몇가지 테스트를 해본 결과 push 메시지는 데이터를 끄고 있어도 데이터를 다시 킨 순간에 전송받게 되고, 수신속도도 빠릿빠릿 한 편 입니다.





2 - GCM 사용

push 서비스를 구현하기에 앞서 GCM에 자신의 프로젝트를 등록하여 API KEY와 프로젝트 번호를 받야아 합니다.

https://developers.google.com/cloud-messaging/ 여기로 이동해서 TRY IT ON ANDROID 버튼을 클릭합시다.



그리고 아래로 내리다 보면 GET A CONFIGURATION FILE 버튼이 나오면 클릭합시다.




드디어 프로젝트를 생성하는 창이 나오게 됩니다. App name은 말 그대로 앱의 이름이나 프로젝트의 이름이고, Android package name은 자신 프로젝트의 패키지 이름입니다. 만약 패키지의 이름이 다르다면 해당 프로젝트는 사용이 불가능 하기 때문에 반드시 프로젝트내의 패키지와 맞춰야 합니다.

마지막으로 Choose and configure services 버튼을 클릭합시다.




마지막으로 ENABLE GOOGLE CLOUD MESSAGING 을 클릭하시면 API KEY와 SENDER ID가 부여됩니다. 이 두개를 잘 기억해 두셔야 합니다.






2 - 클라이언트

그럼 드디어 앱 부분을 만져봅시다!

우선 클라이언트를 다루기 위해 다음 라이브러리를 프로젝트에 등록해 줍시다.


gcm.jar

다음으로 메시지를 받고, Notification을 띄우기 위한 퍼미션 등록을 해야 합니다.



Manifest에 추가할 퍼미션들 입니다.


<uses-permission android:name="android.permission.GET_ACCOUNTS" />

<uses-permission android:name="android.permission.WAKE_LOCK" />

<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />

<uses-permission android:name="android.permission.VIBRATE"/>

<permission android:name="com.example.dsm_boxfox.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="com.example.dsm_boxfox.permission.C2D_MESSAGE" />

GET_ACCOUNTS - 안드로이드 4.0.4버전 이하에서는 Google의 계정이 있어야만 regID를 얻어올 수 있기 때문에 등록하는 퍼미션이 있어야 하지만 그 상위 버전이라면 GET_ACCOUNTS 퍼미션은 필요 없습니다.


WAKE_LOCK - 절전 상태에서도 push message를 수신하기 위한 퍼미션 입니다. 해당 퍼미션이 없으면 오류가 나거나 화면이 꺼진 상태에서 push message수신이 불가능 합니다.


나머지 두개는 push message 구현에 꼭 필요한 퍼미션이라고 보시면 됩니다.





그리고 아래 코드를 Activity들이 담겨져 있는 <application .. /application사이에 추가해 주셔야 합니다.

<application ...>

<receiver
android:name="com.google.android.gcm.GCMBroadcastReceiver"
android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="자신 프로젝트의 패키지" />
</intent-filter>
</receiver>
<service android:name=".GCMIntentService" />

</application>

특히 자신의 프로젝트의 패키지를 category에 반드시 넣어주어야 합니다.





다음으로 MainActivity에 메소드를 추가해 줍시다.

public void registerGcm() {

GCMRegistrar.checkDevice(this);
GCMRegistrar.checkManifest(this);

String regId = GCMRegistrar.getRegistrationId(this);

if (regId.equals("")) {
GCMRegistrar.register(this, "Sender ID");
regId = GCMRegistrar.getRegistrationId(this);
System.out.println("ID : "+regId);

} else {
Log.e("id", regId);
}

}

해당 메소드는 regID의 생성 여부를 판단한 뒤에 생성되어 있지 않으면 생성합니다. Sender ID 부분에는 위에서 얻어온 Sender ID를 넣어줘야 합니다.

아참! MainActivity의 onCreate 메소드 안에서 위의 메소드를 호출해 주어야 합니다.





마지막으로!!

GCMIntentService 클래스를 만들어 줍시다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public class GCMIntentService extends GCMBaseIntentService {
 
    @Override
    protected void onError(Context arg0, String arg1) {}
 
    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
    @Override
    protected void onMessage(Context context, Intent intent) {
        String msg = intent.getStringExtra("msg");
        NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        PendingIntent pendingIntent = PendingIntent.getActivity(this0new Intent(this, MainActivity.class), PendingIntent.FLAG_UPDATE_CURRENT);
        Notification.Builder builder = new Notification.Builder(context)
                .setContentIntent(pendingIntent)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentTitle("DSM 알리미")
                .setContentText(msg)
                .setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE)
                .setTicker("DSM 알리미 - 소식 왔어요!")
                .setAutoCancel(true);
        Notification notification = builder.build();
        nm.notify(Calendar.getInstance().get(Calendar.MILLISECOND), notification);
    }
 
    @Override
    protected void onRegistered(Context context, final String reg_id) {
        //키가 등록됨
    }
 
    @Override
    protected void onUnregistered(Context arg0, String arg1) {
        //키가 제거됨
    }
}
cs
 
cs

- 2016.05.31 Jelly_bean ver 수정 -


파랑색으로 배경색을 지정해 준 부분은 자신의 입맛에 맞게 수정해야 하는 부분입니다.

처음으로 R.drawable.푸쉬 아이콘 부분은 Notification의 아이콘을 넣어주시면 되고, 두번째 "DSM 알리미.."부분은 Notification이 출력되었을 때 미리보기라 생각하시면 됩니다. (이해가 안되면 아래의 사진을 보시면 됩니다.)


세 번째 System.currentTimeMillis() 부분은 Notification이 출력될 시간인데 System.currentTimeMillis()이렇게 적게 되면 지금 당장 출력되게 됩니다. 마지막으로 "DSM 알리미"도 마찬가지로 아래의 이미지를 참고해 주세요..



이번 포스팅은 여기까지만 하도록 하겠습니다! 2일동안 해맨 여파가 아직도 남아 있어서..

2부에서 계속 하도록 하겠습니다.



댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함