有缘千里来相会 优秀的小伙伴你又来了
大家好 我是菠萝派 今天我们来继续研究一下service
首先咋们了解一下Service的生命周期
oncreate
在每个service的生命周期中这个方法仅会调用一次 并且他的调用在onStartCommand()和onBind之前我们可以在这个方法中进行一些一次性的初始化工作
onStartCommand
当其他组件通过startService()方法启动service时,此方法将会被调用
onBind当其他组件通过bindService()方法与service相绑定之后,此方法将会被调用这个方法有一个Ibind返回值 这意味着再重写他的时候必须返回一个Ibind对象 他是用来支撑其他组件与service之间的通信的---另外,如果你不想让这个service被其他组件所绑定,可以通过这个方法返回一个null值来实现
onDestroy
这是service一生中调用的最后一个方法当这个方法被调用后,service就会被销毁,我们应当在这个方法里面进行一些资源的清理,比如注册一些监听器什么的
个人:
oncreate 创建 只会调用一次
onstartCommand(启动命令) 其他组件 不包括broatcast receiver 通过startService启动service是 该方法会被调用
onBind 当其他组件通过bindService绑定service时,会调用 主要是用来绑定的
onDestroy:结束服务的
还有就是service的属性直接看看官方的最新介绍:https://developer.android.google.cn/guide/topics/manifest/service-element#proc
了解完service的基本使用后
我们需要了解一下bindservice的使用 这里涉及到的还是相当多的 闲话不多说 步入正文
要完成客户端与服务端的绑定,有两件事情要做 一是在客户端完成bindService的调用及其相关配置
,二是在服务端里面实现onBind()方法的重写,返回一个用作信息交互的Ibinder接口
个人:Bindservice的使用 需要服务端 与 客户端 在服务端重写onBind方法 返回一个用作信息交互的Ibinder方法 另外一个在客户端使用bindService的调用及其配置
客户端的配置
客户端原则上来讲调用bindservice方法就可以了,然而事实没有那么简单 原因出在bindService上面
public boolean bindService(Intent inten,ServiceConnection connection,int flags){
return mbase.bindService(service,conn,flgs);
}
可以看到,bindService需要三个参数,第一个是intent等同于startService的那个intent如
Intent intent = new Inten(MainActivity,this,ServiceDemo.class);
startService(intent);
用来启动哪一个service以及传递一些数据过去
第二个参数很陌生,他是实现客户端与服务端通信的一个关键类.要想实现它,就必须重写两个回调方法:onServiceConnected 以及OnServiceDisconnected(),而我们可以通过两个回调方法得到服务端里面的Ibinder对象 从而达到通信的目的
bindService方法的第三个参数是一个int值,还叫flag(这flag立的)它是用来做什么的 他是一个指示绑定选项的标志 通常应该是BIND_AUTO_CRATE,以便创建尚未激活的服务 其他可能的值为BIND-DEBUG_UNBIND和BIND_NOT_FOREGROUND或0(表示无)
个人:bindService的第三个参数 有三种方式
BIND_AUTO_CRATE 创建没有激活的服务
BIND_DEBUG_UNBIND 结合调试解开
BIND_NOT_FOREGROUND 绑定没有前景
接下来说一说服务端要进行的操作:
如果要创建一个支持绑定的service,我们必须要重写它的onBind()方法。这个方法会返回一个IBinder对象,它是客户端用来和服务器进行交互的接口。而要得到IBinder接口,我们通常有三种方式:继承Binder类,使用Messenger类,使用AIDL。
可以看到 这里提出了一个Ibinder接口 他是很重要的 为了提高性能而设计的轻量级远程调用机制的核心部分 当然 它不仅仅可以远程调用 也可以用在进程内调用 事实上 我们现在所说的service这里的Ibinder即有可能出现IPC(进程间通信)也有可能出现进程内调用的场景 比如用它来进行进程内客户端与服务器的交互 Ibinder 的具体原理先不说 咋们初步了解一下 为了Aidl打下基础
通俗的说 获得IBinder的三种方式:继承Binder类,使用Messager类,使用Aidl 接下来我就以这三种方式展开:
个人小结:
binder 想对与以前学的东西而言 已经是比较高深点的东西了 推荐一个博客 是专门讲Binder的https://www.jianshu.com/p/04a034cbbc27!
好了 今天就讲到这里 咋们明天就讲如何简单的实现Aidl通信