Service,服务,是一种需要长期后台运行的进程,例如,数据的更新,定时的轮询,监视硬件的插入等
一、简介
Service是一种中生命周期比较长的组件,没有界面不与用户交互;长期运行在后台执行与界面无关
的操作;与Thread类似,但是使用线程不安全;最重要的一点是Service也是运行在主线程的,不能做耗
时的操作
二、详解
1.首先了解一下Android中的线程知识
线程由高到低为:前台-可视-服务-后台-空进程
线程的回收是从低到高的,当内存不足时,会先从空进程开始从低到高回收;服务的级别是比较高的
一般情况下不会被回收,一旦被回收,那么在内存充足时,系统会自动启动被回收掉的服务
2.如何使用
创建类继承Service,并且在清单文件中配置service节点
开启服务
3.生命周期
Started Service标准模式开启
其他组件调用startService方法开启,这种Service可以无限制运行下去,除非调用stopSelf方
法或者其他组件调用stopService方法,但是只能被停止一次
BoundService绑定服务
调用者用bindService方法绑定服务,调用者通过一个IBinder接口和service通信,调用者也可
用unBindService方法解除绑定;一个Service也可和多个用户进行绑定,所有用户解除绑定后才会
销毁service
bindService(service, serviceConnection, BIND_AUTO_CREATE);
一旦绑定成功后,服务内部的onBind方法执行,并且只执行一次,再次绑定不执行
serviceConnection参数:ServiceConnection的对象,要重写onServiceConnected,绑
定成功后执行此方法,方法中的IBinder接收onBind返回的数据
BIND_AUTO_CREATE:如果绑定的服务不存在那么创建出来
混合模式
先用startService方式开启,然后绑定服务,这时,单纯的stopService和stopSelf方法关闭
不了服务,除非所有用户都解绑才可以关闭
使用混合模式要严格遵守以下步骤
start()开启服务
bind()绑定服务
unbind()解除绑定
stop方式停止服务
4.两种开启方式区别
不同一
start()开启后服务与开启者无任何关系,调用者退出后,service也会继续执行
bindService()开启后,调用者退出service也会退出(非正常退出),可以在onDestory中解除绑定
不同二
bingService开启服务后可以调用service中的方法,而start不能
5.绑定服务步骤
编写服务代码
public IBinder onBind(Intent intent){}
服务内部定义代理人对象MyBinder
代理人对象中有一个方法可以调用服务内部的方法
onBind方法中返回代理人对象
在activity中采用绑定服务的方法
bindService(service, serviceConnection, BIND_AUTO_CREATE);
ServiceConnection中一个实现类获取返回的代理人MyBinder对象
public void onServiceConnected(ComponentName name,IBinder service){}
强制类型转换IBinder为MyBinder
mybinder=(MyBinder)service
通过mybinder调用服务中的方法
6.服务分类
本地服务:服务在当前应用程序内部
远程服务:服务在其他应用程序
绑定远程服务方法
a.代码编写与绑定本地服务一样
b.远程服务的接口定义文件.java-->.aidl
c.接口定义文件中的访问修饰符全删掉public private
d.原来代理人MyBinder extends Binder implements Iservice --->extends IService.Stub
e.把远程服务的aidl文件拷在本地,目录名要一致
f.iservice = IService.Stub.asInterface(service)得到远程服务对象
g.调用远程服务中方法
三、小结
学的东西很多,短时间内不能很好的理解,动手写博客的时候无从下手,看着笔记一点一点的回忆,
开始做项目,用的也是一些基本的service知识
预习--总结--复习--回顾