这几天一直在准备考试,总算有个半天时间可以休息下,写写博客。

如何让Service keep alive是一个很常见的问题。

在APP开发过程中,需要Service持续提供服务的应用场景太多了,比如闹钟需要作出及时提醒,那么比如得有一个Service不断去比较当前时间和设置时间;QQ要能流畅的聊天,必然也需要及时接收消息等。

但是Android并没有保证Service有这样功能,毕竟一个系统面对的是用户,必然以对用户友好为先。

关于如何让Service keep alive,我在上篇博客给出的解决方案是:方案一,让服务器端发一个推送,检查Service是否还存活;方案二,将Service独立出来,运行在另一个进程中。

这两个方案有些地方需要说明和改进,然后还会有其他方案补充进来。

方案一:利用推送来确保Service存活。

方案一的做法有点“偷懒”。因为相当于把这个难题转移给推送服务提供者来处理,或者说,只需要依靠推送,就不需要自己去考虑存活问题。

推送一直是移动客户端开发的热门话题(实际上也是传统软件开发的热门话题)。

一般情况下,C/S结构(B/S是特殊的C/S结构)中的业务流程是这样的:客户端主动向服务器端发出请求,服务器端响应请求,建立二者之间的连接。通过建立的链接,双方可以发送/接收数据。最后客户端和服务器端断开连接。也就是说,客户端是主动方,是请求连接的发起者;服务器端保持对某个端口的监听(0-1023是系统端口号,比如80端口被指派给HTTP),而被动地等待客户端的连接请求。

那么推送指的是,服务器端在没有收到请求的情况下主动向客户端发送信息,比如服务器端收到一封邮件后主动发往邮件的客户端。

推送是如何实现的呢?首先,服务器端的功能还是不变,监听某个端口等待请求。然后我们可以看到,服务器端能主动发送信息的唯一时间段就是在建立了服务器端到客户端的连接之后、二者断开连接之前。因此,推送的实现就是基于保持服务器端和客户端的连接一直存在,方式可以是持续连接或者轮询。

回到Service这个问题上来,推送服务的提供者必然会保证推送技术的稳定性,依靠推送,可以唤醒我们的APP,那么保证Service的存活也就不在话下。

方案二:将Service运行在另一个进程中。

将Service放在另一个进程中,可以避免APP所在的进程因资源紧张或者被用户手动结束的时候,Service也被结束。

这个做法的另一个优点是,可以让Service独立出来,为同一个公司的不同APP提供相同的服务。比如当大部分APP都需要同一个信息的时候,为每个APP都写一个Service显然不好,这时完全可以写一个独立进程中的Service,为所有APP提供信息。

当然,这个方案有个缺点是,当某些手机助手无脑式结束掉全部的非系统进程时,Service无法存活。

方案三:让onStartCommand()函数的返回值为START_STICKY,同时在onDestroy()中重启Service

当返回值为该值时,Service被kill之后会被系统自动重启。

同时,在Service的onDestroy()中重启Service,可以给Service的重启做双重保证。

但是显然的缺点是,当APP的进程被kill后,这个方案就会失效。

方案四:使用“守护Service”。

即除了你需要存活的Service外,专门写一个Service,并使该Service运行在另一个进程中。

当两个Service中有一个Service被kill,就在另一个Service中去重启该Service。

从手机中进程的数量上判断,搜狐视频、触宝号码助手等使用的正是该方式。

方案五:将Service所在的APP提升至系统应用级别

在配置文件中的Application节点做这样的设置:android:persistent=”true”可以将APP提升至系统级别。

相信不管什么手机助手都不会去kill这一块的APP。

从手机中QQ被手动kill后系统出现的对话框判断,手机QQ正是使用的这一方案。

方案六:接收系统的广播

可以用BroadCastReceiver去接收系统的广播,比如时间变化的广播、电量变化的广播等。

这样基本上Service就无法被kill了。

总结:

能保证Service完全不会被杀死的方案是方案一和方案六。

比较轻量的方案是方案二和方案三。

我个人认为比较好的方案是方案四和方案五——那些大厂选择这样的方案是有道理的。具体使用哪个得看自己的需求。

虽然标题是说保持Service持续存活,但是并不是说一定要在任何情况下存活。十分不建议使用方案一和方案六。因为当用户发现,不管他怎么操作都无法停止一个APP时,带给他的只有恐慌,那么小手一抖的情况下,APP就只能被删除了。

from:https://www.cnblogs.com/zhenghuiy/p/3791924.html

