搭建GCM(客户端)

搭建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 **********
这个大家自己注册一个就好了,具体操作前面转载的那篇”搭建GCM(一)“中有详细介绍,然后就是服务端了,详情见搭建GCM(服务端)。

有兴趣的可以下载我的demo:GCM测试实例

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值