android极光推送android实现怎么关闭推送

& 极光消息推送服务器端开发实现推送
极光消息推送服务器端开发实现推送
以前一直使用的极光的手动输入推送内容然后推送到客户端,今天遇到了推送频率比较高且比较有规律的内容,比如事实天气。这样就需要用我们自己的服务器来自动生成推送内容了。
在官方的SDK文档中找了半天,终于找到了有点类似的接口了,进去先看看:/pages/viewpage.action?pageId=2228302
可以看到,上面两句话很醒目,我们看看它封装的REST API是个什么东西,再点进去看看
上面两句话读了一下,看来我们的运气还不错,这个应该就是了。
好了我们进入上面的Java开发部分:/jpush/jpush-api-java-client
进去看了半天,大概明白意思了,已经帮助我们封装好了,现在我们只需要下载jar包和它提供的实例文档。
进去后发现又对RESI API进行了更详细的说明,比如参数、频率限制等。
好吧,我们看看推送消息和通知,如下图点击进入
进去之后就看到了真真需要的api接口了,这里有各个方法和参数的说明。如果有的朋友还觉得看不懂,简单,直接下载示例代码(抄袭谁不会啊)
我下载官方示例代码,新建立了一个项目如下:
消息发送端代码:
[java] view plaincopyprint?
package com.meritit.tuisong.
import java.util.HashM
import java.util.M
import cn.jpush.api.ErrorCodeE
import cn.jpush.api.IOSE
import cn.jpush.api.JPushC
import cn.jpush.api.MessageR
public class JPushClientExample {
private static final String appKey ="5d30bebd54861";
//必填,例如466ffb7bda89
private static final String masterSecret = "0e0cc80c6f6a4703bec9ed191";//"13ac09b1d8a1";//必填,每个应用都对应一个masterSecret
private static JPushClient jpush =
* 保存离线的时长。秒为单位。最多支持10天(864000秒)。
* 0 表示该消息不保存离线。即:用户在线马上发出,当前不在线用户将不会收到此消息。
* 此参数不设置则表示默认,默认为保存1天的离线消息(86400秒)。
private static long timeToLive =
60 * 60 * 24;
public static void main(String[] args) {
* Example1: 初始化,默认发送给android和ios,同时设置离线消息存活时间
* jpush = new JPushClient(masterSecret, appKey, timeToLive);
* Example2: 只发送给android
* jpush = new JPushClient(masterSecret, appKey, DeviceEnum.Android);
* Example3: 只发送给IOS
* jpush = new JPushClient(masterSecret, appKey, DeviceEnum.IOS);
* Example4: 只发送给android,同时设置离线消息存活时间
* jpush = new JPushClient(masterSecret, appKey, timeToLive, DeviceEnum.Android);
jpush = new JPushClient(masterSecret, appKey, timeToLive);
* 是否启用ssl安全连接, 可选
* 参数:启用true, 禁用false,默认为非ssl连接
//jpush.setEnableSSL(true);
//测试发送消息或者通知
testSend();
private static void testSend() {
// 在实际业务中,建议 sendNo 是一个你自己的业务可以处理的一个自增数字。
// 除非需要覆盖,请确保不要重复使用。详情请参考 API 文档相关说明。
int sendNo = getRandomSendNo();
String msgTitle = "+;//jpush\"\"";
String msgContent = "\\&;w\"\"a--【\npush】";
* IOS设备扩展参数,
* 设置badge,设置声音
Map&String, Object& extra = new HashMap&String, Object&();
IOSExtra iosExtra = new IOSExtra(10, "WindowsLogonSound.wav");
extra.put("ios", iosExtra);
//对所有用户发送通知, 更多方法请参考文档
MessageResult msgResult = jpush.sendCustomMessageWithAppKey(sendNo,msgTitle, msgContent);
//MessageResult msgResult
= jpush.sendNotificationWithAlias(sendNo, "a", msgTitle, msgContent);
//覆盖指定msgId的消息,msgId可以从msgResult.getMsgid()获取。
//MessageResult msgResult = jpush.sendNotificationWithAppKey(sendNo, msgTitle, msgContent, 0, extra,msgResult.getMsgid());
if (null != msgResult) {
System.out.println("服务器返回数据: " + msgResult.toString());
if (msgResult.getErrcode() == ErrorCodeEnum.NOERROR.value()) {
System.out.println(String.format("发送成功, sendNo= %s,messageId= %s",msgResult.getSendno(),msgResult.getMsg_id()));
System.out.println("发送失败, 错误代码=" + msgResult.getErrcode() + ", 错误消息=" + msgResult.getErrmsg());
System.out.println("无法获取数据");
public static final int MAX = Integer.MAX_VALUE;
public static final int MIN = (int) MAX/2;
* 保持 sendNo 的唯一性是有必要的
* It is very important to keep sendNo unique.
* @return sendNo
public static int getRandomSendNo() {
return (int) (MIN + Math.random() * (MAX - MIN));
执行结果如下:
消息接收端代码:
[java] view plaincopyprint?
package com.meritit.tuisong.
import java.util.L
import cn.jpush.api.JPushC
import cn.jpush.api.receive.ReceiveR
public class ReceiveClientExample {
private static final String appKey ="5d30bebd54861";
//必填,例如466ffb7bda89
private static final String masterSecret = "0e0cc80c6f6a4703bec9ed191";//"13ac09b1d8a1";//必填
public static void main(String[] args) {
JPushClient JPushClient = new JPushClient(masterSecret, appKey);
String msgId = "";
String[] msgIds = {"","",""};
//获取一条
ReceiveResult receiveResult =
JPushClient.getReceived(msgId);
if(receiveResult == null){
System.out.println("获取receive 数据失败!"+receiveResult);
//gson toJson 之后,NULL值的字段会被过滤掉
System.out.println("received result:"+receiveResult.toString());
// 获取多条
List&ReceiveResult& receiveResults = JPushClient.getReceiveds(msgIds);
if(receiveResults == null ){
System.out.println("获取receive 数据失败!");
System.out.println("成功获取了:"+receiveResults);
执行结果:
测试已经成功,下面我们来看看源代码是怎么做的,其他的其实只是数据封装,我们来看看关键的一句代码
[java] view plaincopyprint?
MessageResult msgResult = jpush.sendCustomMessageWithAppKey(sendNo,msgTitle, msgContent);
查看源代码,如下:
[java] view plaincopyprint?
public MessageResult sendCustomMessageWithAppKey(int sendNo, String msgTitle, String msgContent) {
CustomMessageParams p = new CustomMessageParams();
p.setReceiverType(ReceiverTypeEnum.APPKEYS);
return sendCustomMessage(p, sendNo, msgTitle, msgContent, null, null);
发现实际是调用的sendCustomMessage方法
[java] view plaincopyprint?
protected MessageResult sendCustomMessage(CustomMessageParams p, int sendNo, String msgTitle, String msgContent, String msgContentType, Map&String, Object& extra) {
if (null != msgContentType) {
p.getMsgContent().setContentType(msgContentType);
if (null != extra) {
p.getMsgContent().setExtra(extra);
return sendMessage(p, sendNo, msgTitle, msgContent);
这里进行了空值判断,实际又调用了sendMessage方法
[java] view plaincopyprint?
protected MessageResult sendMessage(MessageParams p, int sendNo, String msgTitle, String msgContent) {
p.setSendNo(sendNo);
p.setAppKey(this.getAppKey());
p.setMasterSecret(this.masterSecret);
p.setTimeToLive(this.timeToLive);
p.setSendDescription(this.getSendDescription());
for (DeviceEnum device : this.getDevices()) {
p.addPlatform(device);
if (null != msgTitle) {
p.getMsgContent().setTitle(msgTitle);
p.getMsgContent().setMessage(msgContent);
return sendMessage(p);
在这里将参数封装到消息对象中调用sendMessage
[java] view plaincopyprint?
protected MessageResult sendMessage(MessageParams params) {
return httpClient.sendPush(BaseURL.ALL_PATH, enableSSL, params);
再进到sendPush方法中看看,哦,大概明白了,实际上是用的http请求发送消息的。
[java] view plaincopyprint?
public MessageResult sendPush(final String path, final boolean enableSSL, final MessageParams messageParams) {
MessageResult messageResult = ValidateRequestParams.vidateParams(messageParams);
if(messageResult != null) return messageR
String pushResult = sendPost(path, enableSSL, parse(messageParams),RequestTypeEnum.PUSH.value(),null);
return gson.fromJson(pushResult, MessageResult.class);
关键看倒数第二行代码
[java] view plaincopyprint?
private String sendPost( String path, final boolean enableSSL, String params,Integer reqeustType,String authCode){
return sendRequest(path, enableSSL, params, "POST", reqeustType,authCode);
[java] view plaincopyprint?
private String sendRequest(String path, final boolean enableSSL, String params,String method,Integer reqeustType,String authCode){
HttpURLConnection conn =
DataOutputStream outStream =
StringBuffer sb = new StringBuffer();
if (enableSSL) {
initSSL();
URL url = new URL(BaseURL.getUrlForPath(path,enableSSL,reqeustType));
conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(DEFAULT_CONNECTION_TIMEOUT);
conn.setReadTimeout(DEFAULT_SOCKET_TIMEOUT);
conn.setUseCaches(false);
conn.setDoOutput(true);
conn.setRequestMethod(method);
conn.setRequestProperty("Connection", "Keep-Alive");
conn.setRequestProperty("Charset", CHARSET);
if(authCode != null && !authCode.isEmpty()){
conn.setRequestProperty("Authorization", authCode);
if(method.equals("POST")){
byte[] data = params.getBytes(CHARSET);
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
conn.setRequestProperty("Content-Length", String.valueOf(data.length));
outStream = new DataOutputStream(conn.getOutputStream());
outStream.write(data);
outStream.flush();
if (conn.getResponseCode() == 200) {
("Congratulations!The request was successful. response status is 200");
InputStream in = conn.getInputStream();
InputStreamReader reader = new InputStreamReader(in, CHARSET);
char[] buff = new char[1024];
while ((len = reader.read(buff)) & 0) {
sb.append(buff, 0, len);
logger.log(Level.WARNING,"Sorry!The request was fault. response " +
"status = "+conn.getResponseCode()+",errormsg = "+conn.getHeaderField(0));
String errmsg = "";
if(reqeustType == RequestTypeEnum.RECEIVE.value()){
errmsg = ErrorCodeEnum.errorMsg(conn.getResponseCode());
errmsg = errmsg == null ? conn.getHeaderField(0) :
errmsg = conn.getHeaderField(0);
BaseResult result = new BaseResult(errmsg,conn.getResponseCode());
return result.toString();
catch (SocketTimeoutException e) {
logger.log(Level.SEVERE,"God! the server throw SocketTimeout Exception." +
"please check it out the error message:"+e.getMessage());
BaseResult baseResult = new BaseResult(e.getMessage().toString(),ErrorCodeEnum.CONNECTIONTIMEOUT.value());
return baseResult.toString();
catch (ConnectException e) {
logger.log(Level.SEVERE,"God! the server throw Connect Exception ." +
"please check it out the error message:"+e.getMessage());
BaseResult baseResult = new BaseResult(e.getMessage().toString(),ErrorCodeEnum.CONNECTIONREFUSED.value());
return baseResult.toString();
catch (UnknownHostException e) {
logger.log(Level.SEVERE,"God! the server throw UnknownHost Exception ." +
"please check it out the error message:"+e.getMessage());
BaseResult baseResult = new BaseResult(e.getMessage().toString(),ErrorCodeEnum.CONNECTIONREFUSED.value());
return baseResult.toString();
catch (Exception e) {
logger.log(Level.SEVERE,"God! the server throw exception." +
"please check it out the error message:"+e.getMessage());
BaseResult baseResult = new BaseResult(e.getMessage().toString(),ErrorCodeEnum.UnknownException.value());
return baseResult.toString();
if (null != outStream) {
outStream.close();
} catch (IOException e) {
e.printStackTrace();
if (null != conn) {
conn.disconnect();
return sb.toString();
学过Android的朋友对这个应该很熟悉吧!比如里面的URL请求地址,看第9行代码
[java] view plaincopyprint?
URL url = new URL(BaseURL.getUrlForPath(path,enableSSL,reqeustType));
[java] view plaincopyprint?
static String getUrlForPath(final String path,boolean enableSSL,Integer type) {
return getHostname(enableSSL,type) +
[java] view plaincopyprint?
private static String getHostname(boolean enableSSL,Integer type) {
if(type == RequestTypeEnum.PUSH.value())
return enableSSL? HOST_NAME_SSL :HOST_NAME;
if(type == RequestTypeEnum.RECEIVE.value())
return enableSSL? RECEIVE_HOST_NAME:RECEIVE_HOST_NAME;
在这里进行判断,如果enableSSL为false则发送消息请求地址为HOST_NAME,实际上这个enableSSL在BaseClient类中默认为false
[java] view plaincopyprint?
public boolean enableSSL =
HOST_NAME就是官方文档中所说的默认请求地址:
[java] view plaincopyprint?
public static String HOST_NAME = ":8800";
[java] view plaincopyprint?
public static
String RECEIVE_HOST_NAME = ":443";
本文固定链接:
[上一篇][下一篇]
最新文章随机精彩热门排行
精彩内容获取超时,请稍候...
日志总数:3904 篇
评论总数:146 评
标签数量:4475 个
链接总数:4 条
建站日期:
运行天数:1586 天Android App消息推送集成指南 - 机智云
快速入门 ▾
应用开发 ▾
App 开源框架 ▸
App 开发 SDK ▸
设备接入 ▾
设备快速接入机智云 ▸
GAgent通讯模组使用教程 ▸
MCU代码自动生成服务介绍 ▸
开源套件Gokit资料 ▸
开发套件Arduino资料 ▸
更多接入指南 ▸
云API ▾
API/SDK使用教程 ▸
用户手册 ▾
接入亚马逊ECho教程 ▸
概述机智云APP开源框架集成了百度推送与极光推送功能,只需修改部分代码即可快速使用。本文档就如何基于机智云APP开源框架快速集成消息推送功能,如需了解开源框架,请参考快速入门的文档。
快速集成极光推送1.申请极光AppKey与Master Secret开发者需要根据框架包名在极光官网上创建应用并填写相应信息,如下所示:
1).查看框架包名
2).在极光平台创建应用
3).查看对应的AppKey和Master Secret
2.在云端绑定第三方推送2.1.申请开通D3 Engine1.查看D3 Engine
2.开通服务
开通D3 Engine需要机智云审核通过,点击开通服务后需要联系机智云FAE协助审核开通。
2.2.云端绑定极光推送通过审核后,可以在服务一栏看到D3 Engine,依次点击“配置”-&” 编辑推送平台”
将在极光申请的对应信息填写到下图所示的位置,并点击绑定。
下图所示表示成功绑定了极光推送
2.3.利用D3 Engine创建推送规则
点击项目列表-&新建项目,下面将演示创建一个设备上线后给APP推送消息的规则。
拖动“设备数据”框到右边空白处,并双击该栏目。
将触发方式设为“设备上线”,点击确定。
双击“APP推送”,并设置推送的内容。
点击“保存”,保存推送规则
下图表示成功保存推送规则
3.修改UIConfig.json代码1、填写机智云app_id与product_key并修改push_type
4.修改AndroidManifest.xml将图3中的APP KEY填写到AndroidManifest.xml中的对应的代码中。
5.启动虚拟设备
6.部署APP运行通过以上步骤,该APP已具备了极光推送功能,部署到手机上后,申请帐号并登录,通过扫码即可绑定云端的虚拟设备。
7.测试推送功能关闭虚拟设备后,再次开启,即可看到手机收到了推送消息。
快速集成百度推送1.申请百度API KEY根据框架包名在百度官网上创建应用并填写相应信息,如下图:
查看对应的API KEY和SECRET KEY
2.在云端绑定第三方登录2.1.申请开通D3 Engine该步骤可以参考《快速集成极光推送》的2.1部分。
2.2.云端绑定百度推送
将百度申请的对应信息填写到下图所示的位置,并点击绑定。
下图表示成功绑定了百度推送。
2.3.利用D3 Engine创建推送规则该步骤可以参考《快速集成极光推送》的2.3部分
3.修改UIConfig.json代码填写app_id、app_secret、product_key,修改push_type为2,并将图24对应的key填入到对应的位置
4.启动虚拟设备该步骤可以参考。
5.部署APP运行通过以上步骤,该APP已具备了百度推送功能,部署到手机上后,申请帐号并登录,通过扫码即可绑定云端的虚拟设备。
6.测试推送功能关闭虚拟设备后,再次开启,即可看到手机收到了推送消息。
常见问题FAQ1、开发者一定要开通D3 Engine才能使用消息推送吗?解答:是的,目前D3 Engine只针对于企业开发者用户。所以,只有企业开发者才能申请开通使用。
2、使用极光推送按照以上步骤完成代码修改,但是却无法收到推送消息。
解答:可按照以下步骤进行排查
APP包名是否已修改,默认包名为“com.gizwits.opensource.appkit”。如果包名已被修改,则需要在AndroidManifest.xml中修改对应位置的信息。可参考极光文档:
修改了相应信息后,需要测试利用极光平台给APP单独推送消息是否成功,只有极光单推成功才能收到机智云推送消息。
极光单推成功,但是APP还是无法收到消息。
确认云端成功绑定了极光的App Key和Master Secret
确认云端成功创建了规则。
以上两步都确认无误后,还是无法收到消息,则查看如下代码:
查看下JPushInterface.setAlias方法回调的Result值是否为0,不为0则表示设置极光别名失败,需要重新调用该方法设置别名。
查看didChannelIDBind回调接口中Result的值是否为GIZ_SDK_SUCCESS,根据提示的代码重新调试代码。关于自定义推送的科普【android开发吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:116,838贴子:
关于自定义推送的科普收藏
推送在android设备上面 基本上每一个APP都会用到,用来推送自己制定的消息,比如:淘宝,每天都会发布的一些最新的优惠价格商品,来吸引客户的注意力,,这个技术也是我们APP上面不可或缺的知识点...当我们的APP刚开始上线,这个时候你可能会引用第三方的极光推送..如果你的APP用户量达到了50万,这个时候你还会用第三方的吗?? 不能吧! 如果我想要推送一些内部的消息,这些我不可能暴露在第三方平台上吧!所以这个时候 就需要我们搭建自定义推送平台了,,,如果你提前学习了,提前做了这样的技能储备, 那么当你在用到的时候就不会说因为时间紧,让自己手忙脚乱的...
带你全面掌握开发技术,不需你有多么深的技术积累,利用第三方轻松的实现项目开发!行业大牛经验倾囊相授!求职,加薪等实用编程技能,慕课网应有尽有!
那么我讲的这次实训就是针对这几点..
第一: 教会你搭建服务器和客户端 1.推送流程原理分析
2.业务流程原理分析 3.客户端实现推送 4.搭建服务器 5.创建数据库 6.数据库查询实现登陆 7.注册别名至服务器 8.根据需求推送指定APP第二: 教会你怎么保持长连接发送心跳包 1.长连接概念分析:介绍三次握手及四次挥手 2.搭建自定义服务器推送消息 3.客户端接收消息 4.客户端发送心跳包 5.服务器接收心跳包第三: 教会你如何自定义别名推送和标签推送 1.客户端注册别名,注册标签 2.服务器处理别名消息,处理标签消息 3.网页端客户端进行配置 4.服务器推送消息
下面为大家介绍我们这次的实训实训名称:企业级项目核心模块搭建自定义推送服务器实训时间:日-8月24日(3天)上课时间:晚上8:30-11:30实训课时:9个课时实训费用:8.8元实训主讲:Tony老师ps:(在线直播课程三天)
或者直接加(我)报名学习
加交流学习pps:
登录百度帐号推荐应用问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
如何取出极光推送的通知的内容,我试了好久,找不到怎么取出来,我是想取出所有的消息的内容,保存到本地自定义的消息中心。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
你打印下返回的json格式String,如果有值说明是你的取值方法有问题了,试试fastJson或者GSON
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(action)) {
Bundle extras = intent.getExtras();
if (null == extras)
String title = extras.getString(JPushInterface.EXTRA_TITLE);
String message = extras.getString(JPushInterface.EXTRA_MESSAGE);
String extraJson = extras.getString(JPushInterface.EXTRA_EXTRA);
LogUtils.d("Message title : " + title);
LogUtils.d("Message content : " + message);
LogUtils.d("Message extraJson : " + extraJson);
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
我也遇到了这个问题,是这样取出通知的内容的:String result = bundle.getString(JPushInterface.EXTRA_ALERT);
同步到新浪微博
分享到微博?
你好!看起来你挺喜欢这个内容,但是你还没有注册帐号。 当你创建了帐号,我们能准确地追踪你关注的问题,在有新答案或内容的时候收到网页和邮件通知。还能直接向作者咨询更多细节。如果上面的内容有帮助,记得点赞 (????)? 表示感谢。
明天提醒我
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:}

我要回帖

更多关于 android 极光推送教程 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信