因为项目是非大陆的手机项目,所以当要使用到消息推送的时候,百度了一下,国内的消息方案可以是:

1.百度云推送。也确实很快就可以搭建客户端和服务端,加载他的sdk,大概花了半个小时,就可以在手机端收到推送的消息。不过我想说说缺点,很多时候,消息推送过来延迟很严重,果然免费的没有好的质量,这一点学习到了,即使是大平台没有利益的驱使,呵呵,有点偏题了,还有一个重要的原因是在国外百度云推送肯定是不能使用的,这个方案取消。

2.极光推送,由于验证过海外是否可以使用,没有购买过付费的版本,也就不评论了。极光推送免费的搭建则比百度来的更快,大概花了10分钟就可以搭建完,并很快收到消息,并且有一点比百度好用的是不用专门去运行客户端拿到固定ID,极光只要安装了它的SDK的设备,都可以在控制台收到消息。当然了,因为不确定海外是否可用,我也放弃了。

注:关于上述两种推送方案的教程请进到他们的官方网站,下载文档和源码,可以体验一下,这里就不介绍了。

3.本文的重点来了,第三种方案就是谷歌google平台,在前几年推出的GCM消息推送机制,GCM全称Google Cloud Messaging,关于这个机制的架构设计理念,我就不说了,可以自行百度一下,大概就是设备注册了之后,发送给谷歌的云服务并保留,当有消息时,本地服务器将消息发送给谷歌服务器,然后谷歌向注册过的设备发送消息。(有理解的错误,可以去官方查看详细解释,传送门在此:谷歌官网GCM图解(需要使用VPN访问谷歌的官网,请没有VPN的同学自己想办法了,我无能为力,公司给我专门购买的VPN)。

=============================分割线,以下是在手机上增加谷歌GCM消息推送机制的详细教程,纯手打,尊重劳动成果===========================

使用GCM消息推送机制的大前提如下:

1.由于大陆屏蔽谷歌的服务,所以需要的前提是购买一个VPN,能够访问谷歌GCM云服务器,如果没有这个最最基本的条件,下面的内容都是建立在此基础上,如下图:

2.第2个最关键的前提条件是有一个google 开发者账号,有了vpn之后,到谷歌官网注册一个开发者账号,需要使用信用卡25美元购买,两天之后就可以使用,注册开发者账号主要是拿到程序的ID和最关键的每个开发者拥有的API,参考如下谷歌官方介绍注册流程:谷歌开发者账号注册流程,网上的很多创建create project都过时了,现在谷歌有新版的界面,不过过程也差不多,只不过界面和操作不一样了而已,如下图:

A.登陆你的谷歌账号,建立一个活动也就是project,网址传送门:谷歌开发者个人中心,这个网站是:https://console.developers.google.com/,别进到别的谷歌网站上,否则是无法创建应用程序的,如图:

建好一个活动之后,会有一个ID号,这是区分每个活动project也就是中文的程序的唯一识别号,保存它,因为后续推送消息服务需要使用到它。

B.建好一个project之后,需要拿到一个凭证(谷歌叫做凭证,也就是我说的最重要的API KEY,后面的应用程序,谷歌推送服务必须使用它来识别设备和发送消息,务必保存,如下图:

C.拿到API Key你就可以开始你的谷歌推送服务之旅了,具体的使用过程有明白的可以问我,我也是被网上以前的教程误导的很厉害,总觉得新界面这个没有那个没有,就是那个create project一开始就没明白,怎么改版之后变成了活动,这些中文的翻译害死人。还有那个api key,怎么就翻译成了凭证,一开始怎么找也找不到。

3.具备了上述的条件,下面的一步是有一台内置了谷歌google play 服务的手机,一个很不幸的消息是如果你觉得你手上的红米、锤子、乐视或者等等国产手机,谷歌服务是被剔除了的,那么这些真机是无法使用,换句话说配置好了服务端和客户端,消息还是接收不到,谷歌的推送GCM服务都是建立在基本的谷歌服务上面的,但别担心,有一个东西叫做模拟器。我说下我使用模拟器碰到的问题:

A.如果使用eclipse ADT内置的服务器,那么需要你的模拟器有google api,你的android 系统有这个服务,如下图:

这个其实很简单,启动sdk manager,选择android 4.3以上全部未安装的api就可以了,安装好之后,就是启动一个android 模拟器了,选中刚才你下载的android api版本,新建一个,如下图:

c.创建好之后就可以了。不过后面我会告诉你 eclipse ADT自带的模拟器有一个很严重的问题:第一运行实在太卡太慢

4.   第四个大前提就是模拟器或者手机,必须使用邮箱或者设置里面的添加账号,加入刚刚注册好的谷歌账号,否则无法使用谷歌推送服务以及你要玩的谷歌应用市场的游戏,如下图:

输入你的谷歌账号,添加完成之后,就可以使用了,如下图:

5.由于自带的模拟器速度实在无法忍受,最后选择了Bluestacks模拟器,速度实在是快的惊人,而且可以happy流畅的玩游戏,截图给你们看看,gif图片太大了,无法上传:

B.添加谷歌账号,如图:

输入你的谷歌账号,建好之后,一切准备工作都已经准备完成,就可以开心的正式进入谷歌gcm消息推送开发了。

=========================================分割线,谷歌android gcm 消息推送开发正式流程==============================================

1.开发android 客户端,参考链接,感谢这位前辈:Android 消息推送gcm之客户端

2.开发android 服务器端java版本具体流程:参考链接,还是这位前辈一篇博文:Android 消息推送gcm之java服务端

本着不重复造轮子的精神,csdn有两篇博文实在写的太详细太专业,以至于我也不想重复啰嗦的进行陈列了,也有源代码例子,只要具备上述的所有前提条件,运行客户端和服务端程序,替换掉project ID和API KEY,就可以顺利的收到google 推送的消息,截图如下:

服务端运行之后,会打印出一个注册ID,也就是每台设备的注册ID,接着在bluestacks模拟器运行的你加入推送消息服务的程序就会收到消息,如下图:

红色模糊的部分是为了公司保密所需要,我的测试代码就不上传了,提供前辈的例子链接,他的博文里面也有,如下链接:

客户端代码:客户端代码csdn下载链接

服务端代码:服务端谷歌推送代码csdn下载链接

至此所有谷歌推送服务gcm的流程就走完了,不过上述测试代码只是支持发送单一设备的,需要每次添加注册的设备号到服务端,修改之后才能发送到特定设备,存在极大缺陷,后续的按组发送的功能代码,等项目完成之后,会贴出关键代码,敬请期待!!!请尊重劳动成功,转载请注明出处,欢迎探讨。

===========================分割线,上述前辈实现的是发送单个设备的方法,我更新代码,可以发送多个设备==================

package com.ives.server;import java.io.IOException;
import java.util.ArrayList;
import java.util.List;import com.google.android.gcm.server.Constants;
import com.google.android.gcm.server.Message;
import com.google.android.gcm.server.MulticastResult;
import com.google.android.gcm.server.Result;
import com.google.android.gcm.server.Sender;public class Main {private static final String apiKey = "AIzaSyDIqNvArRmXFdpSnbvJU1u0lYyY63jrbzY";//private static String deviceRegId = "APA91bHwe5H3Ihl-fKWIdXjq-xS76NLAOqpyt3IViUHVflyONw_xsfzbL69pRV_0FMEVVgCjKMEMLLDjOs4GTqR9t83ckzmG6nQDtjl4ZMFzNrFwar5GPue-J9vyNRjBdasLJEFo9AVZ";private static String deviceRegId = "APA91bHkqE9t5TwC3jusIKihNorDwzqlxidIndzE3WqkN7VwY2YOMclWt89AuO6sEtvlWhU6zQ8ktD6igatUru93i_KmVzbfDa4MzgrXwiVI-Hdn4aVPRgdTyvJLNq_JQPb-bgV63x7Y";/*** @param args*/public static void main(String[] args) {List<String> list = new ArrayList<String>();list.add("APA91bHwe5H3Ihl-fKWIdXjq-xS76NLAOqpyt3IViUHVflyONw_xsfzbL69pRV_0FMEVVgCjKMEMLLDjOs4GTqR9t83ckzmG6nQDtjl4ZMFzNrFwar5GPue-J9vyNRjBdasLJEFo9AVZ");list.add("APA91bHkqE9t5TwC3jusIKihNorDwzqlxidIndzE3WqkN7VwY2YOMclWt89AuO6sEtvlWhU6zQ8ktD6igatUru93i_KmVzbfDa4MzgrXwiVI-Hdn4aVPRgdTyvJLNq_JQPb-bgV63x7Y");Sender sender = new Sender(apiKey);Message message = new Message.Builder().addData("看看是否能接收到消息", "呵呵").build();//Result result = null;MulticastResult resultMulti = null;try {//result = sender.send(message, deviceRegId, 5);//public MulticastResult send(Message message, List<String> regIds, int retries) throws IOException {resultMulti = sender.send(message, list, 5);System.out.println(resultMulti.getMulticastId());System.out.println(resultMulti.getRetryMulticastIds());System.out.println(resultMulti.getSuccess());} catch (IOException e) {e.printStackTrace();}}}

运行结果:

8307243719071538299
[]
0

2.前辈的代码每次发送过来的信息都是系统默认的,所以肯定需要定制,修改服务端代码为:

package com.ives.server;import java.io.IOException;
import java.util.ArrayList;
import java.util.List;import com.google.android.gcm.server.Constants;
import com.google.android.gcm.server.Message;
import com.google.android.gcm.server.MulticastResult;
import com.google.android.gcm.server.Result;
import com.google.android.gcm.server.Sender;public class Main {private static final String apiKey = "AIzaSyDIqNvArRmXFdpSnbvJU1u0lYyY63jrbzY";//private static String deviceRegId = "APA91bHwe5H3Ihl-fKWIdXjq-xS76NLAOqpyt3IViUHVflyONw_xsfzbL69pRV_0FMEVVgCjKMEMLLDjOs4GTqR9t83ckzmG6nQDtjl4ZMFzNrFwar5GPue-J9vyNRjBdasLJEFo9AVZ";private static String deviceRegId = "APA91bHkqE9t5TwC3jusIKihNorDwzqlxidIndzE3WqkN7VwY2YOMclWt89AuO6sEtvlWhU6zQ8ktD6igatUru93i_KmVzbfDa4MzgrXwiVI-Hdn4aVPRgdTyvJLNq_JQPb-bgV63x7Y";/*** @param args*/public static void main(String[] args) {List<String> list = new ArrayList<String>();list.add("APA91bHwe5H3Ihl-fKWIdXjq-xS76NLAOqpyt3IViUHVflyONw_xsfzbL69pRV_0FMEVVgCjKMEMLLDjOs4GTqR9t83ckzmG6nQDtjl4ZMFzNrFwar5GPue-J9vyNRjBdasLJEFo9AVZ");list.add("APA91bHkqE9t5TwC3jusIKihNorDwzqlxidIndzE3WqkN7VwY2YOMclWt89AuO6sEtvlWhU6zQ8ktD6igatUru93i_KmVzbfDa4MzgrXwiVI-Hdn4aVPRgdTyvJLNq_JQPb-bgV63x7Y");Sender sender = new Sender(apiKey);Message message = new Message.Builder().addData("message", "google").build();//Result result = null;MulticastResult resultMulti = null;try {//result = sender.send(message, deviceRegId, 5);//public MulticastResult send(Message message, List<String> regIds, int retries) throws IOException {resultMulti = sender.send(message, list, 5);System.out.println(resultMulti.getMulticastId());System.out.println(resultMulti.getCanonicalIds());System.out.println(resultMulti.getResults());} catch (IOException e) {e.printStackTrace();}//为空,则消息未发送给任何设备if (resultMulti.getResults() != null) {int canonicalRegId = resultMulti.getCanonicalIds();//用户注册了新的注册id,或者谷歌服务器刷新了注册id。//用户注册了新id,旧的id会被保存一段时间。此时使用旧id发送消息,设备即使已使用新id,依然可以收到} else {}}}

在客户端GCMIntentService.java接收消息的类修改为,其实就是使用intent的bundle类来接收消息,如下代码:

@Overrideprotected void onMessage(Context context, Intent intent) {Log.i(TAG, "Received message");Bundle bData = intent.getExtras();// 處理 bData 內含的訊息// 在本例中, 我的 server 端程式 gcm_send.php 傳來了 message, campaigndate, title,// description 四項資料String message = bData.getString("message");Log.i(TAG, "Received message");// String message = getString(R.string.gcm_message);displayMessage(context, message);// notifies usergenerateNotification(context, message);}

//==========================================分割线2016年5月18日10:28:31=====================================================

当后面想再加平板项目的谷歌gcm的时候,找建立project的网站花了好长时间,记录一下网站,主要是搜谷歌开发者后台:https://play.google.com/apps/publish/?hl=zh&dev_acc=14503070423488587985#ServicesAndApisPlace:p=tmp.14503070423488587985.1446424805266

2015最新最全 Android 谷歌消息推送GCM 详细使用教程相关推荐

  1. Android端消息推送总结:实现原理、心跳保活、遇到的问题等

    前言 最近研究Android推送的实现, 研究了两天一夜, 有了一点收获, 写下来既为了分享, 也为了吐槽. 需要说明的是有些东西偏底层硬件和通信行业, 我对这些一窍不通, 只能说说自己的理解. 为什 ...

  2. Android App消息推送 实现原理

    https://www.jianshu.com/p/b61a49e0279f 1.消息推送的实质 实际上,是当服务器有新消息需推送给用户时,先发送给应用App,应用App再发送给用户 2. 作用 产品 ...

  3. C# .Net 小程序消息推送配置+详细代码

    C# .Net 小程序消息推送配置+详细代码 首先在微信公众平台登录小程序账号    第一步登陆    登录后,在首页-功能-订阅信息,打开后如未进行配置,需要进行后台配置.    第二步:填写服务器 ...

  4. 基于openfire+smack的Android、消息推送服务

    前言 Java领域的即时通信的解决方案可以考虑openfire+spark+smack.当然也有其他的选择. Openfire 是基于Jabber协议(XMPP)实现的即时通信服务器端版本,目前建议使 ...

  5. android热门消息推送横向测评![转]

    关于这个话题,已经不是什么新鲜事了.对于大多数中小型公司一般都是选择第三方的服务来实现.但是现在已经有很多提供推送服务的公司和产品,如何选择一个适合自己项目的服务呢?它们之间都有什么差别?在此为大家做 ...

  6. Android 生态消息推送平台介绍

    一.手机厂商平台 华为消息推送服务 华为推送(Push)是为开发者提供的消息推送平台,建立了从云端到手机端的消息推送通道,使应用可以将最新信息及时通知用户,从而构筑良好的用户关系,提升用户的感知和活跃 ...

  7. Android之消息推送实现

    在开发Android和iPhone应用程序时,我们往往需要从服务器不定的向手机客户端即时推送各种通知消息,iPhone上已经有了比较简单的和完美的推送通知解决方案,可是Android平台上实现起来却相 ...

  8. android热门消息推送横向测评!

    关于这个话题,已经不是什么新鲜事了.对于大多数中小型公司一般都是选择第三方的服务来实现.但是现在已经有很多提供推送服务的公司和产品,如何选择一个适合自己项目的服务呢?它们之间都有什么差别?在此为大家做 ...

  9. Android消息推送:第三方消息推送平台详细解析

    前言 消息推送在Android开发中应用的场景是越来越多了,比如说电商产品进行活动宣传.资讯类产品进行新闻推送等等,如下图: 本文将介绍Android中实现消息推送的第三方推送的详细解决方案 阅读本文 ...

最新文章

  1. CentOS7定制封装发行版-基于CentOS minimal
  2. 微信小程序 - this.triggerEvent()
  3. [leedcode][409][java]
  4. 计算机四级软件工程知识点,计算机四级考试题库及搜题软件,送一份备考指南给大家!...
  5. 微信开源项目讲解使用公开课
  6. SpringCloud与SpringConfig分布式配置中心
  7. SpringBoot2.0之三 优雅整合Spring Data JPA
  8. mysql的分页存储过程,能够传出总记录数
  9. ios测试游戏用什么软件,《超维对决》iOS测试安装说明
  10. frame边框阴影html,CSS阴影效果的比较之drop-Shadow与box-Shadow
  11. 防止跨站攻击——CSRFToken
  12. 网站搜索引擎优化外链工具
  13. 嵌入式单片机知识点汇总(持续更)
  14. 安装vue最新脚手架
  15. 数美滑块,js逆向:★★★★
  16. Spring——Spring两大特性:IOC+AOP
  17. OBS 相芯美颜 之 美颜SDK介绍
  18. PHP 抓取接口和网页(爬取方式)
  19. Centos7安装freeswitch-1.10.8(2023)
  20. regular expression grammer

热门文章

  1. mysql 分表 条件查询_mysql分表+查询
  2. Php斐波那契数列尾递归优化,递归优化的这三种方式你知道吗?
  3. svn迁移到git实际操作(亲测有效)
  4. 库函数和c语言的关系,C语言与C语言库函数是什么关系
  5. 针尖上带着脚镣跳舞的widget
  6. Hook API(挂钩API)技术
  7. linux(Ubuntu) 创建文件的命令
  8. 3D面具破解人脸识别?这事儿没那么简单……
  9. 关于C语言内存移动函数的写法详解
  10. 90%创业者都不会有效表达,如何成为另外的10%?