Service Bind/Unbind 使用方式

本文介绍了本地服务,也就是同一个进程内的服务,如何使用 Bind/Unbind 方式被 Activity 使用。

本文不涉及 AIDL 使用 Service 的方式。

使用者 Activity 与 Service 关系紧密,绑定在一起,通过 Binder 对象进行通信。

绑定时如果服务没启动,则会执行初始化,但不会走 onStatCommand()。

一个 Service 可以被多个使用者绑定。

绑定 Service 和启动 Service 可以同时使用。

举例:音乐播放器,可以通过Service在后台使用,开始播放 Start Service。在播放过程中要暂停、上一首、下一首等操作,使用 Bind Service 与其通信。

同时使用兼具两者的特点,互相影响的地方是创建和销毁:没初始化时,只要有 Bind 或者 Create 就会初始化。Stop 不会导致 Binding 状态的服务销毁,同样 unbind 也不会导致已启动的服务销毁。

AIDL 用来定义复杂接口,实现跨进程的服务调用。

代码套路

生命周期

// 绑定服务

MyBindService()

MyBindService.onCreate()

MyBindService.onBind()

ServiceConnection.onServiceConnected()

// 解绑服务

MyBindService.onUnbind()

MyBindService.onDestroy()

manifest 注册

android:name=".services.MyService"

android:enabled="true"

android:exported="false" />

代码

定义

import android.app.Service;

public class MyService extends Service {

}

声明一个接口

public interface MyIBinder {

int calculate(int a, int b);

}

创建一个Service的内部类继承 Binder 并实现这个接口

public class MyBinder extends Binder implements MyIBinder {

@Override

public int calculate(int a, int b) {

return MyService.this.calculate(a, b);

}

}

onBind() 方法返回这个内部类的对象

@Override

public IBinder onBind(Intent intent) {

Log.d(TAG, "onBind: ");

return new MyBinder();

}

在 Activity 中创建一个第 2 步的接口变量。

private MyService.MyIBinder mServiceBinder;

在 Activity 中创建一个ServiceConnection 对象,在 onServiceConnected 方法中,将 IBinder 类型的参数转换为 MyIBinder 类型。

private ServiceConnection mConnection = new ServiceConnection() {

@Override

public void onServiceConnected(ComponentName name, IBinder service) {

Log.d("MyService", "onServiceConnected: ");

mServiceBinder = (MyService.MyIBinder) service;

}

@Override

public void onServiceDisconnected(ComponentName name) {

Log.d("MyService", "onServiceDisconnected: ");

mServiceBinder = null;

}

};

绑定 Bind

private void doBind() {

Intent intent = new Intent(this, MyService.class);

if (bindService(intent, mConnection, Context.BIND_AUTO_CREATE)) {

shouldUnbind = true;

} else {

Log.e(TAG, "doBind: bind failed");

}

}

与 Service 通信

@Override

public void onClick(View v) {

if (id == R.id.useService) {

int result = mServiceBinder.calculate(10, 4);

}

}

解绑 Unbind

private void doUnbind() {

if (shouldUnbind) {

unbindService(mConnection);

shouldUnbind = false;

}

}

在 onDestroy 解绑

@Override

protected void onDestroy() {

doUnbind();

super.onDestroy();

}

其中第 5 步在 Activity 中创建一个 MyIBinder 接口对象,也可以直接将 Service 本身传递给 Activity。官方文档上的例子就是这么写的,更直接一点。

异常和问题

未绑定时不能调用 unbind 方法,会崩溃

java.lang.IllegalArgumentException: Service not registered

内存泄漏,在 onDestroy() 中解绑

Activity MainActivity has leaked ServiceConnection MainActivity$1@4eb8a66 that was originally bound here

