码迷,mamicode.com
首页 > 其他好文 > 详细

Service

时间:2015-07-04 12:26:23      阅读:117      评论:0      收藏:0      [点我收藏+]

标签:

为什么要使用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里面的方法

 

Service

标签:

原文地址:http://www.cnblogs.com/xxr2015/p/4620374.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!