Service全面解析——本地服务全面解析

Service简单概述

在Android系统中,Service是没有UI界面的,它作为一个后台进程,周期性的执行某些特定任务,在开发一些用于处理无须用户干预的数据的后台应用程序时,经常需要用到这类Android应用程序服务,例如通过网络对数据进行周期性的监控,或接受RSS反馈分析XML数据。

在Android Framework或应用程序开发中所需要的主要API都是以系统服务的形式存在,例如获取终端的当前位置,读取感应器的数值,拨打电话等。

Service的分类

Android服务主要分两大类,一类是系统服务,它们是由Framework提供的,系统服务下面具体还分本地系统服务以及java系统服务,主要用于提供应用程序开发中所需要的主要API;另一类是应用程序服务,它们是开发者继承并实现Service类开发出来的,主要分为本地服务和远程服务。

本文Service全面解析——本地服务全面解析,主要讲解应用程序服务中的本地服务的内容,

Android应用程序服务

使用过Service得人都知道,Service有两种启动方式,一种是startService()启动服务,另一种是bindService()启动服务,而不通的启动方式对应不通的生命周期

startService()开启服务

startService()方法启动的服务,调用完onCreate()方法后,将继续调用onStartCommand()方法,此时Service将被运行,用户只有调用stopSelf()或是stopService()方法,Service才会被终止。生命周期为:

startService()->onCreate()->onStartCommand()->running->stopService()/stopSelf()->onDestroy()->stopped

值得注意的是,若在调用完startService()启动服务后,用户若再次调用startService()方法,那么Service将不会调用onCreate()方法,而是只会调用onStartCommand()方法,也就是说,无论调用多少次startService(),onCreate()只会调用一次,onStartCommand()会调用多次。

onStartCommand()需要一个返回值,且必须的以下几种中的一种(未概括全,举例常用的返回值)

START_STICKY:当返回值为START_STICKY时,表示服务在调用完onStartCommand()后被系统杀死的情况下,Service会自动重建,但传入的intent将会是null
START_NOT_STICKY:当返回值为START_NOT_STICKY时,表示服务在调用完onStartCommand()后被系统杀死的情况下,Service将不会自动重建
START_REDELIVER_INTENT:当返回值为START_REDELIVER_INTENT时,表示服务在调用完onStartCommand()后被系统杀死的情况下,Service将自动重建,同时返回上次传入的intent

startService()方法启动的服务,主要应用在无须跟用户发生交互的场景中,如下载文件操作,用户只需点击开启服务下载文件,Service在下载完文件后,自行调用stopSelf()或是stopService()方法结束即可。

bindService()开启服务

使用bindService()开启服务的方式会对比以startService()方法开启服务的方式,会稍微复杂些。首先调用bindService()方法绑定服务,bindService()需要传入intent对象的同时,还需要传入一个ServiceConnection对象,ServiceConnection对方必须实现两个方法,onServiceConnected()和onServiceDisconnected()方法,分别用于Service跟Activity建立关联和解除关联时调用。此后Service会继续调用onCreate()方法跟onBind()方法,onBind()方法一般返回用户自定义的IBinder对象的继承类,同时用户可以在类中自定义方法,而这个IBinder对象,就是ServiceConnection对象中回调的对象,在Activity中可以调用IBinder的对象的任意方法,所以说,IBinder是联结Activity和Service的桥梁。若用户想取消销毁Service,只需调用unBindService()方法即可。生命周期为

bindService()->onCreate()->onBind()->running->onUnbind()->onDestory()->stopped

需要注意的是

1、一个Service以bindService()方式来创建,那么一旦创建成功后,之后无论bindService()再调用多少次,onCreate()都只会调用一次,onStartCommand()始终不执行。

2、若一个Service使用startServcie()启动服务后,又使用了bindService(),那此时要销毁该Servcie,必须在调用stopSelf()或是stopService()方法后,再调用unBindService()方法才行,只执行其中的一种,将不能达到销毁Service的效果,因为Service只有处于停止状态,同时有没有更另外的Activity绑定,才会被销毁。

以bindService()方式来创建的Service一般是跟Activity存在交互的使用场景,如后台播放音乐时,需要调节音量、跳过、返回上一首等操作,此时使用bindService()创建Service比使用startService()创建Service更符合需求

Service跟Thread的区别

Service运行在main主线程,若在service执行耗时操作,会出现ANR(Activity5秒,Broadcast10秒,Service20秒会报ANR),若Service处理耗时操作,也得在内部手动开启线程处理

Thread是进程分配的最小单位,主要用来处理异步操作。

IntentService

IntentService内部有一个工作线程用来处理异步任务,启动IntentService跟启动普通Service一样,但当IntentService执行完时,会自动结束任务,用户无需调用stopService()或stopSelf()方法。多次启动IntentService任务的话,IntentService会将任务放入任务队列中,并按照放入的顺序,在上一个任务执行完毕后依次执行,完成后在onHandlerIntent()回调。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值