搭建GCM的一些准备工作网上有很多,我前面也转了几篇比较好的文,不大懂的童鞋可以了解了解,这边不再作介绍,我这边呢因为是在海外,用谷歌的GCM推送比较方便,也容易,在国内可能不大实际,原因大家都懂的。好了,废话不多说,这边主要是代码的方式,也是参考了一下某位先生的,博客名字我也不记得了,如果路过,还望留名。
上代码:
首先,是安卓客户端代码,需要下载gcm.jar,这个在SDKmanager的extra上面有,可能国内会有缺失。下面是客户端调用mainActivity;
package com.example.gcmdemo;
import android.app.Activity;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.gcm.GCMRegistrar;
/**
* ,安
* @author Administrator
*
*/
public class MainActivity extends Activity {
private Button RegisteringC2DM;
private Button UnregisteringC2DM;
private TextView show;
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById();
// Log.i(TAG, "regId = " + regId);
setRegisteringC2DM();
setUnregisteringC2DM();
}
private void findViewById() {
show = (TextView)findViewById(R.id.show);
RegisteringC2DM = (Button) findViewById(R.id.RegisteringC2DM);
UnregisteringC2DM = (Button) findViewById(R.id.UnregisteringC2DM);
}
private void setRegisteringC2DM() {
RegisteringC2DM.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 註冊
GCMRegistrar.checkDevice(MainActivity.this);
GCMRegistrar.checkManifest(MainActivity.this);
String regId = GCMRegistrar.getRegistrationId(MainActivity.this);
if (regId.equals("")) {
GCMRegistrar.register(MainActivity.this,
GCMIntentService.SENDER_ID);
}
Toast.makeText(MainActivity.this, "regId = " + regId, 200).show();
show.setText(regId);
Log.i(TAG, "regId = "+regId);
}
});
}
private void setUnregisteringC2DM() {
UnregisteringC2DM.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 取消註冊
// Intent unregIntent = new Intent(
// "com.google.android.c2dm.intent.UNREGISTER");
// unregIntent.setClass(MainActivity.this, GCMIntentService.class);
// unregIntent.putExtra("app",
// PendingIntent.getBroadcast(MainActivity.this, 0, new Intent(), 0));
// startService(unregIntent);
GCMRegistrar.unregister(MainActivity.this);
Log.i(TAG, "UnregisteringC2DM onClick");
}
});
}
}
上面是客户端的注册代码,
String regId = GCMRegistrar.getRegistrationId(MainActivity.this);
if (regId.equals("")) {
GCMRegistrar.register(MainActivity.this,
GCMIntentService.SENDER_ID);
}
这段是检测是否有注册ID,如果没有,则注册,这边是一个异步网络请求过程,等待一段时间(这边时间很短,大概5秒不到就好了)后再次点击则会拿到谷歌服务器返回的regID,然后这个ID发送给自己的服务器,服务器绑定这个regID,向谷歌服务器发送消息,谷歌服务器再根据这个regID向客户端推送,你就会收到相应的消息。然后是GCMIntentService,这里面你可以实现消息接收的一下反馈,可以做一些注册,消息成功,失败等的这些后续操作,代码如下:
package com.example.gcmdemo;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.util.Log;
import android.widget.Toast;
import com.google.android.gcm.GCMBaseIntentService;
/**
* ,安
* @author Administrator
*
*/
public class GCMIntentService extends GCMBaseIntentService {
public static final String SENDER_ID="**********";
public GCMIntentService() {
super(SENDER_ID);
}
@Override
protected void onError(Context arg0, String arg1) {
Log.v("GCMIntentService", "onError");
}
@SuppressWarnings("deprecation")
@Override
protected void onMessage(Context arg0, Intent arg1) {
// String titleString=arg1.getStringExtra("title");
// String contentString=arg1.getStringExtra("content");
// showNotification("title","content"+System.currentTimeMillis());
NotificationManager myNotificationManager = (NotificationManager)arg0.getSystemService(Context.NOTIFICATION_SERVICE);
int icon = R.drawable.ic_launcher;
CharSequence tickerText = "Hello";
long when = System.currentTimeMillis();
Notification myNotification = new Notification(icon,tickerText,when);
Context context = getApplicationContext();
CharSequence contentTitle = "My notification";
CharSequence contentText = "Hello World!";
Intent notificationIntent = new Intent(this, MainActivity.class);
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
myNotification.icon = R.drawable.ic_launcher;
myNotification.flags = Notification.FLAG_AUTO_CANCEL;
myNotification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);
myNotificationManager.notify(1, myNotification);
Toast.makeText(this, "onMessage", 200).show();
Log.i("asdf",""+myNotificationManager);
}
@Override
protected void onRegistered(Context arg0, String arg1) {
Toast.makeText(this, "onRegistered", 200).show();
Log.v("GCMIntentService", "onRegistered success ");
}
@Override
protected void onUnregistered(Context arg0, String arg1) {
Toast.makeText(this, "onUnregistered", 200).show();
Log.v("GCMIntentService", "onUnregistered");
}
public void showNotification(String title,String content){
NotificationManager manager=(NotificationManager)this.getSystemService(android.content.Context.NOTIFICATION_SERVICE);
Notification notification=new Notification(R.drawable.ic_launcher,title,System.currentTimeMillis());
notification.flags |= Notification.FLAG_ONGOING_EVENT; // 将此通知放到通知栏的"Ongoing"即"正在运行"组中
notification.flags |= Notification.FLAG_SHOW_LIGHTS;
notification.defaults = Notification.DEFAULT_LIGHTS;
notification.ledARGB = Color.BLUE;
notification.ledOnMS =5000; //闪光时间,毫秒
// 设置通知的事件消息
CharSequence contentTitle =title; // 通知栏标题
CharSequence contentText =content; // 通知栏内容
Intent notificationIntent =new Intent(); // 点击该通知后要跳转的Activity
PendingIntent contentItent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
notification.setLatestEventInfo(this, contentTitle, contentText, contentItent);
// 把Notification传递给NotificationManager
manager.notify(0, notification);
}
}
不要忘记一些权限问题,还有就是注意receive的注册
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.gcmdemo"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="21" />
<permission
android:name="<span style="font-family: Arial, Helvetica, sans-serif;">你的包名</span>.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="你的包名.permission.C2D_MESSAGE" />
<!-- 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" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<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"/>
<action
android:name="com.google.android.c2dm.intent.UNREGISTER"/>
<category
android:name="com.example.gcmdemo"/>
</intent-filter>
</receiver>
<service
android:name=".GCMIntentService">
</service>
</application>
</manifest>
当谷歌服务器推送消息过来时,这边只是简单的在onmessge()方法中提示信息,然后就可以在状态栏看到一个消息了。
这边要说一下的就是这个SENDER_ID,这个就是你在google consle控制台项目中的项目
Project ID | ********** |
---|
有兴趣的可以下载我的demo:GCM测试实例