1. 如果要传输数据,最大不能超过4k并且只从 android 2.2版本开始支持。
2. GCM无论你的推送量有多大,都完全免费,没有任何限制。
3. 在 Google APIs Console page中创建一个API工程,记下工程编号(在url中#prohect:之后的数字)。
在service中打开Google Cloud Messaging for android 的选项。
在API access中创建server key。
4. 需要将目录下的gcm-client/distgcm.jar拷贝的工程的目录中。
5. 使用GCM需要添加的自定义权限(尽在运行在2.2~4.0版本android系统的应用才需要添加,更高的版本可以不添加该权限):
1
2
|
<
permission
android:name
=
"my_app_package.permission.C2D_MESSAGE"
android:protectionLevel
=
"signature"
/>
<
uses-permission
android:name
=
"my_app_package.permission.C2D_MESSAGE"
/>
|
6. 使用GCM需要添加的系统权限:
1
2
3
4
5
6
7
8
|
<!-- App receives GCM messages. -->
<
uses-permission
android:name
=
"com.google.android.c2dm.permission.RECEIVE"
/>
<!-- GCM connects to Google Services. -->
<
uses-permission
android:name
=
"android.permission.INTERNET"
/>
<!-- GCM requires a Google account. -->
<
uses-permission
android:name
=
"android.permission.GET_ACCOUNTS"
/>
<!-- Keeps the processor from sleeping when a message is received. -->
<
uses-permission
android:name
=
"android.permission.WAKE_LOCK"
/>
|
7. 添加broadcast receiver:
1
2
3
4
5
6
7
|
<
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
=
"my_app_package"
/>
</
intent-filter
>
</
receiver
>
|
8. 添加intent service:
1
|
<
service
android:name
=
".GCMIntentService"
/>
|
9. 在客户端重写my_app_package.GCMIntentService类:
onRegistered(Context context, String regId): 当收到registration intent时,这个方法会被调用,它的第二个参数就是GCM返回的registration ID(以device/application对的形式)。一般在这个方法里将registration ID回传给服务器。
onUnregistered(Context context, String regId): 当设备被
GCM取消注册时,会调用这个方法,一般在这个方法里将需要取消注册的registration ID发给服务器。
onMessage(Context context, Intent intent): 当服务端发送一条信息给GCM并且GCM将信息发送掉设备时,这个方法会被调用。如果着调推送信息承载着数据,它的数据内容会以extras的形式存放在intent中。
onError(Context context, String errorId): 当设备在注册或者取消注册时GCM服务器返回错误信息,该方法会被调用。一般在这个方法中根据返回的不同错误码,修正相应的问题。
onRecoverableError(Context context, String errorId): 当设备在注册或者取消注册时,GCM服务器无法访问,该方法会被调用。除非这个方法被重写且返回false,否则GCM库将会使用exponential backup操作进行重试。只有想将错误信息展示给用户或者取消重试操作时,才需要重写该方法。
10. 在主Avtivity中引入命名空间:
1
|
import
com.google.android.gcm.GCMRegistrar;
|
11. 在主Avtivity的onCreate()方法中添加一下代码,用于获取:
1
2
3
4
5
6
7
8
9
|
// GCMRegistrar.checkDevice(this);
// GCMRegistrar.checkManifest(this);
final
String regId = GCMRegistrar.getRegistrationId(
this
);
if
(regId.equals(
""
)) {
GCMRegistrar.register(
this
, SENDER_ID);
}
else
{
Log.v(TAG,
"Already registered"
);
}
SENDER_ID是注册GCM时得到的。
|
12 服务端应用编写
(1)拷贝SDK中的gcm-server/dist/server.jar文件到工程目录。
(2)新建一个servlet为应用提供服务。
(3) 使用com.google.android.gcm.server.Sender发送信息到指定的registration IDs:
1
2
3
4
|
import
com.google.android.gcm.server.*;
Sender sender =
new
Sender(myApiKey);
Message message =
new
Message.Builder().build();
MulticastResult result = sender.send(message, devices,
5
);
|
说明:myApiKey是第一步创建的server key。
(4)处理返回的结果:
1
2
3
4
5
6
7
8
9
10
|
if
(result.getMessageId() !=
null
) { String canonicalRegId = result.getCanonicalRegistrationId();
if
(canonicalRegId !=
null
) {
// same device has more than on registration ID: update database
}
}
else
{
String error = result.getErrorCodeName();
if
(error.equals(Constants.ERROR_NOT_REGISTERED)) {
// application has been removed from device - unregister database
}
}
|