【转】Android中保持Service的存活的更多相关文章

  1. Android 中的 Service 全面总结(转载)

    转载地址:http://www.cnblogs.com/newcj/archive/2011/05/30/2061370.html 感谢作者 Android 中的 Service 全面总结 1.Ser ...

  2. (转载)Android中的Service:Binder,Messenger,AIDL(2)

    前言 前面一篇博文介绍了关于Service的一些基本知识,包括service是什么,怎么创建一个service,创建了一个service之后如何启动它等等.在这一篇博文里有一些需要前一篇铺垫的东西,建 ...

  3. (转载)所有分类 > 开发语言与工具 > 移动开发 > Android开发 Android中的Service:默默的奉献者 (1)

    前言 这段时间在看一些IPC相关的东西,这里面就不可避免的要涉及到service,进程线程这些知识点,而且在研究的过程中我惊觉自己对这些东西的记忆已经开始有些模糊了——这可要不得.于是我就干脆花了点心 ...

  4. Android中的Service小结

    简介 Service适合执行不需要和用户交互,而且长期运行的任务.即使程序被切换回后台,服务仍然可以正常运行.Service并不自动开启线程,默认运行在主线程中. Service中需要重载的函数 on ...

  5. Android 中的 Service 全面总结

    1.Service的种类   按运行地点分类: 类别 区别  优点 缺点   应用 本地服务(Local) 该服务依附在主进程上,  服务依附在主进程上而不是独立的进程,这样在一定程度上节约了资源,另 ...

  6. Android 中的 Service 全面总结 (转)

    原文地址:http://www.cnblogs.com/newcj/archive/2011/05/30/2061370.html 1.Service的种类   按运行地点分类: 类别 区别  优点 ...

  7. Android中的service

    1.service简介:service可以在和多场合的应用中使用,比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,再或者在后台记录你地理信息 ...

  8. Android中的Service与进程间通信(IPC)详解

    Service 什么是Service 在后台长期运行的没有界面的组件.其他组件可以启动Service让他在后台运行,或者绑定Service与它进行交互,甚至实现进程间通信(IPC).例如,可以让服务在 ...

  9. Android中的Service组件具体解释

    Service与Activity的差别在于:Service一直在后台执行,他没实用户界面,绝不会到前台来. 一,创建和配置Service 开发Service须要两个步骤:1.继承Service子类,2 ...

随机推荐

  1. 带着新人学springboot的应用06(springboot+RabbitMQ 中)

    上一节说了这么多废话,看也看烦了,现在我们就来用鼠标点点点,来简单玩一下这个RabbitMQ. 注意:这一节还是不用敲什么代码,因为上一节我们设置了那个可视化工具,我们先用用可视化工具熟悉一下流程. ...

  2. (二)通过fork编写一个简单的并发服务器

    概述 那么最简单的服务端并发处理客户端请求就是,父进程用监听套接字监听,当有连接过来时那么监听套接字就变成了已连接套接字(源和目的的IP和端口都包含了),这时候就可以和客户端通信,但此时其他客户端无法 ...

  3. ASP.NET Core框架揭秘(持续更新中…)

    之前写了一系列关于.NET Core/ASP.NET Core的文章,但是大都是针对RC版本.到了正式的RTM,很多地方都发生了改变,所以我会将之前发布的文章针对正式版本的.NET Core 1.0进 ...

  4. 如何将视频导入到ipad中并播放

    首先在电脑上下载并安装itunes,然后用apple账号登入, 在ipad上从apple store中下载一个播放器如KMPlayer 点击itunes上小手机的图标,找到文件共享,选中应用KMPla ...

  5. 【EF】CodeFirst Fluent API使用记录

    我们在使用EF CodeFirst 模式生成数据库的时候进行表的代码映射关系可以采用注解模式和Fluent API模式.这里就是记录一下使用Fluent API进行表关系映射的方法. 注解模式: 回顾 ...

  6. 36.QT-解决无边框界面拖动卡屏问题(附带源码)

    1.简介 看到很多才学QT的人都会问为啥无边框拖动为啥会花屏? 那是因为你每次拖动的过程中都一直在调用move()函数让QT重新绘制界面,如果资源过大,就会导致当前图形还未绘制完,便又重新改变坐标了, ...

  7. Spring Boot admin 2.0 详解

    一.什么是Spring Boot Admin ? Spring Boot Admin是一个开源社区项目,用于管理和监控SpringBoot应用程序. 应用程序作为Spring Boot Admin C ...

  8. 15 , CSS 背景与列表

    1.CSS 中背景的使用 2.CSS 中列表的使用 15.1 CSS 中背景的使用 属性名称 属性值 说明 background-attachment scroll 设置背景图像会随视窗滚动 条的移动 ...

  9. dsu on tree入门

    先瞎扯几句 说起来我跟这个算法好像还有很深的渊源呢qwq.当时在学业水平考试的考场上,题目都做完了不会做,于是开始xjb出题.突然我想到这么一个题 看起来好像很可做的样子,然而直到考试完我都只想出来一 ...

  10. 免费下载获取Odoo中文开发 指南 手册

    引言 Odoo是一个强大的商业应用开源平台.在此基础上,构建了一套紧密集成的应用程序,涵盖了从CRM到销售到股票和会计的所有业务领域.Odoo有一个动态和不断增长的社区,不断增加功能.连接器和其他商业 ...