Google Cloud Messaging

洪胤
2023-12-01

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
  }
}

 类似资料:

相关阅读

相关文章

相关问答