什么叫推送?

中文名称:推送

英文名称:push

定义:描述因特网内容提供者和因特网用户之间工作方式的术语。“推送”指因特网内容提供者定期向预订用户“提供”数据。

项目中有可能会用到推送。如果自己写一个的话,可是个耗时耗力的时,好在很多第三方公司都提供了推送服务,比如百度云。我们可以在自己的程序中使用它。

百度云推送

云推送(Push)是百度开放云向开发者提供的消息推送服务;通过利用云端与客户端之间建立稳定、可靠的长连接来为开发者提供向客户端应用推送实时消息服务。

百度云推送服务支持推送三种类型的消息:通知、透传消息及富媒体;支持向所有用户或根据标签分类向特定用户群体推送消息;支持更多自定义功能(如自定义内容、后续行为、样式模板等);提供用户信息及通知消息统计信息,方便开发者进行后续开发及运营。

百度hi官方技术讨论群:1405944 QQ群:242190646

云推送服务具有以下特点:

1. 增强用户粘性

通过云和端之间建立的长连接,可以实时的推送消息到达用户端。保持与用户的沟通,大大提升用户活跃度和留存率。

2. 节约成本

在省电省流量方面远超行业水平,基础的消息推送服务永久免费,大大节省开发者推送的成本。

3. 稳定安全的推送

强大的分布式集群长期为百度各大产品线提供推送服务,保证消息推送服务的稳定、可靠。

-------------------------------------------------------------

好吧,让我们看看如何来使用它。

百度云推送分两部分:web端和手机端。

我们先看下手机端如何做。

1.注册百度账户

2.加入 百度开发者

3.创建应用

4.下载sdk

5.导入sdk包,开发应用

5.1 在AndroidManifest.xml 中注册响应的receiver

5.2 在主窗体的oncreate中写

  1. PushManager.startWork(getApplicationContext(),
  2. PushConstants.LOGIN_TYPE_API_KEY,
  3. PushServiceUtils.getMetaValue(this, "api_key"));

5.3 编写自己的receiver。处理 绑定的相关消息,推送的消息,通知栏点击后的消息

  1. public class MyPushMessageReceiver extends BroadcastReceiver {
  2.  
  3. private static final String TAG = "BroadcastReceiver";
  4.  
  5. @Override
  6. public void onReceive(final Context context, Intent intent) {
  7.  
  8. Log.d(TAG, ">>> Receive intent: \r\n" + intent);
  9.  
  10. if (intent.getAction().equals(PushConstants.ACTION_MESSAGE)) {
  11. // 获取消息内容
  12. String message = intent.getExtras().getString(
  13. PushConstants.EXTRA_PUSH_MESSAGE_STRING);
  14.  
  15. // 消息的用户自定义内容读取方式
  16. Log.i(TAG, "onMessage: " + message);
  17.  
  18. // 自定义内容的json串
  19. Log.d(TAG,
  20. "EXTRA_EXTRA = "
  21. + intent.getStringExtra(PushConstants.EXTRA_EXTRA));
  22.  
  23. // 用户在此自定义处理消息,以下代码为demo界面展示用
  24. Intent responseIntent = null;
  25. responseIntent = new Intent(PushServiceUtils.ACTION_MESSAGE);
  26. responseIntent.putExtra(PushServiceUtils.EXTRA_MESSAGE, message);
  27. responseIntent.setClass(context, MainActivity.class);
  28. responseIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  29. context.startActivity(responseIntent);
  30.  
  31. } else if (intent.getAction().equals(PushConstants.ACTION_RECEIVE)) {
  32. // 处理绑定等方法的返回数据
  33. // PushManager.startWork()的返回值通过PushConstants.METHOD_BIND得到
  34.  
  35. // 获取方法
  36. final String method = intent
  37. .getStringExtra(PushConstants.EXTRA_METHOD);
  38. // 方法返回错误码。若绑定返回错误(非0),则应用将不能正常接收消息。
  39. // 绑定失败的原因有多种,如网络原因,或access token过期。
  40. // 请不要在出错时进行简单的startWork调用,这有可能导致死循环。
  41. // 可以通过限制重试次数,或者在其他时机重新调用来解决。
  42. int errorCode = intent.getIntExtra(PushConstants.EXTRA_ERROR_CODE,
  43. PushConstants.ERROR_SUCCESS);
  44. String content = "";
  45. if (intent.getByteArrayExtra(PushConstants.EXTRA_CONTENT) != null) {
  46. // 返回内容
  47. content = new String(
  48. intent.getByteArrayExtra(PushConstants.EXTRA_CONTENT));
  49. }
  50.  
  51. // 用户在此自定义处理消息,以下代码为demo界面展示用
  52. Log.d(TAG, "onMessage: method : " + method);
  53. Log.d(TAG, "onMessage: result : " + errorCode);
  54. Log.d(TAG, "onMessage: content : " + content);
  55. Toast.makeText(
  56. context,
  57. "method : " + method + "\n result: " + errorCode
  58. + "\n content = " + content, Toast.LENGTH_SHORT)
  59. .show();
  60.  
  61. Intent responseIntent = null;
  62. responseIntent = new Intent(PushServiceUtils.ACTION_RESPONSE);
  63. responseIntent.putExtra(PushServiceUtils.RESPONSE_METHOD, method);
  64. responseIntent.putExtra(PushServiceUtils.RESPONSE_ERRCODE,
  65. errorCode);
  66. responseIntent.putExtra(PushServiceUtils.RESPONSE_CONTENT, content);
  67. responseIntent.setClass(context, MainActivity.class);
  68. responseIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  69. context.startActivity(responseIntent);
  70.  
  71. // 可选。通知用户点击事件处理
  72. } else if (intent.getAction().equals(
  73. PushConstants.ACTION_RECEIVER_NOTIFICATION_CLICK)) {
  74. Log.d(TAG, "intent=" + intent.toUri(0));
  75.  
  76. // 自定义内容的json串
  77. String customData = intent
  78. .getStringExtra(PushConstants.EXTRA_EXTRA);
  79.  
  80. Log.d(TAG,
  81. "EXTRA_EXTRA = "
  82. + intent.getStringExtra(PushConstants.EXTRA_EXTRA));
  83.  
  84. if (customData == null || "".equals(customData)) {
  85. return;
  86. }
  87.  
  88. Intent aIntent = new Intent();
  89. aIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  90. aIntent.setClass(
  91. context,
  92. com.pdwy.wulianwang.mobile.main.notification.NotificationDetails_Activity.class);
  93. String title = intent
  94. .getStringExtra(PushConstants.EXTRA_NOTIFICATION_TITLE);
  95. aIntent.putExtra(PushConstants.EXTRA_NOTIFICATION_TITLE, title);
  96. String content = intent
  97. .getStringExtra(PushConstants.EXTRA_NOTIFICATION_CONTENT);
  98. aIntent.putExtra(PushConstants.EXTRA_NOTIFICATION_CONTENT, content);
  99.  
  100. String detailContent = "";
  101. try {
  102. org.json.JSONObject json = new JSONObject(customData);
  103. detailContent = json.getString("detailContent");
  104. } catch (JSONException e) {
  105. // TODO Auto-generated catch block
  106. e.printStackTrace();
  107. }
  108. // 保存在数据库
  109. NotifyDao dao = new NotifyDao();
  110. int notifyId = dao.saveNotify(title, content, detailContent);
  111. // 向消息详细页发送内容
  112. aIntent.putExtra("notify_id", notifyId);
  113.  
  114. context.startActivity(aIntent);
  115.  
  116. }
  117. }
  118. }

