当前位置: 首页 > news >正文

彻底理解推送

一、概念

1、早期推送服务

   在移动互联网以前的手机,如果有事情发生要通知用户,则会弹出一个窗口,告诉用户正在发生的事,可能是未接电话提示、日历提醒或是一封彩信。推送功能最早是被用于Email中,而目前更多地被应用于App中。

2、推送

   一般地,当我们开发需要和服务器交互的应用程序时,基本上都需要获取服务器端的数据,而要获取服务器上不定时更新的信息一般有两种方法:

   (1)客户端pull(拉)的方式,就是隔一段时间就去服务器获取一下信息,看是否有更新的信息出现,即用户主动发起请求,向服务器获取数据;

   (2)服务器使用push(推)的方式,当服务器有新信息了,就把新的信息push到客户端上,这样,客户端就能自动的接受到消息,也就是服务器主动发送数据给客户端。

比较两种方式的优缺点:

   两种方式都能实现获取服务器端更新信息的功能,但明显地,push方式比pull方式好,因为pull方式更费客户端网络流量,要主动从服务器端获取最新信息,更主要的是耗费电量,App上还要有程序服务不停地检测服务端的变化。Push使用的场景有两个特点:时间不确定性和时效性,如发送团购信息/发送电子消费账单等。  

   一般地,利用推送只是告诉手机端服务器发生了某些改变,当客户端收到通知以后,应该主动到服务器获取最新的数据,这样才是推送服务的完整实现。

   一般情况下,客户端与服务器之间通讯客户端是主动的,但这就存在一个问题就是一旦服务器数据有更新或者服务器要下发通知给客户端只能等客户端连接的时候才能实现。这种方式使消息失去了实时性。

3、通知和消息的区别

   (1)通知:发送后会在系统通知栏收到展现,同时响铃或震动提醒用户。

   一般地,实现Android的消息通知栏,必须要用到两个类:NotificationManager和Notification,其中NotificationManager的初始化是通过getSystemService方法,并且通过notify方法来向Android系统发送消息栏通知和显示。   

   (2)消息:发送后不会在系统通知栏展示,SDK将消息传给第三方应用后需要开发者自己使用代码展示。

   开发者在接收到消息数据后,可以将解析出来的数据,显示在自定义的界面上,也就是说,可以自定义通知界面、提醒方式,以Notification的方式让用户看到该消息内容。

二、推送使用场景

三、原理

1、推送方案实现原理

   (1)轮询方式(pull): 客户端应用程序需阶段性的与服务器进行连接并查询是否有新的消息到达,你必须自己实现与服务器之间的通信,如消息排队等,并且还要考虑轮询的效率,太慢会导致消息的延迟,太快,会大量消耗网络带宽和电池。

   (2)SMS方式(push): 在Android平台上,可以通过拦截SMS消息并解析消息内容来了解服务器的意图,并获取其显示内容进行处理(???),其好处是可以实现完全的实时操作,但成本太高,需要向移动公司缴纳相应的费用。

   (3)持久连接(push): 可以解决轮询问题带来的性能问题,但还是会消耗手机电池。

相关文章:

  • CentOS7.2编译安装LNMP
  • 如何写3DMAX的插件
  • Centos7上安装tomcat
  • 论车牌识别与电子警察关系
  • hbase通过row key 的前缀查询记录
  • 《轻量级Java Web整合开发入门SSH》 - 快速理解Java框架的又一积木
  • PHP课程总结20161222
  • 画虚线
  • SFB 项目经验-09-用Lync 2013或Skype for Business 2015抢火车票
  • SEO优化---学会建立高转化率的网站关键词库
  • ★平衡法则在生活中的应用
  • (十五)使用Nexus创建Maven私服
  • 利用cmdline和gradle快速编译出apk
  • SOA和微服务
  • TreeMap按照value进行排序
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • bearychat的java client
  • Docker 笔记(2):Dockerfile
  • gulp 教程
  • JavaScript HTML DOM
  • Java程序员幽默爆笑锦集
  • Spring核心 Bean的高级装配
  • vue-loader 源码解析系列之 selector
  • 阿里云Kubernetes容器服务上体验Knative
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 听说你叫Java(二)–Servlet请求
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 用mpvue开发微信小程序
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • 自制字幕遮挡器
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • Java性能优化之JVM GC(垃圾回收机制)
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • 说说我为什么看好Spring Cloud Alibaba
  • ​Spring Boot 分片上传文件
  • # 透过事物看本质的能力怎么培养?
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (3)llvm ir转换过程
  • (Note)C++中的继承方式
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (四)Controller接口控制器详解(三)
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (转)nsfocus-绿盟科技笔试题目
  • .apk 成为历史!
  • .net 8 发布了,试下微软最近强推的MAUI
  • .net 发送邮件
  • .Net(C#)自定义WinForm控件之小结篇