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

如何让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. (二)通过fork编写一个简单的并发服务器

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

  2. SpringBoot修改Redis序列化方式

    前言 由于Springboot默认提供了序列化方式并不是非常理想,对于高要求的情况下,序列化的速度和序列化之后大小有要求的情况下,不能满足,所以可能需要更换序列化的方式. 这里主要记录更换序列化的方式 ...

  3. Asp.Net SignalR 集群会遇到的问题

    SignalR集群 当客户端数量上来,一台server自然是吃不消的.多个server集群部署是必然的解决方案.再通过负载均衡,嗯 简直是完美.但是问题也接踵而来.每个server只能管理到当前ser ...

  4. Kali~2018安装后的配置

    今天,物理机上成功的安装了Kali Linux系统,但是要想用的顺手还需要花费许多时间和精力,下面就是我对它的养成之路. 一.添加普通用户 useradd -m -G sudo,video,audio ...

  5. .NET Core下的Spring Cloud——前言和概述

    前言 前几年一直在写类似dubbo,Srping Cloud的微服务框架辗辗转转重复了多次,也重构推翻了很多次,其中诞生了"Rabbit.Rpc","Go",& ...

  6. Spring基础系列--AOP实践

    原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9615720.html 本文目的是简单讲解下Spring AOP的使用. 推荐使用IDEA ...

  7. ROS笔记1 安装及创建一个ROS Package

    安装 跟着官方的安装指引来就行了.安装前要先确定自己的ros版本和ubuntu版本.这二者是一一对应的. http://wiki.ros.org/ROS/Installation 主要是package ...

  8. C#服务器控件 IsReadOnly 和 Visibility,IsEnable 的区别

    IsReadOnly  适用于“输入.输出”类控件,比如TextBox类, 可以当做文本输入,也可以通过后台代码进行输出. 设置 IsReadOnly(只读) = true 后,该控件只允许输出,不允 ...

  9. 【CentOS7】服务环境搭建

    用了两天时间,完成了服务环境的搭建.记录下了搭建的过程,搭建细节并没有记录. 1.OpenSSH. (1)yum search ssh (2)yum install openssh-server (3 ...

  10. AI书单

    1.<TensorFlow实战>   黄文坚 2.<Machine Learning> [美]Tom Mitchell 3.<机器学习> 周志华