pom
<!-- https://mvnrepository.com/artifact/com.google.gcm/gcm-server -->
<dependency>
<groupId>com.google.gcm</groupId>
<artifactId>gcm-server</artifactId>
<version>1.0.0</version>
</dependency>
Demo
        Sender sender = new Sender("your_google_key");//需要去谷歌注册,然后获取你的key
Message message = new Message.Builder().addData("标题", "消息体").build(); MulticastResult resultMulti = null;
try {
Integer retries = 5;//如果失败重新发送的次数
List<String> appKeys = new ArrayList<>();
appKeys.add("手机的唯一标识");
resultMulti = sender.send(message, appKeys, retries);
Integer successCount = resultMulti.getSuccess();
Integer failCount = resultMulti.getFailure();
// TODO:统计成功和失败次数
return Boolean.TRUE;
} catch (IOException e) {
LOGGER.error("androidMessage send fail" + title + body);
return Boolean.FALSE;
}

转载请注明出处:http://blog.csdn.net/newhope1106/article/details/54709916

GCM即Google Cloud Messaging,主要用于消息推送的,即使在应用没有起来的情况下,客户端也能通过GCM收到来自服务器的消息。GCM支持Android、IOS和Chrome。由于GCM需要google service支持,在国内基本不能用,经常会断线,不过最近项目要求,只在美国上线该项目,因此可以采用GCM实现推送的方式,国内相关文章较少,特意整理了一下客户端使用的官方文档。

首先来看看目前应用不启动实现推送的方式有哪些:

1.使用Google自带的GCM实现推送

2.采用监听开机广播的方式,启动后台服务,为了防止被杀死,采用多进程的方式,监听服务是否被杀,被杀之后,把它拉起来(比较流氓)

3.采用第三发方案,如友盟、极光、信鸽

国内第二种和第三种用得比较多,本文主要讲解第一种方案,也就是GCM,以下内容均来自官网

一、概述

GCM可以让开发者在客户端和服务器之间传递消息,有2种方式实现消息推送,一种是xmpp,它即可让服务器把消息推送给客户端,也可让客户端把消息推送给服务器,另一种方式是http,只能服务器将消息推送给客户端,以下是其架构图。

GCM服务器接收应用服务器的消息,然后再把消息转发给客户端,服务器端根据自己的需要实现xmpp或者http接口,和GCM服务器进行通信,客户端想要接收消息,需要使用GCM提供的API。

二.客户端使用GCM

1.使用限制:

a.最低要求Android 2.2+的设备,并且安装了Google应用商店

b.想要使用GCM新特性,要求Android 2.3+

c.低于Android 4.0.4版本,需要Google账号,Android 4.0.4+不需要

2.客户端使用GCM流程

和使用一般的sdk类似,首先需要在官网注册自己的应用,获取一个appid,出于安全要求,需要在本地使用这个appid去获取动态token,需要把token上传给服务器,每隔一段时间token可能会失效,需要去重新获取token。按照上面的过程我们来看看怎么使用的。以下针对Android Studio开发的。

(1)官网注册应用

首先我们需要到这个网址:https://console.firebase.google.com/ 去注册自己的应用,按照相关步骤操作之后,点击下载配置文件,会下载一个叫google-services.json的文件,把它放到自己的项目的app/目录下。

(2)添加配置文件解析插件依赖

上述下载的google-services.json需要插件进行解析,要在项目中按照下面步骤添加依赖

a.在项目级别(project-level)的build.gradle添加下面依赖

classpath 'com.google.gms:google-services:3.0.0'
b.在自己的应用级别(app-level)的build.gradle添加下面插件

apply plugin: 'com.google.gms.google-services'
(3)添加GCM依赖

代码中需要用到gcm的api,因此需要添加gcm的依赖,版本请使用最新的版本,下面只是示范

dependencies {
  compile "com.google.android.gms:play-services-gcm:10.0.0"
}
(4)修改AndroidMenifest.xml文件

a.添加权限,因为我们不允许其他的应用接收和发送属于自己应用的消息,因此添加权限屏蔽其他应用,权限格式:<application-package-name> + ".permission.C2D_MESSAGE"

b.定义一个GcmReceiver接收器,用来接收发送给应用的消息,需要添加com.google.android.c2dm.permission.SEND权限

c.定义GcmListenerService服务器,用来处理各种不同的下发信息,上发状态,自动显示通知等

d.定义一个集成InstanceIDListenerService的服务,用来获取、刷新token

e.额外的,可以添加android.permission.WAKE_LOCK权限,保证消息到达的时候,可以得到及时处理

以下是一个demo

<manifest package="com.example.gcm" ...>

<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17"/>
    <uses-permission android:name="android.permission.WAKE_LOCK" />

<permission android:name="<your-package-name>.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />
    <uses-permission android:name="<your-package-name>.permission.C2D_MESSAGE" />

