Android Service 基础
启动方式
startService(Intent)
这种方式启动的Service可以在后台无限期的运行,与启动它的组件没有关系。bindService
绑定Service。它提供了一种类似C/S结构的接口,允许组件与Service进行交互,发送请求,获取结果,可以实现IPC跨进程操作。一个客户端组件绑定之后,Service开始运行;所有组件解绑之后,Service停止运行。
这两种方式可以同时存在于一个Service中。
服务在其托管进程的主线程中运行,它既 不创建 自己的线程,也 不会 在单独的进程中运行。可以通过Manifest文件对其运行的进程进行配置。
重要的回调方法
OnStartCommand()
startService()
之后调用的方法。一旦执行此方法,服务即会启动并在后台运行。可以使用stopSelf()
或者stopService()
方法终止Service。
onBind()
bindService()
时,系统将调用此方法。此方法实现中必须返回一个IBinder
接口的实例,用来给客户端与Service通信。如果不允许绑定,则应该返回null。
onCreate()
首次创建服务的时候调用此方法。如果服务已经运行,那不会调用此方法。
onDestroy()
服务正常销毁的时候调用此方法。
如果将服务绑定到焦点Activity那它不太可能会被终止;如果将服务声明为前台服务,那它几乎不会被终止。
扩展Service
Service
它是所有服务的基类。
onStartCommand()
方法返回值必须是以下常量:
START_NOT_STICKY
Service在终止之后,不会自动重启。START_STICKY
Service在终止之后,会自动重启。系统会调用Intent为null的onStartCommand来启动服务。如果有排队的Intent等待服务,那么他们会依次调用onStartCommand方法传递进来。START_REDELIVER_INTENT
Service在终止之后,会自动启动。系统使用最后传进来的Intent
,重新调用onStartCommand方法启动服务。
这里的三个返回值只针对startService()
启动的Service,对bindService()
启动的Service无效。
IntentService
可以使用工作线程逐一处理所有启动请求。不要求服务同时处理多个请求的时候,它是个不错的选择。
扩展它的时候只需要实现onHandleIntent()
方法就可以了。
终止Service
调用stopSelf()
自行停止运行;另一个组件调用stopService()
来停止它。一旦调用stopService()
,系统会 尽快 停止它。
可以在stopSelf()
的时候加一个Id。这个Id是onStartCommand()
的时候传进来的Id。由于startService()
可能被调用多次所以这个onStartCommand()
传进来的Id有多个。如果stopSelf(Id)
并不是当前的Id那什么都不发生。
绑定Service
客户端组件可以通过bindService()
与一个服务绑定。要使服务能够绑定,必须重写onbind()
方法来返回一个IBinder
实例,用于定义与Service通信的接口。bindService()
可以拿到该接口,并通过IBinder
对象的实例调用服务的方法。如果没有按照startService()
启动,并且没有组件绑定到Service,系统就会销毁该Service。
多个客户端可以同时绑定到同一个Service上。完成交互之后,可以调用unbindService()
取消绑定。
前台运行服务
前台Service是一种用户可以感知的一种Service。所以,在内存不足的时候,系统也不会销毁它。前台服务必须提供状态栏的通知,状态栏中位于“正在进行”标题的下方。这意味着除非服务停止或者从前台删除,否则不能清除通知。
调用startForeground()
即可将服务变为前台服务。它需要两个参数:1. 唯一标识的整数(不能为0) 2. Notification。
调用stopForeground()
即可删除前台服务。一个参数: 是否删除标题栏通知。 这个方法是 不会停止服务的 。
如果一个前台进程自行终止(stopSelf
/stopService
),那么通知栏中的通知也会被删除。
Service生命周期
- 整个生命周期,从
onCreate()
方法开始,onDestroy()
方法结束。onCreate
方法做初始化,onDestroy
方法销毁资源。 - 有效生命周期,从
onStartCommand()
/onBind()
开始。每种方法都需要传递一个Intent
参数。
startService()
之后的生命周期与整个生命周期一致;bindService()
之后剩下的生命周期到onUnbind()
方法结束。
Android Service 基础的更多相关文章
- Android Service基础
Service Service 是一个组件,用来执行长时间的后台操作,不提供用户界面. 另一个应用组件可以启动一个Service,它将持续地在后台运行,即便是用户转移到另一个应用它也不会停止. 另外, ...
- Android Service基础知识你知道多少?
Android四大组件-Service 多次调用startService会怎样?会执行多次onCreate吗? StopService在哪里调用?stopSelf在哪调用? 怎样使Service被ki ...
- Service基础使用
Service基础使用 之前的文章一直介绍Activity的使用,很多知识和用法单一的配合Activity使用,这次将总结Android四大组件之二--Service. 本文将要介绍以下内容: Ser ...
- Android Service完全解析,关于服务你所需知道的一切(下)
转载请注册出处:http://blog.csdn.net/guolin_blog/article/details/9797169 在上一篇文章中,我们学习了Android Service相关的许多重要 ...
- AndroidApplication Fundamentals(Android应用基础)
AndroidApplication Fundamentals(Android应用基础) Android应用采用Java编程语言来编写,AndroidSDK工具编译我们的代码,连同任何数据和资源文件一 ...
- 【Xamarin开发 Android 系列 7】 Android 结构基础(下)
原文:[Xamarin开发 Android 系列 7] Android 结构基础(下) *******前期我们不打算进行太深入的东西,省的吓跑刚进门的,感觉门槛高,so,我们一开始就是跑马灯一样,向前 ...
- Android Service 详解
一个Service也是一种应用程序组件,它运行在后台以提供某种服务,通常不具有可见的用户界面.其它的应用程序组件可以启动一个 Service,即使在用户切换到另外一个应用程序后,这个Service还是 ...
- android图形基础知识
Android核心分析(23)-----Andoird GDI之基本原理及其总体框架 2010-06-13 22:49 18223人阅读 评论(18) 收藏 举报 AndroidGDI基本框架 在An ...
- 【转】Android Service完全解析,关于服务你所需知道的一切(下) ---- 不错
原文网址:http://blog.csdn.net/guolin_blog/article/details/9797169 转载请注册出处:http://blog.csdn.net/guolin_bl ...
随机推荐
- 【前端】Vue和Vux开发WebApp日志二、优化gulp任务
转载请注明出处:http://www.cnblogs.com/shamoyuu/p/vue_vux_2.html 项目github地址:https://github.com/shamoyuu/vue- ...
- Java利用递归算法统计1-6的数组排列组合数
Java利用递归算法统计1-6的数组排列组合数 1.设计源码 /** * @Title:ArrayCombination.java * @Package:com.you.data * @Descrip ...
- zTree实现删除树子节点
zTree实现删除树子节点 1.实现源码 <!DOCTYPE html> <html> <head> <title>zTree实现基本树</tit ...
- VC++信息安全编程(13)Windows2000/xp/vista/7磁盘扇区读写技术
有些时候,我们读取磁盘文件,会被hook.我们读到的可能并非实际的文件. 我们直接读取磁盘扇区获取数据. 实现磁盘数据的读写,不依赖WindowsAPI. [cpp] view plaincopy v ...
- css属性详解
一.字体属性 字体 font-family可以把多个字体名称作为一个“回退”系统来保存.如果浏览器不支持第一个字体,则会尝试下一个.浏览器会使用它可识别的第一个值. body { font-famil ...
- 微信小程序之公共函数引入
// 加载配置文件 const config = require('../config.js'); module.exports = { //提醒弹框 REMIND:function(that = ' ...
- filter()和find()的区别
<div class="css"> <p class="rain">测试1</p> </div> <div ...
- ProgressBar、ProgessDialog用法解析
一.ProgressBar 1. 常用类型 1.1 不确定式圆形进度条 style="@android:style/Widget.Holo.Light.ProgressBar" s ...
- iOS超全开源框架、项目和学习资料汇总 UI篇
上下拉刷新控件 MJRefresh --仅需一行代码就可以为UITableView或者CollectionView加上下拉刷新或者上拉刷新功能.可以自定义上下拉刷新的文字说明. AutoLayout ...
- 【洛谷1026】【NOIP2001】统计单词个数
题面 题目描述 给出一个长度不超过200的由小写英文字母组成的字母串(约定;该字串以每行20个字母的方式输入,且保证每行一定为20个).要求将此字母串分成k份(1<k<=40),且每份中包 ...