自己new服务是得不到上下文的
bindService的flags是指
BIND_AUTO_CREATE是指如果服务不存在,就创建它
ServiceConnection里未实现的两个方法 分别是 连接成功 取消连接调用的方法
对比
- startService()
缺陷: 我们不可以调用服务的方法,不可以与服务进行通信
- bindService()
可以间接的调用到服务里面的方法,可以与服务进行通信
绑定服务调用服务方法的步骤
- 编写服务代码
- 在服务内部定义一个代理人对象 MyBinder
- 在onBind方法里面返回代理人对象
- 在Activity代码采用绑定的方式连接到服务
- 在ServiceConnection的实现类里面有一个方法,获取到服务返回的代理人对象
- 强制类型转换IBinder转化成MyBinder类型
- 调用代理人对象的方法可以达到间接调用服务里面的方法
绑定方式开启服务的生命周期
- 绑定的方式开启服务,如果服务不存在,先创建onCreate然后绑定onBind
- 服务的onStart和onStartCommand不会被执行
- 解除绑定服务 onUnbind执行后onDestroy
- 多次的绑定服务,服务只会被创建一次,onCreate方法只会被执行一次
- 多次绑定服务,onBind方法不会被重复的调用
- 在实际开发的时候,如果需要调用服务的方法,就绑定服务,只能绑定一次
- 服务只可以被解绑一次,如果用同一个conn对象多次解绑,服务会抛出异常
两种开启服务方式的比较
start的方式开启服务
服务一旦开启,长期后台运行,服务和开启者(Activity)没有任何关系,开启者退出了, 服务还是继续在后台长期运行,开启者(Activity)不可以调用服务里面的方法.在系统设置界面里面可以观察到
bind的方式开启服务
不求同时生,但求同时死,如果开启者(Activity)退出了,服务也会跟着挂掉
开启者(Activity)可以间接的利用中间人调用服务里的方法.在系统设置界面看不到
在解除绑定时需要将接口引用置null,不然解除绑定后依然可以调用方法
服务如果被开启同时被绑定,服务就停不掉了,必须解除绑定服务才可以停止服务
混合的方式开启服务
- 为了保证服务又能长期后台运行,又能调用服务里面的方法
- 采用混合的方式开启服务
请严格按照步骤编写代码
- start的方式开启服务(保证服务在后台长期运行)
- bind的方式绑定服务
- 调用服务里面的方法
- unbind的方式解除服务绑定
- stop方式停止服务
本地服务和远程服务
本地服务 local service
服务的代码在当前应用程序的内部
远程服务 remote service
服务的代码在另外一个应用程序里面
重要概念
进程
操作系统分配的独立的内存空间
IPC
inter process communication进程通讯
AIDL
android interfacce definition language 安卓接口定义语言
绑定远程服务调用服务方法的流程
- 跟本地服务的代码编写是一样的
- 远程服务的接口定义文件.java改成.aidl
- 把接口定义文件的访问修饰符全部删除掉例如public private
- 原来代理人MyBinder extends Binder implements IService改成MyBinder extends IService.Stub
- 先把远程服务.aidl文件拷贝到本地应用程序的工程目录里面,包名需要一致
- iService = IService.Stub.asInterface(service)可以获得远程应用程序的代理人
- 调用远程应用程序的方法(出现远程服务的异常可以捕获)