android serviceconnection unbind流程,Android - Service Bind/Unbind 使用相关推荐

  1. android p 权限流程,Android native 权限控制流程

    关联文章: 前言: 在 Android Runtime Permission 详解 中详细的说明了permission 在Android 6.0 前后的区别,对于M 以后应用可以通过checkPerm ...

  2. android zygote启动流程,Android zygote启动流程详解

    对zygote的理解 在Android系统中,zygote是一个native进程,是所有应用进程的父进程.而zygote则是Linux系统用户空间的第一个进程--init进程,通过fork的方式创建并 ...

  3. android屏幕适配流程,Android屏幕适配姿势

    GitHub地址 为什么要屏幕适配? device_framentation.png 统计 碎片化 品牌机型碎片化 屏幕尺寸碎片化 操作系统碎片化 为了保证用户获得一致的用户体验效果,使得某一元素在A ...

  4. android otg 挂载流程,android USB OTG功能如何打开及实现

    1.检查HW原理图,确认是否支持OTG功能(vbus是否供上电,IDDIG pin链接是否正确) 2.若HW确认支持OTG功能,则按照如下方法分别打开USB OTG功能及实现挂载: 如何打开USB O ...

  5. android wifi wps 流程,android中WiFi wps连接方式

    Android 个人热点 wps方式连接流程 android手机开启个人热点时,可以选择WPS连接方式 个人热点端 连接端 当个人热点端选择按钮时,连接端只需要点击WPS按钮即可连接:当个人热点端选择 ...

  6. android serviceconnection unbind流程,Android Service 再次 unbindSrvice 时的问题

    在 Android Service 未被绑定的情况下,调用 unbindService(connection) 会报错误:service Service not registered, 所以在解除绑定 ...

  7. android serviceconnection unbind流程,Android unbindService 流程分析

    基于Android 6.0的源码剖析, 分析bind service的启动流程. /frameworks/base/core/java/android/app/ContextImpl.java /fr ...

  8. android 蓝牙扫描流程,Android 9.0 Bluetooth源码分析(二)蓝牙扫描流程

    1 UI 蓝牙开始扫描位于setting的 /packages/apps/Settings/src/com/android/settings/bluetooth/BluetoothPairingDet ...

  9. Android 安装apk流程,Android PMS(二)-Apk安装流程

    原创内容,转载请注明出处,多谢配合. 一.APK组成 在APK的安装流程,在此之前先简单了解下APK组成: 目录/文件 描述 assert 存放的原生资源文件,通过AssetManager类访问. l ...

最新文章

  1. JAVA控件属性列表_Gradle获取项目属性列表
  2. 在项目中学习.NET的JQuery CheckBox方法(全选、取消全选、其他)
  3. CodeForces 258D Little Elephant and Broken Sorting(期望)
  4. redis lua 抽奖 PHP,通过redis+lua实现加减库存
  5. [转]JavaScript面向对象的特性
  6. Kubernetes的共享GPU集群调度 1
  7. Protobuf生成Java代码(命令行)
  8. Mac系统搭建java开发环境
  9. 旧版sai笔刷_sai笔刷包最新下载
  10. Scala(一):概述
  11. Discuz仿今日头条模板/Discuz新闻资讯商业版GBK模板
  12. Genymotion安卓模拟器常见问题汇总
  13. (NO.00005)iOS实现炸弹人游戏(一):游戏的整体规划设计
  14. 五大浏览器js 判断IE、Firefox、Safari、Chrome、Opera
  15. excel 表做下拉框_Excel工作表的组合框下拉列表
  16. html 获取浏览器语言,js之获取浏览器语言
  17. CVE-2012-4792 漏洞利用学习笔记
  18. 流量为王:收益最大化的混排机制
  19. ameya30代理品牌尼得科电风扇专用无刷直流马达和扇叶模组
  20. 手机怎么把证件照缩小到100k以下?手机照片如何压缩变小?

热门文章

  1. 购物管理系统(管理员,客户)
  2. 如何提高效率(In memory of Aaron Swarts)
  3. Educational Codeforces Round 65 (Rated for Div. 2)A. Telephone Number
  4. KB958644系统补丁
  5. 文科女生读计算机专业难读吗,特别喜欢计算机专业 但读的是文科 进入大学后会不会学不懂啊...
  6. Microsoft To-Do无法同步问题
  7. 计算机组成原理 xilinx ise 4位定点二进制模型,计算机组成原理作业讲解4章-答案...
  8. 培训服务器协议书,培训服务期协议签订时的注意事项
  9. GCC(GNU Compiler Collection,GNU编译器套件)
  10. xilinxFPGA使用差分信号及差分信号有关的原语