一、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 简单使用相关推荐

  1. android音乐播放器实现,Android实现简单音乐播放器(MediaPlayer)

    Android实现简单音乐播放器(MediaPlayer),供大家参考,具体内容如下 开发工具:Andorid Studio 1.3 运行环境:Android 4.4 KitKat 工程内容 实现一个 ...

  2. Android——一个简单的APP模版

    Android--一个简单的APP模版 述 效果视频 技术栈 地图.定位.导航 地图 定位 导航 偏好设置 当前导航信息 预定车位和订单结算 创建订单 计时服务传导 后台服务计时 订单结算 个人信息 ...

  3. Android Studio简单设置

    2019独角兽企业重金招聘Python工程师标准>>> Android Studio 简单设置 界面设置 默认的 Android Studio 为灰色界面,可以选择使用炫酷的黑色界面 ...

  4. 简单Android手机APP地图,android最简单手机地图APP(只需5分钟)

    android最简单手机地图APP--只有三部分. 第一部分 首先建立一个MapActivity在setContentView(R.layout.activity_map);中创建一个代码如下. [h ...

  5. android仿微信的activity平滑水平切换动画,Android实现简单底部导航栏 Android仿微信滑动切换效果...

    Android实现简单底部导航栏 Android仿微信滑动切换效果 发布时间:2020-10-09 19:48:00 来源:脚本之家 阅读:96 作者:丶白泽 Android仿微信滑动切换最终实现效果 ...

  6. 【转】Android Studio简单设置

    原文网址:http://ask.android-studio.org/?/article/14 Android Studio 简单设置 界面设置 默认的 Android Studio 为灰色界面,可以 ...

  7. Android JNI简单实例(android 调用C/C++代码)

    转载自 xiechengfa 最终编辑 xiechengfa Android JNI简单实例关键字: android.jni Android的jni实例 android 的应用程序(Dalvik VM ...

  8. android Glide简单使用

    今天,简单讲讲Android里Glide的简单使用. Android框架系列: 一.android EventBus的简单使用 二.android Glide简单使用 对于Glide这个加载图片的框架 ...

  9. android加法服务类,iOS越来越像Android:苹果简单做加法远离精致

    原标题:iOS越来越像Android:苹果简单做加法远离精致 刚刚结束的WWDC2016的主题演讲中,苹果为我们带来了最新的iOS 10系统,官方称本次iOS 10的推出有着多大10项的重要更新,在用 ...

最新文章

  1. gst-crypto GStreamer插件
  2. Android性能优化之图片压缩优化
  3. 【九度OJ】题目1206:字符串连接
  4. window opengl
  5. idea中生成mapper xml文件,快速从代码跳转到mapper及从mapper返回代码的插件安装
  6. CentOS 7配置Let’s Encrypt支持免费泛域名证书
  7. sdut 汉诺塔系列2
  8. 计算机图形学笔记 (第一周)
  9. 参加集成电路EDA设计精英挑战赛的体会
  10. 2020年 Java开发者进阶手册.pdf(吐血整理)
  11. 1.5.PHP7.1 狐教程-(PHP开发工具 PHPStorm 配置)
  12. Gephi入学教程基础记录
  13. CCS软件的基础使用(以点灯为例)
  14. redis实现队列的几种方式(LPUSH/BRPOP,发布/订阅模式,stream)
  15. JVM快速入门(下)
  16. 小白的测试人生(三)小白如何进入IT行业及如何选择培训机构
  17. 写给那些进步缓慢却全然不知的IT人
  18. libnet编译,windows/Linux
  19. 组件分享之后端组件——用于将日志写入滚动文件的组件包lumberjack
  20. 解决tomcat7安装后启动时一闪而退的bug

热门文章

  1. 如何批量修改文件名部分字段或文字?
  2. JQuery中ajax,get方法在asmx中的使用
  3. 7精通 S T L(C++标准模板库)-王桂林-专题视频课程
  4. 安卓通过DIRECT IO和加密TF卡通信
  5. 安装CTeX后Texworks不能读写.eps图片?
  6. 苹果WWDC2017 开发者大会,机器学习已得到广泛应用
  7. WebSplider在线爬虫
  8. 【SSH网上商城项目实战22】获取银行图标以及支付页面的显示
  9. 第三方库的认识与使用
  10. 自动生成文件目录列表