Android BindService 简单使用
一、BindService
在Android开发中,启动Service有两种方式:bindService和startService。本文重点介绍的是bindService,也算是记录一下自己的学习过程,便于回顾。
首先看一下,bindService这个方法:
bindService(Intent service, ServiceConnection conn,int flags)
复制代码
Intent:就是你要绑定的服务,需要明确的声明。
ServiceConnection:一个接口,包含两个回调onServiceConnected和onServiceDisconnected
flags:一般选用BIND_AUTO_CREATE,下面的分析都是基于这个flag
BIND_AUTO_CREATE:当bindService时,该服务如果不存在则自动创建该服务,Service生命周期:onCreate-->onBind;如果服务存在,只会调用onBind;
绑定服务:
Intent intent = new Intent();intent.setClassName("com.dyj.aidldemocallback", "com.dyj.aidldemocallback.BookManagerService");bindService(intent, mServiceConnection, BIND_AUTO_CREATE);
复制代码
绑定服务成功之后,会回调onServiceConnected,当服务端意外挂掉之后,会回调onServiceDisconnected。
当服务端意外挂掉之后,等1s,系统会再次尝试去bind服务端一次:
Scheduling restart of crashed service com.dyj.aidldemocallback/.BookManagerService in 1000ms
复制代码
如果服务端再次挂掉,系统则不会再去尝试bind服务端:
Service crashed 2 times, stopping: ServiceRecord{24f5e9af u0 com.dyj.aidldemocallback/.BookManagerService}
复制代码
如果当服务端挂掉的时候,不想让系统主动再去bind服务端的话,可以在onServiceDisconnected方法中直接调用unbindService。
有以下几点需要注意:
1.只要调用了bindService,不管是否bind成功,当进程退出的时候都应当调用unbindService,释放资源
2.bindService可以多次调用,unbindService只能调用一次(指的是,绑定成功之后,只能调用一次)。
当调用unbindService时,Service生命周期:onUnbind-->onDestroy
二、服务端和客户端通信
当Service绑定成功之后,服务端和客户端就可以进行通信了,可以使用AIDL进行通信,这里写一个简单的demo。
新建一个工程,然后创建两个aidl文件:IManagerInterface 和 ICallbacklInterface
// ICallbacklInterface.aidl
package com.dyj.aidldemocallback;// Declare any non-default types here with import statementsinterface ICallbacklInterface {void call();
}
复制代码
// IBookManagerInterface.aidl
package com.dyj.aidldemocallback;import com.dyj.aidldemocallback.ICallbacklInterface;// Declare any non-default types here with import statementsinterface IManagerInterface {void test();void setCallBack(ICallbacklInterface callback);
}
复制代码
然后,build一下工程,会在build\generated\source\aidl下面生成两个同名的java文件,待会要用到。
先看一下服务端的实现,当客户端bind服务端时,服务端要返回一个IBinder给客户端,所以,服务端需要创建一个IBinder实例,如下:
private ICallbacklInterface mICallbacklInterface;private Binder mBinder = new IManagerInterface.Stub() {@Overridepublic void test() throws RemoteException {Log.d(TAG, "[Server] client call server test:" + Thread.currentThread().getName());mICallbacklInterface.call();}@Overridepublic void setCallBack(ICallbacklInterface callback) throws RemoteException {mICallbacklInterface = callback;}
};
复制代码
客户端通过这个Binder,就可以创建IManagerInterface实例了,然后就可以调用服务端的方法了,服务端如果想方便的获取客户端的某些数据,可以通过接口回调的方式,ICallbacklInterface就是客户端提供给服务端的一个接口。服务端到此就完事了,接下来看一下客户端的实现。
首先,将服务端生成的那两个java文件,拷贝到客户端,确保和服务端的路径是一样的(包名相同),然后客户端要创建一个ServiceConnection对象:
private ServiceConnection mServiceConnection = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {Log.d(TAG, "[Client] onServiceConnected success :" + Thread.currentThread().getName());mIBookManagerInterface = IManagerInterface.Stub.asInterface(service);try {mIBookManagerInterface.setCallBack(mICallbacklInterface);mIBookManagerInterface.test();} catch (RemoteException e) {e.printStackTrace();}}@Overridepublic void onServiceDisconnected(ComponentName name) {unbindService(mServiceConnection);Log.d(TAG, "[Client] onServiceConnected fail :" + Thread.currentThread().getName());}
};
复制代码
然后调用一下bindService就可以了,运行效果如下:
编写AIDL文件时要注意导包,即使在同一个包中,也要进行导包!
demo源码:github.com/dyjAndroid/…
Android BindService 简单使用相关推荐
- android音乐播放器实现,Android实现简单音乐播放器(MediaPlayer)
Android实现简单音乐播放器(MediaPlayer),供大家参考,具体内容如下 开发工具:Andorid Studio 1.3 运行环境:Android 4.4 KitKat 工程内容 实现一个 ...
- Android——一个简单的APP模版
Android--一个简单的APP模版 述 效果视频 技术栈 地图.定位.导航 地图 定位 导航 偏好设置 当前导航信息 预定车位和订单结算 创建订单 计时服务传导 后台服务计时 订单结算 个人信息 ...
- Android Studio简单设置
2019独角兽企业重金招聘Python工程师标准>>> Android Studio 简单设置 界面设置 默认的 Android Studio 为灰色界面,可以选择使用炫酷的黑色界面 ...
- 简单Android手机APP地图,android最简单手机地图APP(只需5分钟)
android最简单手机地图APP--只有三部分. 第一部分 首先建立一个MapActivity在setContentView(R.layout.activity_map);中创建一个代码如下. [h ...
- android仿微信的activity平滑水平切换动画,Android实现简单底部导航栏 Android仿微信滑动切换效果...
Android实现简单底部导航栏 Android仿微信滑动切换效果 发布时间:2020-10-09 19:48:00 来源:脚本之家 阅读:96 作者:丶白泽 Android仿微信滑动切换最终实现效果 ...
- 【转】Android Studio简单设置
原文网址:http://ask.android-studio.org/?/article/14 Android Studio 简单设置 界面设置 默认的 Android Studio 为灰色界面,可以 ...
- Android JNI简单实例(android 调用C/C++代码)
转载自 xiechengfa 最终编辑 xiechengfa Android JNI简单实例关键字: android.jni Android的jni实例 android 的应用程序(Dalvik VM ...
- android Glide简单使用
今天,简单讲讲Android里Glide的简单使用. Android框架系列: 一.android EventBus的简单使用 二.android Glide简单使用 对于Glide这个加载图片的框架 ...
- android加法服务类,iOS越来越像Android:苹果简单做加法远离精致
原标题:iOS越来越像Android:苹果简单做加法远离精致 刚刚结束的WWDC2016的主题演讲中,苹果为我们带来了最新的iOS 10系统,官方称本次iOS 10的推出有着多大10项的重要更新,在用 ...
最新文章
- gst-crypto GStreamer插件
- Android性能优化之图片压缩优化
- 【九度OJ】题目1206:字符串连接
- window opengl
- idea中生成mapper xml文件,快速从代码跳转到mapper及从mapper返回代码的插件安装
- CentOS 7配置Let’s Encrypt支持免费泛域名证书
- sdut 汉诺塔系列2
- 计算机图形学笔记 (第一周)
- 参加集成电路EDA设计精英挑战赛的体会
- 2020年 Java开发者进阶手册.pdf(吐血整理)
- 1.5.PHP7.1 狐教程-(PHP开发工具 PHPStorm 配置)
- Gephi入学教程基础记录
- CCS软件的基础使用(以点灯为例)
- redis实现队列的几种方式(LPUSH/BRPOP,发布/订阅模式,stream)
- JVM快速入门(下)
- 小白的测试人生(三)小白如何进入IT行业及如何选择培训机构
- 写给那些进步缓慢却全然不知的IT人
- libnet编译,windows/Linux
- 组件分享之后端组件——用于将日志写入滚动文件的组件包lumberjack
- 解决tomcat7安装后启动时一闪而退的bug