创建 配置 Service:

1、定义一个继承了Service类的子类

2、在 AndroidManifest.xml清单文件中对开发的Service进行配置

Service和Activity很相似,他们都是从Context派生出来的。

Service的方法:

IBinder onBind(Intent intent):该方法是Service子类必须实现的方法。该方法返回一个IBinder对象,应用程序可通过该对象与Service组件进行通信。

onCreate():当Service第一次被创建后将会立即回调该方法

onDestroy():当Service被关闭时会回调该方法

onStartCommand(Intent intent, int flags, int startId):该方法的早期版本是onStart(Intent intent, int startId),每次客户端调用strartService(Intent)方法启动该Service时,都会回调该方法。

onUnbind(Intent intent):当该Service上绑定的所有的客户端都断开连接时将会回调该方法。

清单文件中Service的配置(与Activity类似):

<service android:name=".FirstService">
<intent-filter >
<action />
</intent-filter>
</service>

android中运行Service的方法:

1、通过Context的startService()方法:通过该方法启用Service,访问者与Service之间没有关联,即使访问者退出了,Service仍然运行。

2、通过Context的bindService()方法:使用这种方法启用Service,访问者与Service绑定在一起,访问者一旦退出,Service也就停止了。

启动和停止Service分别调用Context对象的startService()和stopService()方法。

绑定本地Service并与之通信:

当程序通过startService()和stopService()启动和关闭Service时,Service与访问者之间基本上不存在关联,因此访问者和Service之间基本上不能进行通信和数据交换。

如果访问者和Service之间需要数据交换,则应该使用bindService()和unbindService()方法启动和关闭Service。

Context的方法:

bindService(Intent service, ServiceConnection conn, int flags):

service:通过Intent指定要启动的Service

conn:是一个ServiceConnection对象,该对象用于监听访问者与Service之间的连接情况,当访问者与Service之间连接成功时将会回调ServiceConnection的 onServiceConnected(ComponentName name, IBinder service)方法,当访问者与Service之间断开连接时将会回调onServiceDisconnected(ComponentName name)方法。

flags:指定绑定时是否自动创建Service(当Service还为被创建时)。该参数可指为0(不自动创建)或BIND_AUTO_CREATE(自动创建)。

注意到ServiceConnection对象的onServiceConnected方法中的IBinder对象,该对象即可实现与被绑定Service之间的通信。

当开发Service类时,该Service类必须实现一个IBinder onBinder(Intent intent)方法,在绑定本地Service的情况下,onBinder(Intent intent)返回的IBinder对象将会传递给ServiceConnection对象中onServiceConnected方法中的service参数,这样访问者就可以通过IBinder对象与Service进行通信。

实际开发中通常会采用继承Binder(IBinder的实现类)的方式实现自己的IBinder对象。

Service的生命周期:

1、如果应用程序是通过startService()方法来启动Service,Service的生命周期如下图左

1、如果应用程序是通过bindService()方法来启动Service,Service的生命周期如下图右

跨进程调用Service(AIDL服务):

Android中各应用程序都运行在自己的进程中,进程之间一般无法直接进行数据交互。在Android中跨进程数据交换可通过跨进程调用Service。

AIDL服务简介:

客户端访问Service时,Android并不是直接返回Service对象给客户端,只是将一个回调对象(IBinder对象)通过onBind()方法返回给客户端。因此Android的AIDL远程接口的实现类就是那个IBinder的实现类。

与本地Service不同的是,本地Service的onBinder()方法会直接把IBinder对象本身传递给客户端的ServiceConnection的onServiceConnected方法的第二个参数,但是远程Service的onBind()方法只是将IBinder对象的代理传给客户端的ServiceConnection的onServiceConnected方法的第二个参数。

当客户端获取了远程Service的IBinder对象的代理之后,接下来就可以通过该IBinder对象去回调Service的属性或者方法了。

创建AIDL文件:

1、AIDL定义接口的源代码必须以.aidl结尾

2、AIDL接口中用到的数据类型除了基本数据类型之外其他的都需要导入包

AIDL定义了进程之间的通信接口,Service端,客户端都需要使用Android SDK安装目录下的platform-tools子目录下的aidl.exe工具为该接口提供实现。如果使用ADT工具进行开发,那么ADT工具会自动为该AIDL接口生成实现。

interface ICat {
String getColor();
double getWeight();
}

AIDL接口与java接口的语法非常相似。

定义好接口之后ADT会自动生成一个ICat.java接口,在该接口中包含一个Stub内部类,该类实现了IBinder、ICat两个接口,这个Stub将会作为远程Service的回调类——他实现了IBinder接口,因此可作为Service的onBind()方法的返回值。

将接口暴露给客户端:

上一步定义好了AIDL接口之后,接下来就可以定义一个Service实现类,该Service的onBind()方法返回的IBinder对象应该是ADT所生成的ICat.Stub的子类的实例。

对开发好后的Service在清单文件中进行注册。

客户端访问AIDLService

不仅服务端需要AIDL接口定义文件,客户端也需要AIDL接口定义文件,可以将服务端的接口定义文件拷贝到客户端。

客户端绑定远程Service的步骤:

1、创建ServiceConnection对象

2、以ServiceConnection对象作为参数,调用Context的bindService()方法绑定远程Service即可。

绑定远程Service的ServiceConnection并不直接返回Service的onBind()方法返回的对象,而是返回对象的一个代理对象。此时在ServiceConnection的onServiceConnected方法中需要转换一下返回的对象。调用aidl文件生成的接口中的asInterface()方法进行转换。

传递复杂数据的AIDL服务:

Android要求调用远程Service的参数和返回值都必须实现Parcelable接口,实现Parcelable接口不仅要求实现接口里定义的方法,而且要求在类中定义一个名为CREATOR类型为Parcelable.Creator的静态Field,除此之外还要求使用AIDL代码来定义这些自定义类型。

最新文章

  1. 如何利用【DataTable】结合自己本地数据库,使用表格
  2. EMV技术学习和研究(转)
  3. cmd 里面运行git提示“不是内部或外部命令,也不是可运行的程序”的解决办法
  4. Windows8.1 preview硬盘安装(图解)
  5. js-学习方法之3
  6. (四十一)数据持久化的NSCoding实现 -实现普通对象的存取
  7. 服务器怎么安装mysql数据库
  8. Angular/cli 安装(windows环境)。
  9. 某公司的U3D笔试题
  10. Jenkins结合.net平台工具之ReportGenerator
  11. [ZJOI2019]游记之我的第一次省选--自闭记
  12. Go语言基础之变量和常量
  13. selenium是如何启动浏览器的
  14. SpringMVC中JSP页面显示为源码
  15. Redis-发布与订阅
  16. 04-Maven依赖管理
  17. JMS学习(四)-一个简单的聊天应用程序分析
  18. 关于文章cisco漏洞4786
  19. android:项目迁移error:Please change caller according to com.intellij.....
  20. org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection

热门文章

  1. python基础--新式类实现单例模式
  2. 七、hibernate的事务使用
  3. 如何从零搭建一个webpack+react+redux+react-redux的开发环境一入门
  4. 绘图matplotlib
  5. curl分析请求的各个部分耗时情况
  6. webpack第一节(2)
  7. 处理字符串的一些js/jq方法(去除HTML,去除空格,计算真实长度,截取中英文字符)
  8. Spring 讲解(四)
  9. visual Studio如何使用断点调试程序?
  10. (urls.E006) The MEDIA_URL setting must end with a slash. (urls.e006)