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_STICKYService在终止之后,不会自动重启。START_STICKYService在终止之后,会自动重启。系统会调用Intent为null的onStartCommand来启动服务。如果有排队的Intent等待服务,那么他们会依次调用onStartCommand方法传递进来。START_REDELIVER_INTENTService在终止之后,会自动启动。系统使用最后传进来的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 ...
随机推荐
- iOS.Animations.by.Tutorials.v2.0汉化
翻译自:iOS.Animations.by.Tutorials.v2.0 前五章将向你介绍动画API-UIKit框架.这个API是专门设计来帮助你轻松轻而易举的为视图控件赋予生命,同时避免了核心动画的 ...
- 1_Two Sum --LeetCode
原题如下: 思路:将nums放到一个map<int,int>中,其中,键是nums中元素,值对应其下标.然后遍历nums,取nums中一个值nums[i],接着用target减去它,最后再 ...
- Innotop简单介绍
Innotop介绍 Innotop是一款Perl脚本编写.开源.功能强大的MySQ的监控工具,它通过文本模式(命令行模式)监控,功能强大,配置简单,易于使用等等特性.Innotop这个项目位于ht ...
- 关于linux下的嵌入式文件系统以及flash文件系统选择
嵌入式linux下常见的文件系统 • RomFS:只读文件系统,可以放在ROM空间,也 可以在系统的RAM中,嵌入式linux中常用来作 根文件系统 • RamFS:利用VFS自身结构而形成的内存文件 ...
- Ubuntu Desktop变为Ubuntu Server服务器版的方法
去Ubuntu官网看到有好几种版本可以下载,alternate(文本安装).desktop9(桌面).netbook(上网本).server(服务器). 使用server版某个理由: 32位的系统可以 ...
- 关于TS流的解析
字节.在TS流里可以填入很多类型的数据,如视频.音频.自定义信息等.他的包的结构为,包头为4个字节,负载为184个字节(这184个字节不一定都是有效数据,有一些可能为填充数据). 工作形式: 因为在T ...
- python version 2. required,which was not found in the registry 解决方案
不能在注册表中识别python2.7 新建一个register.py 文件 import sys from _winreg import * # tweak as necessary version ...
- [翻译] 比较 Node.js,Python,Java,C# 和 Go 的 AWS Lambda 性能
[翻译] 比较 Node.js,Python,Java,C# 和 Go 的 AWS Lambda 性能 原文: Comparing AWS Lambda performance of Node.js, ...
- 用自定义注解实现fastjson序列化的扩展
这篇文章起源于项目中一个特殊的需求.由于目前的开发方式是前后端分离的,基本上是通过接口提供各个服务. 而前两天前端fe在开发中遇到了一些问题:他们在处理字符串类型的时间时会出现精度丢失的情况,所以希望 ...
- Java sax、dom、pull解析xml
-------------------------------------SAX解析xml---------------------------------- >Sax定义 SAX是一个解析速度 ...