원문
google c2dm
Android Cloud to Device Messaging (C2DM) - Tutorial
C2DM은 비동기적으로 클라이언트에게 메시지를 전달해주는 기능을 제공합니다.

큰 흐름도

그림 필요

필요 조건

- SDK 2.2 (froyo 이상)
- 구글 마켓
- 구글 메일 계정

특징

- C2DM은 메시지 순서를 보장하지 않음. (메시지를 전송하는 목적보다는 알림용으로 사용)
- 메시지는 최대 1024byte
- 메시지 개수 제한 없음(난 있는 걸로 봤는데 확인 필요)
- Client Application에서 브로드캐스트 인텐트를 이용하여 App을 실행시킴. (브로드 캐스트 퍼미션 필요)

서비스 이용 절차

여기에서 신청 가능

구성과 흐름도

시나리오
1. 개발사에서 구글메일주소와 어플ID를 등록
2. App server에서 메시지를 전달하기 위해서 인증이 필요함
A. 구글메일주소와 비번을 이용하여 토큰 값을 얻음
3. Device의 APP에서는 개발자구글계정과 어플 ID를 전송하여 고유 ID를 발급 받음
4. App server에 고유 ID를 전송하여 저장함. 이 고유 ID를 통해 메시지 전달
5. C2으 서버에 메시지 전송 : 고유 ID와 토큰 값을 이용하여 전송
구성
1. Application Server(Third-Party Application Server)
A. 클라이언트와 통신
B. Google Server(C2DM서버)로 토큰인증값(메시지전달용) 요청
C. 클라이언트의 고유ID(register ID)와 토큰인증값 저장
D. 계정별 메시지 전달 처리
E. Google Server(C2DM서버)로 HTTP 통신
2. Google Server
A. 서비스 등록 및 해지 관리
B. 메시지 전달을 위한 토큰 인증 값 발급
C. Device 등록(고유ID발급) 및 해지 관리
D. Device에 메시지 전달
3. Device
A. C2DM 서비스 등록/해지 요청
B. App Server에 메시지 전달 요청
C. C2DM 이벤트 수신 (메시지 수신 또는 등록 정보 갱신)
참고 사이트 : http://code.google.com/intl/ko-KR/android/c2dm/#register
java library for c2dm
원문 링크

C2DM Sample Client

메니페스트 작성하기

권한 주기
com.google.android.c2dm.permission.RECEIVE 등록과 메시지를 받을 수 있도록 퍼미션을 갖는다.
android.permission.INTERNET 3rd 파트 서버에서 등록 키를 보내기 위해 인터넷 퍼미션을 갖는다.
applicationPackage + ".permission.C2D_MESSAGE 다른 어플리케이션에서 온 메시지를 표현하기 위해.
메시지 인텐트를 받기 위해 com.google.android.c2dm.intent.RECEIVE com.google.android.c2dm.intent.REGISTRATION을 카테고리에 설정해준다.
안드로이드 C2DM을 사용하기 위해 android:minSdkVersion="8" 이상인지 확인해야 한다.
아니면 정확하게 동작하는것을 보장 할 수 없다.
3rd 파티 서버로부터 보내어진 key/value 쌍으로 구성된 C2D_MESSAGE를 받는다. 한가지 특별한 키는 collapes_key이다. 그 키는 off-line 디바이스가 메시지를 받을 수 있도록 한다.

C2DM을 위해 등록하기

안드로이드 어플리케이션은 메시지를 받기 전에 C2DM서버에서 등록 할 필요가 있다. 인텐트를 받기 위해 서비스를 등록할 필요가 있다.
com.google.android.c2dm.intent.REGISTER과 외 2가지 파라미터가 있다.
* sender 는 어플리케이션에 메시지를 보내기 위해 사용되는 계정의 아이디인데 일반적으로 개발자 계정 이메일 주소를 설정한다.
* app은 어플리케이션 아이디인데, 어플리케이션 정보를 추출하기 위해 등록된 서비스를 허용하는 PendingIntent를 설정한다.(??)
샘플로
[code]
Intent registrationIntent = new Intent("com.google.android.c2dm.intent.REGISTER");
registrationIntent.putExtra("app", PendingIntent.getBroadcast(this, 0, new Intent(), 0)); // boilerplate
registrationIntent.putExtra("sender", emailOfSender);
startService(registrationIntent);
[/code]
등록하기는 어플리케이션에서 등록ID를 서드파트 어플리케이션 서버에 보내기 까지 완벽한게 아니다.
그 서드파트 어플리케이션 서버는 메시지를 보내기 위해 등록 id를 사용된다. 또한 그 아이디는 트겅한 디바이스에서 도는 타겟 어플이다.