- 博客园
- 首页
- 新随笔
- 联系
- 订阅
- 管理
| ||||||
29 | 30 | 31 | 1 | 2 | 3 | 4 |
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 1 | 2 |
3 | 4 | 5 | 6 | 7 | 8 | 9 |
- 随笔 - 70
- 文章 - 0
- 评论 - 42
- 引用 - 0
- 昵称:Tekkaman
园龄:4个月
粉丝:14
关注:2+加关注
搜索
常用链接
- 我的随笔
- 我的空间
- 我的短信
- 我的评论
- 更多链接
随笔分类
- Agile Development(1) (rss)
- Android(18) (rss)
- ATL(12) (rss)
- C++(7) (rss)
- iOS(1) (rss)
- Java(17) (rss)
- Linux(1) (rss)
- WTL(7) (rss)
- 编程杂谈(4) (rss)
- 人生感悟(1) (rss)
- 数据结构(1) (rss)
- 网络文摘(1) (rss)
随笔档案
- 2011年9月 (2)
- 2011年7月 (1)
- 2011年6月 (23)
- 2011年5月 (35)
- 2011年4月 (9)
相册
- 计算技术
最新评论
- 1.?Re:盘点富人和穷人九大经典差异
- 很好
- --袁腾波
- 2.?Re:Java之用句柄操作对象
- 一直都不明白Java中句柄是怎么一回事,看了你的“遥控板”和“电视机”后终于明白了~
- --大全全
- 3.?Re:Android之App的六种UI元素
- @谦虚的天下
呵呵,是错了,您真仔细 - --Tekkaman
- 4.?Re:Android之App的六种UI元素
- 楼主对通知Notification的理解有误吧
应该是通知栏,而不是标题栏的 - --谦虚的天下
- 5.?Re:Android之Content Providers
- @yanwei
鄙人翻译的- -,是鄙人的阅读笔记,故相当粗糙。建议阅读原文。 - --Tekkaman
阅读排行榜
- 1.?ATL、MFC、WTL CString 的今生前世(1639)
- 2.?Android之Content Providers(1354)
- 3.?如何剖析一个类(1294)
- 4.?剖析ATL、WTL CString的实现(1230)
- 5.?Android之Activity(862)
评论排行榜
- 1.?ATL、MFC、WTL CString 的今生前世(10)
- 2.?如何剖析一个类(7)
- 3.?WTL中对话框数据交换(6)
- 4.?Android之Activity(4)
- 5.?Android之Content Providers(4)
【Services】
一个Service是一个应用程序组件,它能完成长时间运行的操作在后台,并且不提供用户接口。另一个应用程序组件能开启一个service并且它将继续运行在后台即使用户转换到另一个应用程序。额外的,一个组件可以被绑定到一个service来和它交互甚至完成进程间通信。例如,一个service可能操作网络带伤、播放音乐、执行I/O或和一个content provider交互,所有这些都是在后台进行。
一个service主要有两个用途:
1、Started
一个service被开启当一个应用程序组件(例如activity)用startService()开启它。一旦开启,一个service能无期限的运行在后台,即使创建它的组件被销毁。通常,一个启动的service完成一个单的操作,并且不返回结果给调用者。例如,它可能下载蔌上传一个文件通过网络。当操作完成,服务应该停止它自己。
2、Bound
一个service处于Bound状态,当一个应用程序组件绑定它通过bindService()。一个bound service提供一个客户端/服务器接口,以允许组件和service交互、发送请求、获取结果甚至做跨进程的进程间通信(IPC)。一个bound service运行只有当另一个应用程序组件绑定它。更多的是,组件能一旦绑定到service,但当它们所有都取消绑定,这个service就被摧毁。
虽然这篇文档主要单独地讨论两种不同类型的service,你的service可以两个都工作--它可以启动(无期限的运行)并且同样允许绑定。这只是你的组件是否实现了两个onStartComamnd()回调的问题,来允许组件启动它并且onBind()允许绑定。
不管你的应用程序是否启动、bound、或两个都是,任何一个应用程序组件都可以使用service(甚至从一个单独的应用程序),通过这种方式,任何组件能使用一个activity--通过一个Intent开启。可是,你能声明service私有,在manifest文件里,并且阻止访问从其它应用程序。
警告:一个service支它的主进程的主线程--service不创建它自己的线程并且不运行在单独的进程(除非你指定)。这意味着,如果你的service将要去做任何耗CPU的工作或阻塞操作(例如MP3播放或网络),你应该新建一个线程为这个service来完成那个工作。通过使用一个单独的线程,你将减少应用程序不响应(ANR)风险并且应用程序的主线程能专注于你的activity的用户交互。
【The Basics】
为了创建一个service,你必须创建一个service的子类(或已经存在类的子类)。在你的实现中,你需要需要覆盖一些回调函数,那些操作service生命周期关键方面并且给组件提供一个机制来绑定到serivce,如果合适。最重要的回调你应该覆盖的是:
onStartCommand()
onBind()
onCreate()
onDestroy()
如果一个组件启动一个service通过startService()(导致调用onStartCommand()),然后这个service维持运行直到它停止它自己通过stopSelf()或另一个组件停止它通过stopService()。
如果一个组件调用bindService()来创建service(onStartCommand()不被调用),那么这个service当组件绑定它的时候运行。一量service被取消绑定从客户,系统销毁它。
Android系统将强制停止一个service只有当内存很低并且它必须恢复系统资源为拥有用户焦点的activity。如果service绑定到一个拥有用户焦点的activity,那么它不太可能被杀,如果service被声明为运行在前台(稍后讨论),那么 它将几乎永远不会被杀。否则,如果service启动,并且一直运行,那么 系统会降低它的位置在后台任何列表里随着时间,并且service将变得高度被杀--如果你的service一年非常,那么你必须设计它温柔的被系统重启。如果系统杀死你的service,它重启它一量资源变得可利用(虽然这个也依赖于你从onStartCommand返回的值)。
【Declaring a service in the manifest】
像很多activities(以及其它组件),你必须声明所有的services在你的应用程序manifest文件里。
为了声明你的服务,加入<service>元素作为<application>元素的子元素。例如:
有其它的属性你可以在<service>元素中来定义属性,例如启动service的权限和service运行在哪一个进程。
就像一个activity,一个服务可以定义intent filters来允许其它组件激活服务使用隐含的intent。通过声明intent filters,任何其它应用程序的组件启动你的service如果你的service声明一个intent filter,匹配其它应用程序传递给startService()的intent。
如果你计划只本地使用你的service(其它应用程序看不见),那么你不需要(也不应该)提供任何intent filters。没有任何intent filters,你必须启动这个service使用一个intent,显式的命名service类。
额外的,你可以保证你的service是私有的对你的应用程序只有你包含android:exported属性并且设置它为"false"。这点非常有效,即使你的service提供intent filters。
【Creating a Started Service】
Service
IntentService
START_NOT_STICKY
START_STICKY
START_REDELIVER_INTENT