web端需要做什么

1.建立项目

2.下载skd,引入包 bccs-api-lib-1.0.jar

3.编写代码。

  1. /*
  2. * @brief 推送单播通知(Android Push SDK拦截并解析) message_type = 1 (默认为0)
  3. */
  4.  
  5. // 1. 设置developer平台的ApiKey/SecretKey
  6. String apiKey = "xxxxxxxxxxxxxxxxxx";
  7. String secretKey = "xxxxxxxxxxxxx";
  8. ChannelKeyPair pair = new ChannelKeyPair(apiKey, secretKey);
  9.  
  10. // 2. 创建BaiduChannelClient对象实例
  11. BaiduChannelClient channelClient = new BaiduChannelClient(pair);
  12.  
  13. // 3. 若要了解交互细节,请注册YunLogHandler类
  14. channelClient.setChannelLogHandler(new YunLogHandler() {
  15. @Override
  16. public void onHandle(YunLogEvent event) {
  17. System.out.println(event.getMessage());
  18. }
  19. });
  20.  
  21. try {
  22.  
  23. // 4. 创建请求类对象
  24. PushBroadcastMessageRequest request = new PushBroadcastMessageRequest();
  25. request.setDeviceType(3); // device_type => 1: web 2: pc 3:android
  26. // 4:ios 5:wp
  27.  
  28. // request.setMessage("Hello Channel");
  29. // 若要通知,
  30. request.setMessageType(1);
  31. request.setMessage("{\"title\":\"Notify_title_danbo\",\"description\":\"Notify_description_content\"}");
  32. //request.setMessage(notify.toString());
  33.  
  34. // 5. 调用pushMessage接口
  35. PushBroadcastMessageResponse response = channelClient
  36. .pushBroadcastMessage(request);
  37.  
  38. // 6. 认证推送成功
  39. System.out.println("push amount : " + response.getSuccessAmount());
  40.  
  41. } catch (ChannelClientException e) {
  42. // 处理客户端错误异常
  43. e.printStackTrace();
  44. } catch (ChannelServerException e) {
  45. // 处理服务端错误异常
  46. System.out.println(String.format(
  47. "request_id: %d, error_code: %d, error_message: %s",
  48. e.getRequestId(), e.getErrorCode(), e.getErrorMsg()));
  49. }

