BindService() 绑定方式开启服务
来源:互联网 发布:淘宝垃圾客服 编辑:程序博客网 时间:2024/05/16 17:22
Bind方式开启服务
tags:Android
首先来看一下启动服务的两种方式startService和bindService:
startService
StartService(Intent intent)
start的方式只能简单的开启服务,并且开启之后基本不能敢于服务的运行逻辑,话句话说,开启后服务就和开启服务的线程没什么关系了。但是通常我们都是更加紧密的去联系服务,可能会获取一些运行的结果,比如执行结果,进度信息等,那就需要使用bind的方式开启服务了
bindService
bindService地方法就比较丰富,其传入三处有三个,类型分别为Intent,ServiceConnection,Int.其中第一个就不细说了,意图大家都明白,第二个为接口,其中包含两个必须实现的方法:onServiceConnected(ComponentName var1, IBinder var2)代表服务连接,第一个参数暂且不提,第二个先记住它叫Ibindr,后面会提到。onServiceDisconnected(ComponentName var1)代表与服务失去连接第三个参数Int类型就是服务执行的模式。
虽然BindService参数丰富,功能强大,但是其使用逻辑也略微复杂,下面慢慢道来。
采用bind的方法绑定开启服务
a>先new一个类实现ServiceConnection接口,这个类用于为bind方法的第二个是参数做准备,我理解是定义与服务的连接通道。
private class MyConn implements ServiceConnection{ //通道成功连接 @Override public void onServiceConnected(ComponentName componentName, IBinder iBinder) { //此处IService代表在Service中提供一个调用其内部方法的接口,为接口类型 mybinder= (IService) iBinder; Log.d("phone.....","3. 见到服务的代理对象:"+mybinder.toString()); } //通道失去连接 @Override public void onServiceDisconnected(ComponentName componentName) { }}
b>实例化出通道,然后使用执行bind方法。
在外部类:private MyConn comm;内部方法:comm=new MyConn(); bindService(intent,comm, Context.BIND_AUTO_CREATE);其中Context.BIND_AUTO_CREATE代表若服务不存在实例则创建实例
服务内部实现一个代理人类,这个代理继承自Ibinder,也就是上文ServiceConnection中的onServiceConnected方法的一个返回值,这个Ibinder对象就是服务中的代理在阜外外部的一个引用,通过这个引用就可以调用Ibinder实现的接口中的方法。
private class Mybinder extends Binder implements IService{ //由代理去调用服务内部的方法 public void callinService(){ Log.d("phone.....","5. 代理人执行了服务里的方法"); @Override callInService(); }}
定义IService的接口
这个接口就是上文提到的IService接口,这个接口中通常定义想要暴露给外部的方法,外部也只能看到IBinder中实现的这个接口的方法,除非你将上一节中的MyBinder这个类定义为Public。
public interface IService { public void callInService();}
返回代理人对象
具体服务是如何将IBinder的引用返回给外部呢,就是通过Service唯一的必须实现的方法:
@Nullable@Overridepublic IBinder onBind(Intent intent) { //当有需求时,呼叫代理人去接待 Mybinder mybinder=new Mybinder(); Log.d("phone.....","2. 成功绑定,返回服务的代理对象:"+mybinder.toString()); return mybinder;}
实现serviceConnection接口里面的方法
现在你就可以在通道中看到Service的代理对象了:
private class MyConn implements ServiceConnection{@Overridepublic void onServiceConnected(ComponentName name, IBinder service) { myBinder = (IService) service; System.out.println("Activity,得到代理人对象");}
调用接口里面的方法
通过MyBinder这个Service的代理对象,就可以执行服务中对外开放的方法了。当然这个方法就需要你自己去定义了。
mybinder.callInService();
可能看完你还会有点晕,因为文章的书写顺序与代码的实际书写顺序可能并不相同,那么附上一张执行逻辑流程图,你肯定就明白了。
最后的最后,大致说明一下两种方式开启服务的特点
startService
- 生命周期
oncreate()—>onstartcommand()—>onstart()—>onDestroy() - 可以多次调用,不会重复创建,oncreate()只会执行一次
- 以start方式开启的服务也只能停止一次,多次调用stopservice()是无效的
- 以start方式开启的服务与UI线程失去关系,即使UI线程被销毁,服务仍然可以正常运行
- 不能调用服务中的方法
bindService
- 生命周期
oncreate() —>onbind() –>onunbind()—->ondestry(); - 只能成功绑定和解绑一次
- 与绑定的UI线程同时被销毁(一根绳上的蚂蚱^_^)
- 可以调用服务中的方法
混合开启服务
既然start开启的服务不能调用方法,bind方式开启的服务生命力又很弱,那么能否两种方式的有点么?答案当然是肯定的,否则服务的应用能力就太弱了。
- 通过startService()方式开启服务(只能通过调用stopService停止)
- 通过bindService进行绑定,以进行服务的方法调用(当需要的时候)
- 通过unbindService进行解绑(不需要调用方法了,在UI线程被销毁之前解绑)
- 通过stopService停止服务
这样我们就可以灵活的使用Service,当需要的时候可以随时进行调用,不要的时候又可以长期运行于后台而不用保留UI线程。这也是服务最常见的用法。
- BindService() 绑定方式开启服务
- bindService开启服务
- bindService(绑定服务) 流程源码解析
- Android -- service的开启方式, start开启和绑定开启服务,调用服务的的方法, aidl调用远程服务
- 开启服务和绑定服务
- activity以绑定服务的方式开启服务并调用服务里面的方法
- 服务启动方式三-使用bindService方式启动服务
- 服务的开启方式
- 服务的开启方式
- start方式开启服务
- onBind方式开启服务
- Android应用程序绑定服务(bindService)的过程源代码分析
- Android应用程序绑定服务(bindService)的过程源代码分析
- Android应用程序绑定服务(bindService)的过程
- 浅析绑定远程服务bindService基本原理与AIDL分析
- Android通过bindservice方式调用服务的方法
- 安卓服务的启动方式之一 bindService unbindService
- 51服务的开启方式
- 第139课: Spark面试经典系列之数据倾斜解决之对于两个RDD数据量都很大且倾斜的Key特别多如何解决?
- hdu 1212 Big Number(大数取模)
- [git] warning: LF will be replaced by CRLF | fatal: CRLF would be replaced by LF
- 记一下要学的内容
- cocos2dx源码分析:渲染指令收集
- BindService() 绑定方式开启服务
- [莫比乌斯反演] BZOJ 2820 YY的GCD
- Activity中的Intent对象
- pread,pwrite,read,write区别
- 酷酷头像技术支持
- 腾讯课堂的学习开始了!
- linux指令查看tomcat日志
- Android Loader解析
- C++ primer (2) —— 基础