android中的Serveice组件
创建 配置 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代码来定义这些自定义类型。
android中的Serveice组件的更多相关文章
- Android中Broadcast Receiver组件具体解释
BroadcastReceiver(广播接收器)是Android中的四大组件之中的一个. 以下是Android Doc中关于BroadcastReceiver的概述: ①广播接收器是一个专注于接收广播 ...
- 【Android中Broadcast Receiver组件具体解释
】
BroadcastReceiver(广播接收器)是Android中的四大组件之中的一个. 以下是Android Doc中关于BroadcastReceiver的概述: ①广播接收器是一个专注于接收广播 ...
- 详解Android中的四大组件之一:Activity详解
activity的生命周期 activity的四种状态 running:正在运行,处于活动状态,用户可以点击屏幕,是将activity处于栈顶的状态. paused:暂停,处于失去焦点的时候,处于pa ...
- android中使用spinner组件,以key,value的方式
接着上一篇文章的内容:android中使用spinner组件 稍做修改,以key,value的方式,在实际使用中,经常需要获取的值并不一定跟显示的内容一致. 需要先添加一个对象类,用来描述key,va ...
- 关于Android中的四大组件(Service的开启与关闭)
前言 服务(Service)是Android系统中的四大组件之中的一个.服务主要用于两个目的:后台执行和跨进程訪问. 通过启动 一个服务.能够在不显示界面的前提下在后台执行指定的任务,这样能够不影响用 ...
- Android笔记(十三) Android中的基本组件——文本
Android中常用的文本组件有 普通文本框(TextView)和编辑框(EditText)两种 EditText是TextView的子类,作用就是在界面上显示文本,区别是EditText允许用户编辑 ...
- Android笔记(十四) Android中的基本组件——按钮
Android中的按钮主要包括Button和ImageButton两种,Button继承自TextView,而ImageButton继承自ImageView.Button生成的按钮上显示文字,而Ima ...
- Android中自己定义组件和它的属性
好长时间没有更新博客了.本来想积累点有深度的东西发,但一直没有找到非常好的点.所以.写一些基础的东西.就当积累吧. Android开发中难免会用到自己定义的组件.以下以ImageButton为例来介绍 ...
- android中使用spinner组件
spinner组件类似于html中的select标签,实现下拉选择框的功能. 添加一个Activity,界面上添加一个spinner下拉框,一个button按钮.点击按钮,获取spinner下拉框当前 ...
随机推荐
- etcd注册服务
etcd作为最简单(轻量,精简)的kv服务.etcd可以应用很多方面,但是它有一个特点,etcd只是基础,需要你自己实现功能.它不像其其它组件开箱即用,也正是如此,它足够简单精巧. 回到主题,etcd ...
- MYSQL 查询脚本优化
业务需要,优化一段多表查询脚本. 总结下来,采取以下步骤. 分析语句 分析语句,了解逻辑,是否可以先优化逻辑. 查询语句的查询范围,是否是全表查询,如果是,尽量优化为按索引查询. 查看语句数量,是否有 ...
- js非数值的比较
/** * 非数值的比较: * 1.对于非数值的比较时,会将其转换成数字然后再比较 * 2.如果符号两端是字符串的值进行比较时,不会将其转换为数字进行比较,而是 * 分别比较字符串中的字符的 unic ...
- JavaScript寻找最长的单词算法
返回提供的句子中最长的单词的长度. 返回值应该是一个数字. 第一步,使用String.prototype.split()方法将字符串转换成数组 function findLongestWord(str ...
- @InitBinder 前端传递date时间类型属性时,转换错误问题
在Controller里加上这段代码 @InitBinder public void initBinder(WebDataBinder binder) { binder.registerCustomE ...
- linux修改Jvm内存限制
一.直接通过java 命令去执行class文件的时候,也可以设置JVM参数,eg : java -Xms512m -Xmx1024m HelloWorld在cmd中设置,也必须是执行java命令时 堆 ...
- 【Flutter学习】之绘画实例(一)
一,概述 画布(Canvas) 画布是一个矩形区域,我们可以控制其每一像素来绘制我们想要的内容 Canvas 拥有多种绘制点.线.路径.矩形.圆形.以及添加图像等的方法,结合这些方法我们可以绘制出千变 ...
- Alpha冲刺阶段博客目录
Alpha冲刺阶段博客目录 Scrum Meeting 时间 链接 内容 第六周 https://www.cnblogs.com/error0/p/11815255.html 需求分析 第七周 htt ...
- linux下svn安装、配置及钩子
一.安装 直接运行命令用YUM安装: yum install subversion -y 二.创建svn版本库目录 mkdir -p /var/svn/svnrepos 三.创建版本库 生成文 ...
- Android学习拾遗
1. java中的flush()作用:强制将输出流缓冲区的数据送出. 2. 文件存储: 存储到内部:另外使用一个class实现,最开始初始化用了this,后来放在这里不合适,改成了带参数的构造方法. ...