标签:
为什么要使用service?
这是因为service这个组件会长期的在后台运行,一般情况下不会被操作系统回收,setForeground(true);设置为前台进程。
一、服务的两种生命周期
1、服务可以通过startservice(intent)开启 ,通过stopservice(intent) 停止
* onCreate() 只会执行一次,服务创建后,onCreate()就不会被执行了
* onStart()
* onDestroy() 服务被停止的时候
2、服务通过bandService(service, conn, Context.BIND_AUTO_CREATE);
* onCreate()
* onBind ()
* onUnbind()
* onDestroy()
注意:
首先 如果服务不存在 就会执行 oncreate() ->onbind()方法
一旦服务绑定成功 以后再去执行 bindsercie() 就不会在重新创建 或者绑定服务了
如果我们显示的调用unbindservice()的方法
首先 on unbind()方法 -> ondestroy() ;
服务只能被解除绑定一次 多次解除绑定服务 程序会出异常.
3、绑定服务和开启服务的区别?
3.1 开启服务 (startservice)
* 服务一旦开启与调用者没有任何的关系 , 调用着的activity 即便是退出了 也不会影响后台的service的运行.
* 在activity里面 不能去调用服务里面的方法 .
3.2 通过绑定方式开启服务(bindservice)
* 服务跟调用者不求同生 ,但求同死.
* 如果调用者(activity)退出了 那他绑定的服务呢 也会跟着退出.但是会报 leaked ServiceConnection错误
解决问题的方法:在Activity里重写onDestroy方法,unbindService(conn);显示解除服务
* 可以在Activity里面调用服务里面的方法,利用 serviceSonnection 接口 返回一个ibinder对象,拿着ibinder对象获取到服务里面方法的引用(自定义了一个接口信息) ,调用服务里面的方法
* 一个应用程序 一个进程里面 定义一个IService 的接口来描述方法
如果我们要调用另外一个进程 服务里面的方法 aidl(android interface defination language)
二、总结流程
1.要想访问 一个服务里面的方法 我们需要用到 bindservice();
* 创建一个服务 这个服务里面有一个要被调用的方法.
* 定义一个接口IService , 接口里面的抽象方法 就是去调用service里面的方法
* 定义一个mybinder对象 extends IBinder对象 实现 我们声明的接口IService, 在onbind方法里面把mybinder返回回去
* 在activity里面 通过bindservice的方法开启服务
* 创建出来一个我们MyConn 实现 ServiceConnection接口 onserviceConnected的方法,这个方法会有一个参数 这个参数就是 MyBinder的对象
* 把mybinder强制类型转化成 IServcie
* 调用IService里面的方法
2.要想访问一个远程服务里的方法 需要用到aidl
* 创建一个服务 这个服务里面有一个要被调用的方法.
* 定义一个接口IService , 接口里面的抽象方法 就是去调用service里面的方法,把.java的后缀名改成aidl 把接口里面定义的访问权限的修饰符都给删除
* 定义一个mybinder对象 extends IService.Stub, 在onbind方法里面把mybinder返回回去
* 在activity里面 通过bindservice的方法开启服务
* 创建出来一个我们MyConn 实现 ServiceConnection接口 onserviceConnected的方法,这个方法会有一个参数 这个参数就是 MyBinder的对象
* IService = IService.Stub.asInterface(myBinder)
* 调用IService里面的方法
标签:
原文地址:http://www.cnblogs.com/xxr2015/p/4620374.html