<application ...>
        <receiver
            android:name="com.google.android.gms.gcm.GcmReceiver"
            android:exported="true"
            android:permission="com.google.android.c2dm.permission.SEND" >
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                <category android:name="com.example.gcm" />
            </intent-filter>
        </receiver>
        <service
            android:name="com.example.MyGcmListenerService"
            android:exported="false" >
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            </intent-filter>
        </service>
        <service
            android:name="com.example.MyInstanceIDListenerService"
            android:exported="false">
            <intent-filter>
                <action android:name="com.google.android.gms.iid.InstanceID" />
            </intent-filter>
        </service>
        <service
            android:name="gcm.play.android.samples.com.gcmquickstart.RegistrationIntentService"
            android:exported="false">
        </service>
    </application>

</manifest>
如果是android 4.4之前的版本,需要在receiver中添加的intent-filter中添加下面的action

<action android:name="com.google.android.c2dm.intent.REGISTRATION" />

3.客户端获取、刷新token

(1)先来看看获取token的接口

String authorizedEntity = PROJECT_ID; // Project id from Google Developer Console
String scope = "GCM"; // e.g. communicating using GCM, but you can use any
                      // URL-safe characters up to a maximum of 1000, or
                      // you can also leave it blank.
String token = InstanceID.getInstance(context).getToken(authorizedEntity,scope);
上述的PROJECT_ID是在https://console.developers.google.com/project中注册得到的,scope,可以自定义

(2)token的更新

在前面有提到AndroidMenifest.xml中注册一个继承InstanceIDListenerService的服务,看看具体的实现

public class MyInstanceIDService extends InstanceIDListenerService {
  public void onTokenRefresh() {
    refreshAllTokens();
  }

private void refreshAllTokens() {
    // assuming you have defined TokenList as
    // some generalized store for your tokens
    ArrayList<TokenList> tokenList = TokensList.get();
    InstanceID iid = InstanceID.getInstance(this);
    for(tokenItem : tokenList) {
      tokenItem.token =
        iid.getToken(tokenItem.authorizedEntity,tokenItem.scope,tokenItem.options);
      // send this tokenItem.token to your server
    }
  }
}
第一次获取token,虽然没有获取过token,但本质还是刷新,都是调用onTokenRefresh接口,并且把获取的token发送给服务器。

上面的处理可以最好用一个IntentService来异步处理,不要放在主线程中,上述给一个使用范例而已。

(3)InstanceID

上面我们看到,获取token的时候,首先需要InstanceID,当设备上线的时候,Instance ID Service会分配一个InstanceID, InstanceID是由一对公钥和私钥共同维护的,私钥保存在本地,公钥由Instance ID Service注册产生。可以通过调用geId()方法,随时更新InstanceId,因为生成的token都是依赖这个InstanceID的。

String iid = InstanceID.getInstance(context).getId();
你也可以删除一个InstanceID,那么对应的所有token都会失效,用新的InstanceID生成新的token

InstanceID.getInstance(context).deleteInstanceID();
String newIID = InstanceID.getInstance(context).getId();
(4)Instance ID 的生命周期图

4.客户端接收服务器下发信息

a.服务器可以通过HTTP(单向)和XMPP(双向)发送信息,看看下面的demo

HTTP POST Request
https://gcm-http.googleapis.com/gcm/send
Content-Type:application/json
Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA

{ "data": {
    "score": "5x1",
    "time": "15:10"
  },
  "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1..."
}
XMPP Message
<message id="">
  <gcm xmlns="google:mobile:data">
    { "data": {
      "score": "5x1",
      "time": "15:10"
    },
    "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1..."
  }
  </gcm>
</message>
b.客户端处理下发消息

服务器发送的消息,GCM会将接收到的消息转发给客户端,在前面的AndroidManifest.xml中,我们定义了一个GcmListenerService来处理消息,可以自己继承GcmListenerService并且覆盖onMessageReceived方法。

@Override
public void onMessageReceived(String from, Bundle data) {
    String message = data.getString("message");
    Log.d(TAG, "From: " + from);
    Log.d(TAG, "Message: " + message);

if (from.startsWith("/topics/")) {
        // message received from some topic.
    } else {
        // normal downstream message.
    }

// ...
}
5.客户端上发消息

public void onClick(final View view) {
    if (view == findViewById(R.id.send)) {
        new AsyncTask<void, void,="" string="" style="box-sizing: inherit;">() {
            @Override
            protected String doInBackground(Void... params) {
                String msg = "";
                try {
                    Bundle data = new Bundle();
                    data.putString("my_message", "Hello World");
                    data.putString("my_action","SAY_HELLO");
                    String id = Integer.toString(msgId.incrementAndGet());
                    gcm.send(SENDER_ID + "@gcm.googleapis.com", id, data);
                    msg = "Sent message";
                } catch (IOException ex) {
                    msg = "Error :" + ex.getMessage();
                }
                return msg;
            }

@Override
            protected void onPostExecute(String msg) {
                mDisplay.append(msg + "\n");
            }
        }.execute(null, null, null);
    } else if (view == findViewById(R.id.clear)) {
        mDisplay.setText("");
    }
}</void,>
主要是利用了gcm的send接口,上述需要服务器支持xmpp

