服务是一个长期运行在后台的用户组件,没有用户界面。除了可以在后台下载文件之外,还可以在后台执行很多任务。
9.1服务概述
可以与其他组件进行交互,一般是由Activity启动,但并不依赖于Activity。它有自己的生命周期。
具有较长的时间运行特性,主要有后台运行与跨进程访问两个应用场景。
①后台运行:可以在后台长时间进行操作而不用提供界面信息,只有当系统必须要回收内存资源时,才会被销毁,否则Service会一直在后台运行。
②跨进程访问:当Service被其他应用组件启动时,即使用户切换到其他应用,服务仍将在后台继续运行。其运行是在主线程中进行的。
9.2服务的创建
<service>标签中有3个属性,分别是name,enabled,exported,其中name属性表示服务的路径,enabled属性表示系统是否能够实例化该服务,exported属性表示该服务是否能够被其他应用程序中的组件调用或进行交互。
9.3服务的生命周期
服务的启动方式有两种:一种是通过startService()方法启动服务,另一种是通过bindService()方法启动服务。使用不同的方式启动服务,其生命周期会不同
①当调用startService()方法启动服务时,程序执行服务的生命周期方法依次为onCreate(),onStartCommand(),onDestroy()。
②当通过bindService()方法启动服务时,执行的生命周期方法依次为onCreate(),onBind(),onUnbind(),onDestroy()。
两种启动服务的方法:
①startService():启动服务
②bindService():启动服务后可以进行有限交互。
onCreate():第一次创建服务时执行的方法
onStartCommand():调用startService()方法启动服务时执行的方法。
onBind():调用bindService()方法启动服务时执行的方法。
onUnbind():调用unBindService()方法断开服务绑定时执行的方法。
onDestory():服务被销毁时执行的方法。
9.4服务的启动方式
1,调用startService()方法启动服务。
2,调用bindService()方法启动服务
9.5服务的通信
通过bindService()方法开启服务后,服务与绑定服务的组件是可以通信的,通过组件可以控制服务并进行一些操作。
1,本地服务通信和远程服务通信
本地服务通信是指应用程序内部的通信。远程服务通信是指两个应用程序之间的通信。
①本地服务通信:首先需要创建一个Service类,该类会提供一个onBind()方法,onBind()方法的返回值是一个lBinder对象,lBinder对象会作为参数传递给ServiceConnection类中的onServiceConnected(ComponentName name,IBinder service)方法。这样访问者就可以通过lBinder对象与service进行通信。
②远程服务通信:完成不同进程之间的通信。它是通过AIDL实现的。
AIDL语言:AIDL定义接口的源代码必须以.aidl结尾。AIDL接口中用到的数据类型,除了基本数据类型String,List,Map,CharSequence之外,其他类型全部都需要导入包,即使它们在同一个包中。