上面的代码就能发送一条通知到手机。支持自定义消息标题,描述,其他自定义内容。

--------------

选用百度是个比较简单实现的方式。截止2013-9-12,我没有找到相关的收费信息。本着学习的精神可以研究研究,不过应该也可以再实际项目中使用。

 

android开发(25) - 推送的实现,使用百度云推送的更多相关文章

  1. iOS_生成pem推送证书(用于百度云推送)

    具体步骤如下: 首先,需要一个pem的证书,该证书需要与开发时签名用的一致. 具体生成pem证书方法如下: 1. 登录到 iPhone Developer Connection Portal(http ...

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

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

  3. 消息推送之百度云推送Android集成与用法

    这两天因为项目须要.研究了一下百度云推送,本来这事没什么多大工作量的,但注冊百度开发人员账户创建应用令我蛋疼菊紧了好一阵,这些东西做了对技术没啥提升,不做又不行,必经之路. 好在我耗费了N多个毫毫秒秒 ...

  4. Android 高仿微信实时聊天 基于百度云推送

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38799363 ,本文出自:[张鸿洋的博客] 一直在仿微信界面,今天终于有幸利用百 ...

  5. Android推送 百度云推送 入门篇

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/27231237 现在app基本都有推送的功能,于是看了下百度云的推送,官方文档和D ...

  6. 消息推送之百度云推送Android集成与使用方法

    这两天由于项目需要,研究了一下百度云推送,本来这事没什么多大工作量的,但注册百度开发者账户创建应用令我蛋疼菊紧了好一阵,这些东西做了对技术没啥提升,不做又不行,必经之路.好在我耗费了N多个毫毫秒秒后稀 ...

  7. ecmobile实现支付宝支付和百度云推送遇到的问题及解决方案(android)

    1.首先检测支付账户是否开通快捷支付服务,如果开通后,那么公钥是否上传(支付宝问题一定要找支付宝客服解决,找其他人没有用,支付宝客服可以帮你分析底层原因) 2.修改app配置文件:alipay_cal ...

  8. 改写百度云推送SDK,PHP PEAR 包:Services_Baidu_Push

    iPhone使用apple push很方便,而Android很多厂商删除了google push,而且google在大陆连不上,所以要用别的办法. Android常见的推送服务商有:极光推送(http ...

  9. App之百度云推送

    集成SDK 下载最新的Android SDK压缩包并解压,在新建工程或已有工程中增加百度云推送功能. 我下载的是 ,里面有一个同名的文件夹,文件夹中有 导入云推送jar包和so文件: 将解压后的lib ...

随机推荐

  1. pyspark dataframe 常用操作

    spark dataframe派生于RDD类,但是提供了非常强大的数据操作功能.当然主要对类SQL的支持.   在实际工作中会遇到这样的情况,主要是会进行两个数据集的筛选.合并,重新入库.   首先加 ...

  2. 有用的 Mongo命令行 db.currentOp() db.collection.find().explain() - 摘自网络

    在Heyzap 和 Bugsnag 我已经使用MongoDB超过一年了,我发现它是一个非常强大的数据库.和其他的数据库一样,它有一些缺陷,但是这里有一些东西我希望有人可以早一点告诉我的. 即使建立索引 ...

  3. grafana 的面板设置

    1.工作中我们会计算连个字段的四则运算

  4. iOS求职之C语言面试题

    1.static有什么用途?(请至少说明两种) 1)限制变量的作用域 2)设置变量的存储域(堆,主动分配内存也是堆) 1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变.
 2)  ...

  5. 菜鸟学JS(三)——自动隐藏的悬浮框

    今天写一个小实例,用js和css写一个可以自动隐藏的悬浮框.css肯定是用来控制样式的,js用来控制器显示与隐藏的.显示与隐藏通常有两种方法实现:1,用js控制其显示属性:2,用js控制其大小. 今天 ...

  6. Effective Spark RDDs with Alluxio【转】

    转自:http://kaimingwan.com/post/alluxio/effective-spark-rdds-with-alluxio 1. 介绍 2. 引言 3. Alluxio and S ...

  7. 将本地代码同步到远程github上

    1.在本地文件夹下建立.gitignore文件,将github下的github/gitignore/Node.gitignore文件复制到.gitignore中: 2.执行命令git add . 3. ...

  8. 多媒体文件格式之TS

    [时间:2016-07] [状态:Open] TS流是MPEG-2标准中定义一种用于直播的码流结构,具有很好的容错能力.所有跟TS相关的标准可以从ISO/IEC_13818-1中找到. 通常TS流的后 ...

  9. std::bind()图解

    参考:http://blog.think-async.com/2010/04/bind-illustrated.html 避免链接失效,就把文中图转过来了,这几张就清楚的说明了bind的用法和原理.

  10. Mysql查看连接数相关信息

    MySQL查看连接数相关信息在 数据库:INFORMATION_SCHEMA 表:PROCESSLIST 表结构如下: mysql> desc PROCESSLIST; +---------+- ...