版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Graphic
Design
TrainingAndroid应用程序组件(三)TRAININGCOURSE.12014-07——主讲人:唐睿【章程目标】
Service概述
Service生命周期
自定义Service
Activity与Service之间的数据交互
IPC技术和AIDL接口编写服务是四大组件之一,与Activity是同级的,服务不带UI,一直处于后台运行,做一些用时比较长的操作在默认情况下,服务运行在应用程序进程的主线程中服务既不是一个独立的进程,也不是一个独立的线程一般在activity中启动服务、停止服务服务主要用于两个目的:后台运行(例如:处理耗时间的任务时不影响UI的操作)和跨进程访问。【服务概述】服务按启动方式分为三类Started:适用于Activity与服务之间没有调用交互的情况用startService()来启动一旦启动,就运行在后台,即使启动它的对象都销毁了,依然运行通常只启动,不返回值通常执行完服务的操作后,服务自动停止Bound:适用于Activity与服务之间需要传递参数或方法调用的情况bindService()来绑定提供客户端服务器接口来启动发送请示,得到返回值,甚至通过IPC(Linux操作系统中,进程之间通讯的机制)来跨应用或跨进程通讯只要有一个绑定者存在,那么服务继续运行,只有在所有绑定者都退出,服务才停止混合类型两种方法并不完全独立,某些情况下可以混合使用保证Service后台持续运行,并允许交互【服务的分类】单应用程序多应用程序【Started服务的生命周期】单应用程序多应用程序【Bound服务生命周期】【混合类型生命周期】Started方法的实现步骤:继承Service类,实现自己的服务重写mand/OnStart方法,服务的业务逻辑就写在这里在AndroidManifest中注册服务用startService方法启动服务停止服务:外部用stopService,内部用stopSelf方法这种使用方式,服务会不定时的重启.(非正常结束时系统会尝试重新启动)【实现Started服务的步骤】publicclassMusicServiceextendsService{@OverridepublicIBinderonBind(Intentintent){System.out.println("MusicServiceonBind");returnnull;}@Overridepublicintmand(Intentintent,intflags,intstartId){intiRet=super.mand(intent,flags,startId);//在这里实现代码//…returniRet;}}【示例:Service类实现】在AndroidMainfest.xml文件中<application> … <serviceandroid:enabled=“true”android:name=“.MusicService”</application>【示例:服务配置文件】Bound方法的实现步骤:继承Service或Service类,实现自己的服务在Service类中定义一个内部类,这个类实现IBinder接口,提供一个返回当前Service对象的方法重写onBind()方法,服务的业务逻辑就写在这里,并返回刚才定义的IBinder对象。在AndroidManifest中注册服务在Activity中用bindService方法来绑定服务,并且在Activity类中定义一个内部类,这个类实现ServiceConnection接口,用于返回绑定对象,并获取绑定的服务,通过获取到的服务对象调用相应的方法在Activity中用unBindService方法取消绑定服务【实现Bound服务的步骤】publicclassPlayServiceextendsService{ privateIBindermBinder=null; publicPlayService(){ mBinder=newPlayAdapter(); } @Override publicIBinderonBind(Intentintent){ //TODOAuto-generatedmethodstub Log.i("PlayService","onBind"); returnmBinder; }}【示例:继承Service】有时候,我们不希望后台服务,被系统在资源不足的情况下,被杀死,所以我们会把服务设定为前台服务(把服务设定为前台服务并不是说服务是可见,而应该理解为:是把服务的优先级设高了),从而让系统不会杀掉它比如:音乐播放器在后台播放的时候,我们不希望被杀死服务开始在前台运行:startForeground(int,notification)服务停止在前台运行:stopForeground(boolean)【在前台运行服务】服务端(Service)实现IBinder对象,并在onBind方法中返回在IBinder实现类里实现返回实现要被外部调用的实现功能的public方法客户端(Activity)实现一个类继承ServiceConnection,在这个类中实现onServiceConnected和onServiceDisconnected方法onServiceConnected中有一个IBinder的参数,直接强转成服务端的Binder对象,并调用其方法来调用服务端功能。【单一应用中简单数据交互】【简单交互图】Android是基于Linux内核的,各个进程间或任务相对独立,无法直接进行通讯,需要借助专门技术来完成通讯(主要是数据交换)AndroidIPC(Inter-ProcessCommunication),进程间通信技术如下:标准LinuxKernelIPC接口D-BUS接口AndroidBinder技术【AndroidIPC技术】AndroidBinder是一种在Android里广泛使用的一种远程过程调用接口从结构上来说AndroidBinder系统是一种服务器/客户机模式,包括BinderServer、BinderClient和AndroidBinder驱动,实际的数据传输就是通过AndroidBinder驱动来完成的【Binder技术】【Binder机制实现原理】服务端(Service)和客户端(Activity)1、服务端实现IBinder接口的对象,将被ServiceManager注册登记,继承Service可实现或(getDefaultServiceManager->addService)2、客户端bindSerivce和ServiceConnection组合(或getService),得到远程端IBinder对象3、调用IBinder对象的transact方法,实现两进程间的Parcel数据交换注:ServiceManager与zygote服务都是在init进程启动过程中被启动的注意:这个例子主要是本地应用程序间的通信并不是远程通信。主要是为了理解Binder的调用形式,远程通信是基于这种通信形式的。【具体实现步骤】【IPC交互图】publicclassMyServiceextendsService{Binderbinder=newBinder(){@OverrideprotectedbooleanonTransact(intcode,Parceldata,Parcelreply,intflags)throwsRemoteException{//TODOAuto-generatedmethodstubSystem.out.println("transactsth");returnsuper.onTransact(code,data,reply,flags);}};@OverridepublicIBinderonBind(Intentintent){//TODOAuto-generatedmethodstubreturnbinder;}}【服务端实现】绑定//实现ServiceConnection来获得Ibinder对象IBinderbinder;ServiceConnectionsc=newServiceConnection(){@OverridepublicvoidonServiceDisconnected(ComponentNamename){}@OverridepublicvoidonServiceConnected(ComponentNamename,IBinderservice){ binder=service;}};//绑定服务Intenti=newIntent();ponent(newComponentName("llenlonv.service", "llenlonv.service.MyService"));bindService(i,sc,Context.BIND_AUTO_CREATE);【Activity实现(调用端)】发送消息给服务端Parceldata=Parcel.obtain();Parcelreply=Parcel.obtain();try{binder.transact(1,data,reply,0);}catch(RemoteExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}【Activity实现(调用端)】Android接口定义语言,实现远程的双方在不熟悉IPC技术的条件下编写程序来实现程序间传递数据使用AIDL实现IPC服务:创建.aidl文件-该文件(IAIDLService.aidl)定义了客户端可用的方法和数据的接口。使用aidl工具,将接口文件转化成IAIDLService.java,内含Stub和Proxy定义(可由ADT插件自动生成)实现接口-服务端还要定义一个服务类,内部继承并实现IAIDLService.Stub中的抽象方法客户端使用IPlayer.Stub.asInterface静态方法和SeviceConnection传递来的IBinder,获得接口的代理实现对象,来实现对远程对象的调用【AIDL】AIDL使用类似Java接口的语法来声明IPC接口,描述其方法以及方法的参数和返回值。这些参数和返回值可以是任何类型,甚至是其他AIDL生成的接口。重要的是必须导入所有非内置类型,哪怕是这些类型是在与接口相同的包中。下面是AIDL能支持的数据类型:Java编程语言的主要类型(int,boolean等)—不需要import语句。以下的类(不需要import语句):
String
List-列表中的所有元素必须是在此列出的类型,包括其他AIDL生成的接口和可打包类型。List可以像一般的类(例如List<String>)那样使用,另一边接收的具体类一般是一个ArrayList,这些方法会使用List接口。
Map-Map中的所有元素必须是在此列出的类型,包括其他AIDL生成的接口和可打包类型。一般的maps(例如Map<String,Integer>)不被支持,另一边接收的具体类一般是一个HashMap,这些方法会使用Map接口。
CharSequence-该类是被TextView和其他控件对象使用的字符序列。
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 股权出资协议合同样本
- 自动化培训合同协议书
- 装修公司违约合同范本
- 设计制作外包合同范本
- 豪车典当租赁合同范本
- 购房合同低价保密协议
- 2020-2025年监理工程师之土木建筑目标控制强化训练试卷B卷附答案
- 2025年一级建造师之一建港口与航道工程实务强化训练试卷B卷附答案
- 人教版八年级上册七单元《红星照耀中国》测试卷及答案
- “国潮”形象塑造研究-以小米为例
- 袋式除尘器日常点检表
- DB21T 3782-2023 装配式混凝土建筑保温结构一体化外墙应用技术规程
- 教师资格面试-75篇结构化逐字稿
- 小学道德与法治-垃圾去哪儿教学设计学情分析教材分析课后反思
- 广东省普通高中学生档案
- 幼儿绘本阅读与指导智慧树知到答案章节测试2023年河北正定师范高等专科学校
- 《学习新思想 做好接班人》班会课件
- GB 1886.358-2022食品安全国家标准食品添加剂磷脂
- GB 17498.2-2008固定式健身器材第2部分:力量型训练器材附加的特殊安全要求和试验方法
- 《船舶结构与货运》教学课件-02船体结构
- 年产12000吨水合肼(100%)项目环评报告书
评论
0/150
提交评论