安卓中调用用本地服务和远程服务的方法

自己new服务是得不到上下文的
bindService的flags是指
BIND_AUTO_CREATE是指如果服务不存在,就创建它

ServiceConnection里未实现的两个方法 分别是 连接成功 取消连接调用的方法

对比

  • startService()
    缺陷: 我们不可以调用服务的方法,不可以与服务进行通信
  • bindService()
    可以间接的调用到服务里面的方法,可以与服务进行通信

绑定服务调用服务方法的步骤

  1. 编写服务代码
  2. 在服务内部定义一个代理人对象 MyBinder
  3. 在onBind方法里面返回代理人对象
  4. 在Activity代码采用绑定的方式连接到服务
  5. 在ServiceConnection的实现类里面有一个方法,获取到服务返回的代理人对象
  6. 强制类型转换IBinder转化成MyBinder类型
  7. 调用代理人对象的方法可以达到间接调用服务里面的方法

绑定方式开启服务的生命周期

  • 绑定的方式开启服务,如果服务不存在,先创建onCreate然后绑定onBind
  • 服务的onStart和onStartCommand不会被执行
  • 解除绑定服务 onUnbind执行后onDestroy
  • 多次的绑定服务,服务只会被创建一次,onCreate方法只会被执行一次
  • 多次绑定服务,onBind方法不会被重复的调用
  • 在实际开发的时候,如果需要调用服务的方法,就绑定服务,只能绑定一次
  • 服务只可以被解绑一次,如果用同一个conn对象多次解绑,服务会抛出异常

两种开启服务方式的比较

  • start的方式开启服务

    服务一旦开启,长期后台运行,服务和开启者(Activity)没有任何关系,开启者退出了, 服务还是继续在后台长期运行,开启者(Activity)不可以调用服务里面的方法.在系统设置界面里面可以观察到

  • bind的方式开启服务

    不求同时生,但求同时死,如果开启者(Activity)退出了,服务也会跟着挂掉
    开启者(Activity)可以间接的利用中间人调用服务里的方法.在系统设置界面看不到
    在解除绑定时需要将接口引用置null,不然解除绑定后依然可以调用方法

服务如果被开启同时被绑定,服务就停不掉了,必须解除绑定服务才可以停止服务

混合的方式开启服务

  • 为了保证服务又能长期后台运行,又能调用服务里面的方法
  • 采用混合的方式开启服务

请严格按照步骤编写代码

  1. start的方式开启服务(保证服务在后台长期运行)
  2. bind的方式绑定服务
  3. 调用服务里面的方法
  4. unbind的方式解除服务绑定
  5. stop方式停止服务

本地服务和远程服务

  • 本地服务 local service

    服务的代码在当前应用程序的内部

  • 远程服务 remote service

    服务的代码在另外一个应用程序里面

重要概念

  • 进程

    操作系统分配的独立的内存空间

  • IPC

    inter process communication进程通讯

  • AIDL

    android interfacce definition language 安卓接口定义语言

绑定远程服务调用服务方法的流程

  1. 跟本地服务的代码编写是一样的
  2. 远程服务的接口定义文件.java改成.aidl
  3. 把接口定义文件的访问修饰符全部删除掉例如public private
  4. 原来代理人MyBinder extends Binder implements IService改成MyBinder extends IService.Stub
  5. 先把远程服务.aidl文件拷贝到本地应用程序的工程目录里面,包名需要一致
  6. iService = IService.Stub.asInterface(service)可以获得远程应用程序的代理人
  7. 调用远程应用程序的方法(出现远程服务的异常可以捕获)

你可能感兴趣的:(安卓基础,android,service)