6.服务器端的实现

可以参考:https://developers.google.com/cloud-messaging/的GCM Connection Server部分

有兴趣的可以参考google的代码demo

https://github.com/google/gcm/

https://github.com/googlesamples/google-services/

---------------------
作者:newhope1106
来源:CSDN
原文:https://blog.csdn.net/newhope1106/article/details/54709916
版权声明:本文为博主原创文章,转载请附上博文链接!

 
 

google的GCM推送使用简介的更多相关文章

  1. GCM(Google Cloud Messaging)推送完全解析

    应该是目前为止全网最详细的GCM推送解析. GCM官方解释: https://developers.google.cn/cloud-messaging/?hl=zh-cn Send data from ...

  2. 极光推送 JPush 简介 集成 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  3. Android客户端消息推送原理简介

    首先简单介绍一下Android消息推送的主要三种方式,如果你已经看过类似的文章,请直接忽略三种介绍.    1.使用SMS服务,即服务器端发送短信,然后手机客户端监听短信的广播,然后对数据进行一定的处 ...

  4. Google FireBase - fcm 推送 (Cloud Messaging)

    要将 Firebase 添加到您的应用,您需要有一个 Firebase 项目以及适用于您的应用的 Firebase 配置文件. 如果您还没有 Firebase 项目,请在 Firebase 控制台中创 ...

  5. 使用GCM服务(Google Cloud Messaging)实现Android消息推送

    最近在网上查了关于很多Android消息推送的资料,其中主要有四种方法. 1) 使用GCM服务(Google Cloud Messaging) 2) 使用XMPP协议(Openfire + Spark ...

  6. Android实现推送方式解决方案 - 长连接+心跳机制(MQTT协议)

    本文介绍在Android中实现推送方式的基础知识及相关解决方案.推送功能在手机开发中应用的场景是越来起来了,不说别的,就我们手机上的新闻客户端就时不j时的推送过来新的消息,很方便的阅读最新的新闻信息. ...

  7. Android推送服务——百度云推送

    一.推送服务简介 消息推送,顾名思义,是由一方主动发起,而另一方与发起方以某一种方式建立连接并接收消息.在Android开发中,这里的发起方我们把它叫做推送服务器(Push Server),接收方叫做 ...

  8. 海外 App 的推送服务,试试 FCM 吧!!!

    > **版权声明:** > > **本账号发布文章均来自公众号,承香墨影(cxmyDev),版权归承香墨影所有.** > > **每周会统一更新到这里,如果喜欢,可关注公 ...

  9. 【Android应用开发】 推送原理解析 极光推送使用详解 (零基础精通推送)

    作者 : octopus_truth 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/45046283 推送技术产生场景 : -- ...

随机推荐

  1. System.getProperty(String key)方法获取常用系统信息

    其中key可以为以下选项: 1.java.version Java 运行时环境版本 2.java.vendor Java 运行时环境供应商 3.java.vendor.url Java 供应商的 UR ...

  2. go 可变参数

    go 在参数列表中使用 ... 表示可变参数,例如: import "fmt" func Minimum(first int, others ...int) int { min : ...

  3. 【腾讯海纳】系统未发布时如何获取获取property_id在本地进行测试?

    有现成https协议域名使用者,可忽略此文. 直接先上图,明白的人看一眼图片就知道怎么拿了,如下所示: 解释说明: 在完成添加套件,以及测试应用的前提下,按如下操作流程: 1.访问路径:登录“海纳开发 ...

  4. js将一篇文章中多个连续的<br>标签替换成两个连续的<br>标签

    写本文的目的是今天恰好有一个之前做SEO的同事问我怎样把一篇文章中多个连续的br标签替换成两个连续的br标签,这里就牵涉到SEO层面的问题了. 在做SEO优化的时候,其中有一个需要注意的地方就是尽量减 ...

  5. TP框架下载功能

    namespace Home\Controller; use Think\Controller; use Org\Net\Http; class IndexController extends Con ...

  6. Markdown基础语法笔记

    # 一级标题## 二级标题### 三级标题###### #号之后记得加一个空格 仅支持1-6级标题  ### 列表 - 文本1 - 文本2 - 文本3+ 列表2* 列表2 ### 有序列表1. 有序文 ...

  7. group by 多个字段

    众所周知,group by 一个字段是根据这个字段进行分组,那么group by 多个字段的结果是什么呢?由前面的结论类比可以得到,group by 后跟多个子段就是根据多个字段进行分组 注:下面的例 ...

  8. Oracle 闪回 找回数据

    使用闪回技术,实现基于磁盘上闪回恢复区的自动备份与还原. 一.恢复表对象 1.创建学生表 create table STUDENT ( idno INTEGER, name VARCHAR2(30), ...

  9. OJ001

    #include<stdio.h> int main(){ int a,b; while (scanf("%d%d",&a,&b)!=EOF){ pri ...

  10. python 模型 ORM简介

    Django之ORM (Object Relational Mapping(ORM)一.ORM介绍1.ORM概念 对象关系映射模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术.2.OR ...