Android中极光推送
一、 概念:
极光推送(JPush)是一个端到端的推送服务,使得服务器端消息能够及时地推送到终端用户手机上,让开发者积极地保持与用户的连接,从而提高用户活跃度、提高应用的留存率。极光推送客户端支持 Android, iOS 两个平台。
1.主要功能
(1)保持与服务器的长连接,以便消息能够即时推送到达客户端
(2)接收通知与自定义消息,并向开发者App 传递相关信息
2.主要特点
(1)客户端维持连接占用资源少、耗电低
(2)SDK丰富的接口,可定制通知栏提示样式
(3)服务器大容量、稳定
二、 极光推送技术原理:移动无线网络长连接
1.为了保证数据能及时到达客户端。常用的方法有2种。
(1)定时去服务器上查询数据,也叫Polling,
(2)手机跟服务器之间维护一个 TCP 长连接,当服务器有数据时,实时推送到客户端,也就是我们说的 Push。电量、流量和数据送达的及时性来说,Push 都会有明显的优势,Push 的实现和维护成本相对较高。移动无线网络的特点
2. Android 平台上长连接的实现
因为 IP v4 的 IP 量有限,运营商分配给手机终端的 IP 是运营商内网的 IP,手机要连接 Internet,就需要通过运营商的网关做一个网络地址转换(Network Address Translation,NAT)。简单的说运营商的网关需要维护一个外网 IP、端口到内网 IP、端口的对应关系,以确保内网的手机可以跟 Internet 的服务器通讯。
NAT 功能由图中的 GGSN 模块实现。大部分移动无线网络运营商都在链路一段时间没有数据通讯时,会淘汰 NAT 表中的对应项,造成链路中断。Android 平台上长连接的实现,为了不让 NAT 表失效,我们需要定时的发心跳,以刷新 NAT 表项,避免被淘汰。Android 上定时运行任务常用的方法有2种,一种方法用 Timer,另一种是AlarmManager。Android 的 Timer 类可以用来计划需要循环执行的任务,Timer 的问题是它需要用 WakeLock 让 CPU 保持唤醒状态,这样会大量消耗手机电量,大大减短手机待机时间。这种方式不能满足我们的需求。AlarmManager 是 Android 系统封装的用于管理 RTC 的模块,RTC (Real Time Clock) 是一个独立的硬件时钟,可以在 CPU 休眠时正常运行,在预设的时间到达时,通过中断唤醒 CPU。这意味着,如果我们用 AlarmManager 来定时执行任务,CPU 可以正常的休眠,只有在需要运行任务时醒来一段很短的时间。极光推送的 Android SDK 就是基于这种技术实现的。
3.服务器设计
当有大量的手机终端需要与服务器维持长连接时,对服务器的设计会是一个很大的挑战。针对这个问题,我们专门成立了一个项目,命名为C2000K,顾名思义,我们的目标是单机维持200万个长连接。最终我们采用了多消息循环、异步非阻塞的模型,在一台双核、24G内存的服务器上,实现峰值维持超过300万个长连接。只要 JPush 的网络连接是正常的,则:JPush 收到消息一定是及时的。其延迟是秒级的,一般在 1 秒之内。如果超过 10 秒,则一定是客户端网络出了问题。手机休眠时,也能够及时地收到推送消息。
三、Android SDK 概述
开发者集成 JPush Android SDK 到其应用里,JPush Android SDK 创建到 JPush Cloud 的长连接,为 App 提供永远在线的能力。
当开发者想要及时地推送消息到达 App 时,只需要调用 JPush API 推送,或者使用其他方便的智能推送工具,即可轻松与用户交流。
图中红色部分,是 JPush 与 App 开发者的接触点。手机客户端侧,App 需要集成 JPush SDK;服务器端部分,开发者调用 JPush REST API 来进行推送。
四、 Android SDK 集成指南
一、极光推送SDK集成步骤:
1.导入SDK开发包到你自己的应用程序项目
(1)登陆后,创建应用
(2)下载SDK
(3)创建一个新应用
A.将SDK中的JAR包拷入项目。
复制动态库文件
复制res下drawble中的文件到项目中,复制layout文件夹下的东西到项目中。
2.配置AndroidMainfest.xml文件
A.配置权限:
<!-- Required -->
<permission
android:name="com.example.j.permission.JPUSH_MESSAGE"
android:protectionLevel="signature"/>
<!-- Required -->
<uses-permission android:name="com.example.j.permission.JPUSH_MESSAGE"/>
<uses-permission android:name="android.permission.RECEIVE_USER_PRESENT"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
B:配置application中的内容
<!-- Required SDK核心功能-->
<receiver
android:name="cn.jpush.android.service.PushReceiver"
android:enabled="true">
<intent-filter android:priority="1000">
<action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED_PROXY"/>
<category android:name="您应用的包名"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.USER_PRESENT"/>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
</intent-filter>
<!-- Optional -->
<intent-filter>
<action android:name="android.intent.action.PACKAGE_ADDED"/>
<action android:name="android.intent.action.PACKAGE_REMOVED"/>
<data android:scheme="package"/>
</intent-filter>
</receiver>
<!-- Required SDK核心功能-->
<activity
android:name="cn.jpush.android.ui.PushActivity"
android:configChanges="orientation|keyboardHidden"
android:theme="@android:style/Theme.NoTitleBar"
android:exported="false">
<intent-filter>
<action android:name="cn.jpush.android.ui.PushActivity"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="您应用的包名"/>
</intent-filter>
</activity>
<!-- Required SDK核心功能-->
<service
android:name="cn.jpush.android.service.DownloadService"
android:enabled="true"
android:exported="false">
</service>
<!-- Required SDK核心功能-->
<receiver android:name="cn.jpush.android.service.AlarmReceiver"/>
C:复制元数据部分
<!-- Required SDK核心功能-->
<receiver android:name="cn.jpush.android.service.AlarmReceiver"/>
<!-- Required. For publish channel feature -->
<!-- JPUSH_CHANNEL 是为了方便开发者统计APK分发渠道。-->
<!-- 例如: -->
<!-- 发到 Google Play 的APK可以设置为 google-play; -->
<!-- 发到其他市场的 APK 可以设置为 xxx-market。 -->
<!-- 目前这个渠道统计功能的报表还未开放。-->
<meta-data android:name="JPUSH_CHANNEL"android:value="developer-default"/>
<!-- Required. AppKey copied from Portal -->
<meta-data android:name="JPUSH_APPKEY"android:value="您应用的Appkey"/>
3.添加初始化代码
(1)创建App这个类,并在application中进行配置。
(2)配置gradle.
4.测试是否成功,
五、推送常识问题:
1. 其正常工作的必要条件:JPush SDK 与 JPush Server 的网络保持着连接。
2.手机休眠时收不到 JPush 消息,解锁或屏幕灯亮则可以成功接收。这个现象表明,手机休眠时,JPush SDK “被迫”与服务器端的网络失去了连接。
3.JPush SDK 的工作原理是要确保在手机休眠时也能正常的工作,即休眠时也可以及时地收到Push消息。这个“被迫”,是由 Android 设备的环境所导致的。涉及的原因有如下几个方面:
(1)手机本身的网络设置。标准版本的 Android ROM 是没有这个设置的,但某些特殊的 ROM 可能会有这方面的设置。
(2)手机上的安全、省电工具软件额外做的事情.
上述的特殊机制会关闭网络。网络一旦连接上,JPush也会连接上服务器,从而Push消息就会收到。
4.有时候收到 JPush 消息很及时,有时候则要等几分钟
JPush 会监听网络切换广播。当网络关闭时,把原来JPush连接关闭。当有新的网络时,创建JPush连接。另外,RTC会定时发送心跳。如果之前的网络已经断了,则会重新连接。
应该说,当前的网络连接策略还是相对简单的,这样做的目的是:省电、省流量。不好之处就是:网络没有切换时,因为当时网络过差,JPush连接会被中断。这种情况下,就只能等 RTC 心跳去触发连接。这也是有时候JPush 无法及时接收Push消息的原因。根据网络条件的不同,出现这个情况的概率也会不同。但据我们自己的测试,90% 的时候是可以及时地收到Push消息的。
JPush 目前在网络策略方面没有像微信这种聊天工具做得积极。如果这样做到,电量和流量的消耗必然会成倍地增加。
5.完全收不到 JPush 消息
如果集成之后就完全收不到Push消息,则很有可能是某个地方配置错误。
Android中极光推送相关推荐
- Android集成极光推送踩坑(二)升级篇
转载请标明出处 http://blog.csdn.net/mohan6/article/details/74133186 本文作者:[默寒的博客] 前言 前段时间针对集成极光推送写了篇文章( Andr ...
- Android集成极光推送和踩过的坑(一)
转载请标明出处 http://blog.csdn.net/mohan6/article/details/72960346 本文作者:[默寒的博客] 集成步骤以及集成过程遇到的坑: 这部分主要阐述了集成 ...
- 68-Flutter中极光推送的使用
1.申请极光账号和建立应用 极光推送的官方网址为:https://www.jiguang.cn/ 注册好后,进入'服务中心',然后再进入'开发者平台',点击创建应用. 这时候会出现新页面,让你填写&q ...
- Android 集成极光推送和厂商通道
JPush 产品简介 Push 是经过考验的大规模 App 推送平台,每天推送消息量级为数百亿条. 开发者集成 SDK 后,可以通过调用 API 推送消息.同时,JPush 提供可视化的 web 端控 ...
- Android接入极光推送,接入华为,小米,OPPO,VIVO厂商通道
极光推送作用: 极光推送(JPush)是一个端到端的推送服务,使得服务器端消息能够及时地推送到终端用户手机上,让开发者积极地保持与用户的连接,从而提高用户活跃度.提高应用的留存率 主要作用: 保持与服 ...
- Android集成极光推送
话不多说先上图: 集成步骤: 1.新建Android Studio项目,因为之后会用到包名 2.建项目后登录极光推送开发者平台创建自己的应用 https://www.jiguang.cn/dev2/# ...
- 极光推送:java后台向APP推送消息(android,ios极光推送消息)
Maven添加依赖 <!--极光推送--><dependency><groupId>cn.jpush.api</groupId><artifact ...
- Android集成极光推送Flutter
该文章只包含Andriod的集成方式 一.Flutter文档集成步骤文档地址 极光推送客户端集成插件 二.关于集成方法总结 ①.创建应用 在极光推送官方网站上创建应用获取Appkey ②.安装jpus ...
- Android Jpush极光推送
平时我们开发手机客户端总是少不了与服务器进行交流,那当我们服务器数据有更新时候,客户端是怎么知道的呢,我们以前一般用两种方法: 1,客户端每隔一段时间向服务器发请求,检测数据是否发生变化,当发生变化的 ...
最新文章
- unity人物旋转移动代码_Unity3D研究院之脚本实现模型的平移与旋转(六)
- AI之最——地平线创始人兼CEO余凯谈AI
- “云”端的语雀:用 JavaScript 全栈打造商业级应用
- python列表的增删改查
- 【干货】周鸿祎谈雷军:能不能All In是一个核武器
- 用数据可视化解读:为何2亿国人爱钓鱼
- Flink进行Kafka事实表与Mysql维度表Join(纯DDL/DML方式)
- mybatis框架总体说明---Mybatis学习笔记(二)
- spring boot输出hello world几种方法
- 《DIY四轴飞行器》读书笔记1
- python字符串转浮点数_Python | 打印不同的值(整数,浮点数,字符串,布尔值)...
- iOS初级开发学习笔记:APP生命周期的学习总结
- cisco设备vlan,trunk,以太网通道管理
- No converter found capable of converting from type
- nginx 文件服务器_nginx配置简单文件服务器
- 三星固态驱动安装失败_三星SSD无法安装Win10无法启动解决方案
- 潦草字体在线识别_想要知道某些字是什么字体?帮助你以最快的方式识别
- 转帖:免费完美激活Windows7旗舰版
- uclinux和linux的使用区别,基于uClinux和Linux的对比分析
- 【PR学习笔记】PR学习笔记之PR快捷键