Android Service 详解二:创建一个service

  次阅读 来源:互联网(转载协议) 2016-01-13 22:22 我要评论(0)

在manifest中声明一个service

跟activity以及其它组件一样,你必须在你的应用的manifest文件中声明所有的service们.

要声明你的service,添加一个<service>元素作为<application>元素的儿子.例如:

<manifest ... >

...

<application ... >

<service android:name=".ExampleService" />

...

</application>

</manifest>

有许多属性你可以包含在<service>元素中,比如启动service的权限和service运行所在的进程.android:name属性是哇一必须的 它指定了service类的名字.一旦你发布了你的应用,你不应再改变这个名字,因为如果你改了,你可能使一些通过明确的intent来引用你的service的功能无法运行.

就像一个activity,一个service可以定义intent过滤器来使得其它组件使用明确的intent调用自己.通过声明intent过滤器,你设备上的任意应用中的组件都可以通过给startService()传递匹配的intent来启动你的sevice.

如果你打算只在本应用内使用自己的service,那么你不需指定任何intent过滤器.不使用intent过滤器,你必须使用一个明确指定service的类名的intent来启动你的service.

另外,你也可以通过包含android:exported属性,并指定其值为 false 来保证你的service是私有的.即使你的service使用了intent过滤器,也会起作用.

创建一个"启动的"Service

针对Android1.6或更早的版本:

如果你创建的应用是针对Android1.6或更早版本的,你需要实现onStart()而不是onStartCommand()(在Android2.0中,onStart()被废弃代替之以onStartCommand()).

更多关于如何兼容2.0之前版本的知识,请看onStartCommand()文档.

一个启动的service,在被其它组件调用startService()来启动时,会导致service的onStartCommand()方法被调用.

当一个service被启动后,它的生命期就不再依赖于启动它的组件并且可以独立运行于后台,即使启动它的组件死翘翘了.所以,service应该工作完成后调用stopSelf()自己停止掉,或者其它组件也可以调用stopService()停止service.

一个应用组件,比如一个activity可以通过调用startService()启动service同时传递一个指定service和service所用的数据的Intent,service在方法onStartCommand()中接收这个Intent.

例如,假设一个activity需要保存一些数据到一个在线数据库中.这个activity可以通过传递一个intent给startService()来启动一个service并且把数据传给service来让servcie存储它们.service在onStartCommand()中接收intent,连接到Internet然后执行数据库事物.当事物完成后,service停止自己然后被销毁.

小心:service默认运行在声明它的应用进程的主线程中.所以,如果你的service执行密集运算或阻塞操作并且与跟用户交互的activity位于相同的应用中,这个service将会拉低activity的性能.要避免影响应用的性能,你必须在service中启动一个线程.

传统上,有两个类你可以从它派生来创建"启动的"service:

Service

这是所有service的基类.当你派生这个类时,在service中创建一个新的线程来做所有的工作是十分重要的.因为这个service会默认使用你的应用的主线程,这将拉低你的应用中所有运行的activity的性能

IntentService

这是一个Service的子类,使用一个工作线程来处理所有的启动请求,一次处理一个.这是你不需你的service同时处理多个请求时的最好选择.你所有要做的就是实现onHandleIntent(),这个方法接收每次启动请求发来的intent,于是你可以做后台的工作.

从IntentService类派生

因为大多数"启动的"service不需要同时处理多个请求,可能从IntentService实现你的service是最好的选择.

IntentService做了以下工作:

创建一个默认的工作线程在主线程之外执行所有派发到onStartCommand()的intent.

创建一个工作队列,某个时间只传递一个intent到你的onHandleIntent()实现中,于是你不必担心多线程的问题.

本站部分文章来源于网络以及网友投稿,本站只负责对文章进行整理、排版、编辑,是出于传递更多信息之目的,并不意味着赞同其观点或证实其内容的真实性。如果您有什么意见或建议,请联系QQ28-1688-302!

人工智能实验室
相关文章相关文章
  • teamLab创始人猪子寿之: 抛去衣食住行,我还剩下什么?

    teamLab创始人猪子寿之: 抛去衣食住行,我还剩下什么?

  • Oculus公布原型机,大幅度提升可视角,能实现140°的视场水平

    Oculus公布原型机,大幅度提升可视角,能实现140°的视场水平

  • 2018深圳国际人工智能展览会 2018 shenzhen International Artif

    2018深圳国际人工智能展览会 2018 shenzhen International Artif

  • Michael I. Jordan带你解读百万奖金ATEC蚂蚁人工智能大赛

    Michael I. Jordan带你解读百万奖金ATEC蚂蚁人工智能大赛

网友点评网友点评
阅读推荐阅读推荐

据外媒报道,STEER打造了首款完全自动驾驶停车技术,旨在使常规车辆转变为无人驾驶车辆。STEER的首款技术应用是4级自动驾驶及网络安全停车...

近日,美国软性机器抓手制造商 Soft Robotics 宣布,获得 2000 万美元的融资,本轮投资者包括 Scale Venture Partners,Calibrate Ventures...

据外媒报道,加州车管局发布了《2017自动驾驶脱离报告(California Autonomous Vehicle Disengagement Reports)》,其中谈及了脱离的具体...

用人机语音交互,来解决智能家居适老的问题;通过家庭门禁与安防套件、空气净化套件、可燃气体与有害气体监控套件等相互联动,在不同生活情...