android serviceconnection unbind流程,Android - Service Bind/Unbind 使用
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 使用相关推荐
- android p 权限流程,Android native 权限控制流程
关联文章: 前言: 在 Android Runtime Permission 详解 中详细的说明了permission 在Android 6.0 前后的区别,对于M 以后应用可以通过checkPerm ...
- android zygote启动流程,Android zygote启动流程详解
对zygote的理解 在Android系统中,zygote是一个native进程,是所有应用进程的父进程.而zygote则是Linux系统用户空间的第一个进程--init进程,通过fork的方式创建并 ...
- android屏幕适配流程,Android屏幕适配姿势
GitHub地址 为什么要屏幕适配? device_framentation.png 统计 碎片化 品牌机型碎片化 屏幕尺寸碎片化 操作系统碎片化 为了保证用户获得一致的用户体验效果,使得某一元素在A ...
- android otg 挂载流程,android USB OTG功能如何打开及实现
1.检查HW原理图,确认是否支持OTG功能(vbus是否供上电,IDDIG pin链接是否正确) 2.若HW确认支持OTG功能,则按照如下方法分别打开USB OTG功能及实现挂载: 如何打开USB O ...
- android wifi wps 流程,android中WiFi wps连接方式
Android 个人热点 wps方式连接流程 android手机开启个人热点时,可以选择WPS连接方式 个人热点端 连接端 当个人热点端选择按钮时,连接端只需要点击WPS按钮即可连接:当个人热点端选择 ...
- android serviceconnection unbind流程,Android Service 再次 unbindSrvice 时的问题
在 Android Service 未被绑定的情况下,调用 unbindService(connection) 会报错误:service Service not registered, 所以在解除绑定 ...
- android serviceconnection unbind流程,Android unbindService 流程分析
基于Android 6.0的源码剖析, 分析bind service的启动流程. /frameworks/base/core/java/android/app/ContextImpl.java /fr ...
- android 蓝牙扫描流程,Android 9.0 Bluetooth源码分析(二)蓝牙扫描流程
1 UI 蓝牙开始扫描位于setting的 /packages/apps/Settings/src/com/android/settings/bluetooth/BluetoothPairingDet ...
- Android 安装apk流程,Android PMS(二)-Apk安装流程
原创内容,转载请注明出处,多谢配合. 一.APK组成 在APK的安装流程,在此之前先简单了解下APK组成: 目录/文件 描述 assert 存放的原生资源文件,通过AssetManager类访问. l ...
最新文章
- JAVA控件属性列表_Gradle获取项目属性列表
- 在项目中学习.NET的JQuery CheckBox方法(全选、取消全选、其他)
- CodeForces 258D Little Elephant and Broken Sorting(期望)
- redis lua 抽奖 PHP,通过redis+lua实现加减库存
- [转]JavaScript面向对象的特性
- Kubernetes的共享GPU集群调度 1
- Protobuf生成Java代码(命令行)
- Mac系统搭建java开发环境
- 旧版sai笔刷_sai笔刷包最新下载
- Scala(一):概述
- Discuz仿今日头条模板/Discuz新闻资讯商业版GBK模板
- Genymotion安卓模拟器常见问题汇总
- (NO.00005)iOS实现炸弹人游戏(一):游戏的整体规划设计
- 五大浏览器js 判断IE、Firefox、Safari、Chrome、Opera
- excel 表做下拉框_Excel工作表的组合框下拉列表
- html 获取浏览器语言,js之获取浏览器语言
- CVE-2012-4792 漏洞利用学习笔记
- 流量为王:收益最大化的混排机制
- ameya30代理品牌尼得科电风扇专用无刷直流马达和扇叶模组
- 手机怎么把证件照缩小到100k以下?手机照片如何压缩变小?
热门文章
- 购物管理系统(管理员,客户)
- 如何提高效率(In memory of Aaron Swarts)
- Educational Codeforces Round 65 (Rated for Div. 2)A. Telephone Number
- KB958644系统补丁
- 文科女生读计算机专业难读吗,特别喜欢计算机专业 但读的是文科 进入大学后会不会学不懂啊...
- Microsoft To-Do无法同步问题
- 计算机组成原理 xilinx ise 4位定点二进制模型,计算机组成原理作业讲解4章-答案...
- 培训服务器协议书,培训服务期协议签订时的注意事项
- GCC(GNU Compiler Collection,GNU编译器套件)
- xilinxFPGA使用差分信号及差分信号有关的原语