Android平台技术总结_孔喆.doc_第1页
Android平台技术总结_孔喆.doc_第2页
Android平台技术总结_孔喆.doc_第3页
Android平台技术总结_孔喆.doc_第4页
Android平台技术总结_孔喆.doc_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Android平台的Service机制基于Android平台开发项目的个人技术总结Service是组成Android应用程序的四个重要组件(Activity,Service,Broadcast receiver和Content provider)之一。顾名思义,它是为应用程序提供一种服务,他不需要显示画面,但却可以长时间在后台运行,最简单的例子就是MP3播放,检测SD卡中文件的变化等。Service与Activity的级别差不多,但是他无法自己启动,需要通过某Activity或者其他Context对象调用startService()或bindService()方法进行启动。他的继承关系和主要的调用方法如下图。图1-1 Service的类图及其主要方法接下来,本文将介绍Android平台Service机制的基本特性;Activity和Service之间的数据传递;然后介绍通过Service实现Android系统进程间通信的AIDL(Android Interface Defined Language)方法;最后,通过几个代码示例,说明Service机制的具体使用方法。一、Service机制的基本特性1.Service在工程AndroidManifest文件中的声明Service作为Android系统应用程序组件之一,其定义在AndroidManifest文件中的之内,其具体的定义语法如下:其中,各属性功能如下表:表1-1 Service的属性描述属性功能描述nameService类的名称。使用“包名.类名”的格式定义,例“com.android.neusoft.NetRadioService”。若在默认包内,则类使用“.类名”定义,例“.NetRadioService”。labelService的标签。iconService的图标。enabled系统是否可以实例化该Service。true:可实例化。注:若希望Service可以实例化必须将application和service的enabled属性均设置为true。exported其他应用程序的组件是否可以外部调用该Service。true:为允许外部调用。false:只有本应用程序内或者有相同的用户ID,可以使用该Service。permission人为设置的一个访问该Service的权限。如果没有该权限,startService,stopService和bindService将无法传递Intent操作Service。若Service未设置该属性,默认使用application的permission属性值。若Service和application均未设置该属性,则该Service没有任何的许可设置。processService将要运行的进程名称。一般来说,应用程序所有的组件都运行在应用程序的默认进程中,可以在application的process中对全部组件的进程进行设置,但也可以在Service组件中进行单独设置,使Service运行在其他的进程之中。如果process属性以“:”开头,说明该进程为该应用程序私有的,只有需要时会被创建;如果process属性以小写字母开头,将创建一个该名字命名的进程,允许不同的应用程序,共享使用该进程,减小资源的消耗。2.Android Service类的常用API表1-2 Service的基本API功能描述函数名称功能描述getApplication返回拥有该Service的应用程序。onBind返回Service的通信通道,如果没有返回成功,将返回null。返回的IBinder指针,将被用于AIDL进行使用的复杂接口。onConfigurationChanged当Service运行中,设备的设置发生变化时,系统将调用该函数。注:Service与Activity不同,当系统设置发生变化时,只调用该函数,而无需重新启动。onCreate系统第一次创建Service时候的将调用该函数。注:不要直接调用该函数。onDestroy系统调用,通知Service他将不再被使用并移除。调用该函数,主要完成对Service内使用资源的关闭回收工作。onLowMemory当系统内存资源低的时候,系统将调用该用该函数,来释放一些不必要的资源,为系统节省出更多的内存空间。一般来说,调用的时间点是后台进程将要杀死之前,以避免Service所在进程被强行关闭。onRebind当新的客户端已经连接到该Service之上,并且在onUnbind(Intent)将所有的连接都开的时候调用。注:该函数只有在onUnbind(Intent)被重载并返回true的时候可以调用。onStartCommand每次客户端通过startService(Intent)进行显式调用Service的时候,调用该函数。其参数int startId标识第几次调用。注:不要直接调用该函数。onUnbind当客户端与系统Service断开连接的时候调用。默认的函数调用没有任何操作,返回false。startForeground将Service设置为前台运行。在这个状态下,支持通过Notification进行提示正在运行的Service状态。该函数可以用于在标题栏上提示Service的运行状态,防止Service被系统杀死,而用户并不知情的情况发生。stopForeground取消Service的前台运行状态。移除状态后,当系统需要更多内存的时候,系统将关闭该Service。stopSelf如果之前的Service被启动,停止Service。该方法与Context.stopService(Intent)调用的效果相同。stopSelfResult与stopSelf的功能相似。参数int startId用于标志之前在onStartCommand中启动的参数。可以用于Service中开启多线程时的依次关闭。3Service的启动方式及生命周期(1)显示调用Service客户端通过Context.startService()启动Service。系统将根据客户端提供的参数调用Service的onStartCommand(Intent, int, int)方法,(如果是首次调用,则先调用onCreate()方法)。客户端通过Context.stopService()或stopSelf()停止Service。系统将调用Service的onDestroy()方法停止之服务。对于启动的Service,有两个额外的方法可以使用,他们取决于onStartCommand()函数的返回值,如果返回START_STICKY,则用于显示的启动和停止Service。返回START_NOT_STICKY 或者START_REDELIVER_INTENT时,则Service只保持在处理命令时运行。图1-1 Service的类图及其主要方法时序图如下:(2)绑定使用Service客户端通过Context. bindService ()方式得到一个持久的Service连接。如果Service没有在运行状态,系统将调用Service的onCreate()方法,初始化Service,之后调用onBind(Intent)方法。如果连接成功,则Service将保持运行,并返回一个IBinder对象给客户端,用于之后对Service的操作。IBinder是一个复杂的接口,将在后文的AIDL进行叙述。当客户端不在使用Service,可以通过调用unbindService取消绑定Service,之后系统将调用Service的onUnbind()方法和onDestroy()方法进行使用资源的释放。时序图如下:在Service运行之后,Android系统将尽可能保存Service的运行。当系统内存资源不足需要杀死进程时,以下可能有用Service的进程将有最高的优先级。(1).如果Service正在执行onCreate(), onStartCommand(), or onDestroy()方法,那么进程将是前台的进程以保证不被杀死。(2).如果Service已经被启动,那么他的进程就没有当前屏幕上可见的进程优先级高了。这意味着Service只有在系统极度需要内存的时候才能关闭。(3).如果有客户端绑定Service时,那么如果有任何的客户端是可见的,那么Service也就是可见的。(4).一个启动的Service调用了startForeground()方法后,Service将被防止到前台,系统将认为用户知道该Service的存在,当季度需要内存时,系统将杀死该Service。 二、Activity之间的数据传递当开启一个连接之后,我们很容易的想到,当Activity之间需要传递数据时,需要如何处理呢?该部分与系统的数据存储方式相关,这里只做简单的介绍,每一种方法都有其特定的使用场合。1、原始数据类型在Activity/Servier之间传递临时性的原始数据,可以使用Intent的putExtras方法来传递数据。若传递的数据需要长久保存,则使用SharedPreference类来完成。2、传递对象当在Activity/Service之间传递不需要长久保存的对象时,可以使用以下几种途径:(1)通过Application类,每个Android应用程序都有一个Application类。当你在程序的AndroidManifest.xml中给Application设定一个名字时,你的程序中就必须有一个Application的子类。这个Application子类会被Android自动实例化,并且是一个全家性的类,它的生命周期和程序的生命周期相同,你可以把一些全局性的对象保存在Application类中。Application类可以通过getApplication()获得。(2) 通过HashMap of WeakReferences传递对象。当一个Activity需要向另外一个Activity传递对象时,可以使用一个关键字把对象存在一个HashMap中,并把这个关键字通过Internt的Extras发给目标Activity,目标Activity接到该关键字后使用该关键字把对象冲HashMap中取出。3、长久保存的对象(1)应用程序的配置类Application Preferences;(2)创建配置文件Files(3)使用contentProviders(4)数据库存储SQLite DB三、Android系统进程间通信的AIDL方法由于每个应用程序都运行在自己的进程中,但在我们开发程序的时候,也可以将一个Service的运行在与应用程序UI不同的进程里面。这时就你需要在不同的进程间传递数据对象。Android平台的机制下,一个平台进程不能正常的访问另一个进程的内存。所以说,他们需要将这些数据对象拆解成系统可以理解的单元,传递到另一个线程之后,再重新进行组装。但这种方式过于复杂,所以Android系统提供了AIDL工具来解决进程间传递数据的问题这个问题。AIDL (Android Interface Definition Language)是接口定义语言,他可以产生代码以供两个Android平台的进程之间进行内处理器对话。如果A线程中一个Activity需要调用B进程中的方法(例如,B进程中的一个Service),可以使用AIDL工具来产生代码来进程制定数据的传递。AIDL IPC机制是基于接口的,类似于COM和Corba,但是较他们比量级较轻。他使用一个代理类在客户端和实现进程间进行值传递。下面我们就看看AIDL机制的使用。图3-1 Android平台进程间通信示意图通过AIDL实现IPC,按照以下的过程,就可以使用AIDL实现IPC服务。1. 创建.aidl文件.aidl文件可以定义一个可以被客户端使用的接口。AIDL文件与java接口定于的语法形式相同,他允许在接口内声明多个带有输入参数和返回值的方法。这些参数和返回值可以是任意类型,甚至可以是其他AIDL山城的接口。但是,即便他们与接口定义在同一个包内,也需要注意到是必须导入内置的对象类型,以下为AIDL可以支持的数据类型:(1).java语言的基本数据类型,不需要进行导入。(2)String,List,Map,CharSequence等数据类型不需要导入。(3)通过引用传入的其他AIDL产生的接口,需要导入。(4)传值传入的自定义的实现Parcelable protocol的类,需要导入2. 将.aidl添加到编码文件工程中。Eclipse的ADT插件可以完成此工作(在SDK的tools路径下面)3. 实现接口的方法。AIDL编译器将创建出一个用java语言编写的接口类。这个接口有一个抽象的内部类Stub继承与该接口(并且实现一些额外的方法)。必须创建一个YourInterface.Stub的子类,并实现在.aidl文件中声明的方法。AIDL将生成一个与aidl文件同名相同的类。Eclipse插件,将自动生成该类。否则,需要手动运行AIDL工具,生成该类。生成的接口包括一个名为Stub的抽象内部类并实现AIDL文件中的定义的方法,一般为asInterface(),将含有一个IBinder(通过onServiceConnected传给客户端的)当Context.bindService()成功后,将把接口的实例返回,用来调用IPC方法。一些实现接口的规定:(1)出现异常的话,将抛出返回给调用者。(2)IPC调用是同步调用,如果IPC的Service花费时间过长,最好起一个线程来执行它,否者将造成UI线程的挂起,是程序没有响应。(3)只支持方法,不能在AIDL接口中定义静态变量。4.将接口暴露给客户端如果写了一个Service,必须继承与Service并重载Service.onBind(Intent)方法,并返回实现定义的接口功能类的指针。5调用IPC方法以下是调用远程接口的方法。(1)声明一个aidl变量中定义的接口。(2)实现ServiceConnection.(3)调用Context.bindService(),传给ServiceConnection的实现。(4)实现ServiceConnection.onServiceConnecte

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论