Android 通过Service单独进程模仿离线推送 Server Push
2019独角兽企业重金招聘Python工程师标准>>>
概述:
首先简单阐述一下我对于消息推送的理解,这里拿QQ来举例吧,当我们手机端的QQ离线了,并且退出了QQ应用,但是这时候如果别人给我们发了信息,我们没有上线。服务器会将发送者发送的信息推送过来然后我们发布通知来显示通知我们的用户
原理简单阐述:
通过以上概述,我们基本了解我们需要一个独立进程的后台服务,在AndroidManifest
.xml中注册Service时,有一个android:process属性这个属性有2种情况,即为.和:两种,其中.代表为此服务开启一个全局的独立进程,如果以:开头则为此服务开启一个为此应用私有的独立进程
编码实现:
ServerPushService文件:
import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.app.Service; import android.content.Intent; import android.os.IBinder; public class ServerPushService extends Service{ //获取消息线程 private MessageThread messageThread = null; //点击查看 private Intent messageIntent = null; private PendingIntent messagePendingIntent = null; //通知栏消息 private int messageNotificationID = 1000; private Notification messageNotification = null; private NotificationManager messageNotificationManager = null; @Override public IBinder onBind(Intent intent) { return null; } @Override public int onStartCommand(Intent intent, int flags, int startId) { //初始化 messageNotification = new Notification(); messageNotification.icon = R.drawable.ic_launcher; //通知图片 messageNotification.tickerText = "新消息"; //通知标题 messageNotification.defaults = Notification.DEFAULT_SOUND; messageNotificationManager = (NotificationManager) getSystemService(this.NOTIFICATION_SERVICE); //点击查看 messageIntent = new Intent(this,MessageActivity.class); messagePendingIntent = PendingIntent.getActivity(this, 0, messageIntent, 0); //开启线程 MessageThread thread = new MessageThread(); thread.isRunning = true; thread.start(); return super.onStartCommand(intent, flags, startId); } /*** * 从服务端获取消息 * @author zhanglei * */ class MessageThread extends Thread{ //运行状态 public boolean isRunning = true; @Override public void run() { while(isRunning){ try { //休息10秒 Thread.sleep(10000); if(getServerMessage().equals("yes")){ //设置消息内容和标题 messageNotification.setLatestEventInfo(ServerPushService.this, "您有新消息!", "这是一条新的测试消息", messagePendingIntent); //发布消息 messageNotificationManager.notify(messageNotificationID, messageNotification); //避免覆盖消息,采取ID自增 messageNotificationID++; } } catch (Exception e) { e.printStackTrace(); } } } } /*** * 模拟了服务端的消息。实际应用中应该去服务器拿到message * @return */ public String getServerMessage(){ return "yes"; } }
注册该service在一个单独的进程中
<!-- 为此应用私有的独立进程 --> <service android:name="com.jay.serverpush.ServerPushService" android:process=":message" > </service>
说明:该文件编写了一个service用于后台运行,在manifest里面将该service声明成progress为:开头的,这样在一个单独的进程里面运行,以实现在程序关闭之后达到进程不关闭的目的以此来实现离线推送的目的,编码中的注释很明确,扫描服务器、判断逻辑发布通知等,注释很明确在此不在阐述
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); this.startService(new Intent(this,ServerPushService.class)); } this.startService(new Intent(this,ServerPushService.class));
通过这句话在第一次进入oncreate方法就开启了单独进程的服务
转载于:https://my.oschina.net/u/1262457/blog/179425
Android 通过Service单独进程模仿离线推送 Server Push相关推荐
- android service单独进程,Android 通过Service单独进程模仿离线推送 Server Push
概述: 首先简单阐述一下我对于消息推送的理解,这里拿QQ来举例吧,当我们手机端的QQ离线了,并且退出了QQ应用,但是这时候如果别人给我们发了信息,我们没有上线.服务器会将发送者发送的信息推送过来然后我 ...
- HTTP/2之服务器推送(Server Push)最佳实践
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由mariolu 发表于云+社区专栏 HTTP/1.X出色地满足互联网的普遍访问需求,但随着互联网的不断发展,其性能越来越成为瓶颈.IE ...
- 关于Android安卓APP保活 - 安卓消息推送详解 - 安卓端外推送离线推送
转自:http://zhangtielei.com/posts/blog-android-push.html 说Android端外推送比较烦,实际有两层意思:首先是说实现上比较麻烦,至今业界也没有找到 ...
- Android端离线推送语音播报原理实现
碰到的问题差不多两个: 首先是离线推送的问题,如果离线推送需要语音播报的话,需要APP运行一个前台服务,这个服务运行才行,否则自己的代码都没有,怎么实现语音播报呢? 第二就是怎么用服务去获取到离线推送 ...
- uniapp push 推送 个推 安卓Android添加Google 推送服务 FCM 离线推送 Dcloud
项目甲方在国外需要用到google推送服务,看了文档中说明,如果安卓要实现离线推送,需要通过厂商来解决 在google开发者后台添加项目,获取Legancy server key 获取google-s ...
- 环信android手机推送苹果收不到消息,环信iOS端离线推送收不到怎么办?(客服)...
离线推送收不到,按照下面步骤一步一步进行排查: 0.如果你的app之前可以收到离线推送,突然收不到了,那么先到苹果开发者中心查看推送证书是否过期.如果过期了,需要重新制作证书,然后到环信管理后台将旧的 ...
- android推送服务不被关闭,Android APP被关闭后无法收到推送消息(尝试)
1. Android端进程被杀死后,目前自带的保护后台接收消息活跃机制.暂时没有什么好的机制保持任何情况下都活跃 文章参考:http://blog.csdn.net/marswin89/artic ...
- 关于百度云推送加厂商进行app离线推送的步骤小记
经过漫长的无所事事,终于来了一个活,要搞推送,不能socket,要后台关闭了也能推. 第三方推送,厂商自带,各种看了一下,但最终产品敲定,用百度云推送 研究的过程都是千篇一律,下demo,看文档,测试 ...
- Android App 被关闭后无法收到推送消息
zzz~ Android端进程被杀死后,目前自带的保护后台接收消息活跃机制.暂时没有什么好的机制保持任何情况下都活跃 文章参考:http://blog.csdn.net/marswin89/artic ...
最新文章
- Java 未死,依然很牛逼!
- swift 连接mysql数据库_Swift - 操作SQLite数据库(引用SQLite3库)
- 【ASIC设计】ASIC设计流程
- 好好学python · 字符串(find(),index(),split(),join(),strip(),replace())
- html首字母样式,html标签手册
- linux代码段映射,bss,data,text,rodata,堆,栈,常量段与其各段在物理存储中关系
- 计算机科学学院参加些什么比赛,【安全月进行时】计算机科学学院成功举办2019年实验室安全知识竞赛活动...
- opencv基本的图像处理函数
- oracle改表结构非空字段类型,oracle 表结构的非完全复制
- PHP对象注入 PHP Object Injection
- 网络端口扫描器.扫描开放端口.TCP/UDP的Socket通信.支持IP地址网段范围的批量扫描.支持多线程操作,提高扫描效率
- 二叉树入门OJ—递归思想练习
- tampermonkey油猴实现自动定时刷新页面,刷访问量
- 用PQ硬盘分区魔术师处理磁盘时务必先卸载掉360相关软件
- Linux基础:su命令使用方法介绍
- 一个img文件-实验吧
- JAVA自学-day13-StringBuffer类、数组高级以及Arrays、Integer类
- 销量下降,到底应该怎么分析?!
- Java学习 day7 (常用API)Scanner类.Random类.Arraylist类
- 观点 | ​苏宁传统零售业“数字化转型”经验分享
热门文章
- DCMTK:Telnet发起程序(ti)主程序
- VTK:PolyData之RuledSurfaceFilter
- OpenCV使用Harris-Stephens方法检测角点的实例(附完整代码)
- OpenCV基于均值漂移的跟踪的实例(附完整代码)
- OpenCV VideoCapture与捕获设备,视频文件或图像序列一起使用的实例
- C语言实现Floyd-Warshall(弗洛伊德算法)(附完整源码)
- QT的QStyleOption类的使用
- C++面向接口编程和C++多态
- C++对C的加强之struct类型加强
- 经典C语言程序100例之七零