`

Android 复习_Service 二

 
阅读更多

<!-- [if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:TrackMoves/> <w:TrackFormatting/> <w:PunctuationKerning/> <w:ValidateAgainstSchemas/> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:DoNotPromoteQF/> <w:LidThemeOther>EN-US</w:LidThemeOther> <w:LidThemeAsian>ZH-CN</w:LidThemeAsian> <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript> <w:Compatibility> <w:BreakWrappedTables/> <w:SnapToGridInCell/> <w:WrapTextWithPunct/> <w:UseAsianBreakRules/> <w:DontGrowAutofit/> <w:SplitPgBreakAndParaMark/> <w:DontVertAlignCellWithSp/> <w:DontBreakConstrainedForcedTables/> <w:DontVertAlignInTxbx/> <w:Word11KerningPairs/> <w:CachedColBalance/> <w:UseFELayout/> </w:Compatibility> <m:mathPr> <m:mathFont m:val="Cambria Math"/> <m:brkBin m:val="before"/> <m:brkBinSub m:val="&#45;-"/> <m:smallFrac m:val="off"/> <m:dispDef/> <m:lMargin m:val="0"/> <m:rMargin m:val="0"/> <m:defJc m:val="centerGroup"/> <m:wrapIndent m:val="1440"/> <m:intLim m:val="subSup"/> <m:naryLim m:val="undOvr"/> </m:mathPr></w:WordDocument> </xml><![endif]--><!-- [if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true" DefSemiHidden="true" DefQFormat="false" DefPriority="99" LatentStyleCount="267"> <w:LsdException Locked="false" Priority="0" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Normal"/> <w:LsdException Locked="false" Priority="9" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="heading 1"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/> <w:LsdException Locked="false" Priority="39" Name="toc 1"/> <w:LsdException Locked="false" Priority="39" Name="toc 2"/> <w:LsdException Locked="false" Priority="39" Name="toc 3"/> <w:LsdException Locked="false" Priority="39" Name="toc 4"/> <w:LsdException Locked="false" Priority="39" Name="toc 5"/> <w:LsdException Locked="false" Priority="39" Name="toc 6"/> <w:LsdException Locked="false" Priority="39" Name="toc 7"/> <w:LsdException Locked="false" Priority="39" Name="toc 8"/> <w:LsdException Locked="false" Priority="39" Name="toc 9"/> <w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/> <w:LsdException Locked="false" Priority="10" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Title"/> <w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"/> <w:LsdException Locked="false" Priority="11" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/> <w:LsdException Locked="false" Priority="22" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Strong"/> <w:LsdException Locked="false" Priority="20" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/> <w:LsdException Locked="false" Priority="59" SemiHidden="false" UnhideWhenUsed="false" Name="Table Grid"/> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/> <w:LsdException Locked="false" Priority="1" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 1"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 1"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 1"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/> <w:LsdException Locked="false" Priority="34" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/> <w:LsdException Locked="false" Priority="29" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Quote"/> <w:LsdException Locked="false" Priority="30" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 1"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 1"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 2"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 2"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 2"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 2"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 2"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 3"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 3"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 3"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 3"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 3"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 4"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 4"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 4"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 4"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 4"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 5"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 5"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 5"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 5"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 5"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 6"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 6"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 6"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 6"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 6"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/> <w:LsdException Locked="false" Priority="19" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/> <w:LsdException Locked="false" Priority="21" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/> <w:LsdException Locked="false" Priority="31" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/> <w:LsdException Locked="false" Priority="32" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/> <w:LsdException Locked="false" Priority="33" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Book Title"/> <w:LsdException Locked="false" Priority="37" Name="Bibliography"/> <w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/> </w:LatentStyles> </xml><![endif]--><!-- [if gte mso 10]> <style> /* Style Definitions */ table.MsoNormalTable {mso-style-name:普通表格; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-priority:99; mso-style-qformat:yes; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin-top:0cm; mso-para-margin-right:0cm; mso-para-margin-bottom:10.0pt; mso-para-margin-left:0cm; line-height:115%; mso-pagination:widow-orphan; font-size:11.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin;} </style> <![endif]-->

Bound Services

一个绑定的服务是一个客户端之间的接口的服务。一个绑定的服务器允许组件(比如 Activity)绑定到这个服务,发送请求,接收响应,甚至执行进程间通信。一个绑定的服务典型的是只当他为别的组件服务时才是活动的 ,他不会在后台单独运行。

基础知识 (The Basics)

一个绑定的服务是一个 Service类的一个实现,他允许别的应用绑定到他,并且与他交互。一个服务要实现绑定功能,你必须实现 onBind()回调方法。这个方法返回一个 IBinder的对象,他定义了客户端可以用来与服务相交互的接口。

一个客户端可以通过 bindService()绑定到这个服务。当他这样做的时候,他们必须提供一个 ServiceConnection的实现,用他来监视与该服务的连接。 bindService()会立即返回,且而任何返回值。但是当 Android系统创建客户端与服务端的连接时,他会调用 ServiceConnection onServiceConnected()方法,并且给他传递 IBinder对象,客户端可以用他来与服务端进行通信。

多个客户端可以同时绑定到这个服务。然而,系统只在第一次客户端绑定到该服务时调用该服务的 onBind()方法去得到 IBinder。系统将传递相同的 IBinder到任何其它的绑定到该服务的客户端,而不是再调用 onBind()一次。

当最后一个客户端解除了与服务的绑定,系统将销毁掉这个服务。 (如果该服务也被 startService()启动除外。 )

当你实现你的绑定的服务时,最重要的工作是定义你的 onBind()方法返回的接口。

创建一个绑定服务 (Creating a Bound Service)

当创建一个服务,提供绑定功能,你必须提供一个 IBinder作为与客户端进行交互的接口。这里有三种方法你可以用来定义这个接口。

扩展 Binder (Extending the Binder Class)

如果你的服务对于你的应用而言是私有的并且与这个客户端运行在同一个进程中 (这是一种很常见的 ),你应该通过扩展 Binder来创建你的接口,并通过 onBind()来返回这个接口。客户端得到 Binder,并且可以直接该问他的公有方法,甚至服务的公有方法。

当服务仅仅作为你自己应用中后台运行的一部分时,使用这个技术是比较好的选择。唯一不应该使用这种方法的理由是,你的服务可能会被其它应用使用,或者从不同的进程访问。

使用 Messenger(Using Messenger)

如果你的服务需要跨进程工作,你可以使用 Messenger为你的服务创建一个接口。这种方式下,服务定义一个 Handler,他来响应不同类型的 Message对象。这个 Handler Messenger的一个基础,他可以给客户端分享一个 IBinder,他允许客户端使用 Message对象向该服务发命令。另外,客户端可以为自己定义一个 Messenger,这样服务端可以发消息回来。

这是一种进程间通信 (IPC)的最简单的方式。由于 Messenger将所有的请求排好队放入一个单独的线程,所以你永远不需要设计你的服务为线程安全。

使用 AIDL(Using AIDL)

AIDL(Android Interface Definition Language) 执行所有的工作来将对象分解为操作系统可以理解的原始状态并调整它们来跨线程执行 IPC。前面的技术,使用 Messenger,实际上是基于 AIDL作为基础架构的。像前面提到的那样, Messenger一个单独的线程中为所有的客户端的请求创建一个队列,所以一次只得到一个请求。然而,如果你想要你的服务同时处理多个请求,你可以直接使用 AIDL。这种情况下,你的服务必须具备多线程能力,并且要考虑线程安全。

直接使用 AIDL,你必须定义一个 .aidl文件来定义编程接口。 Android SDK工具用这个文件去生成一个抽象类,他来实现接口和处理 IPC,这些可以在你的服务中被扩展。

注:绝大多数应用都不应该使用 AIDL来创建绑定服务,因为他需要多线程能力,且使其实现复习化。

扩展 Binder (Extending the Binder class)

如果你的服务只被你的本地服务使用,不需要跨进程的工作。你可以实现你的 Binder类,使你的客户端可以直接访问你的服务的公有方法。

步骤:

1. 在你的服务中,创建一个 Binder的实例,

a. 它包括客户可以访问的公共方法

b. 返回当前服务的实例,他有一些公有方法可供客户端调用

c. 或者,返回一个别的类的实例,这个类持有可供客户调用的一些公共方法的服务。

2. onBind()方法返回一个 Binder的实例。

3. 在客户端,从 onServiceConnected()获得一个 Binder,并使用服务提供了的方法去调用绑定服务。

倒如,这个服务通过 Binder的实现提供了客户端访问服务的一些方法。

LocalBinder为客户端提供了一个 getService()方法,可以用来获取当前的 LocalService的实例。他允许客户端调用服务的公共方法。例如,客户端可以调用服务的 getRandomNumber()方法。

这里有一个 Activity绑定到这个服务,并且当点击一次按钮,调用一次 getRandomNumber()方法。

以上实例显示了一个客户端如何使用一个 ServiceConnection onServiceConnected()回调方法绑定到这个服务。

使用 Messenger(Using a Messenger)

如果你的服务需要远程通信,你可以使用一个 Messenger为你的服务提供接口。这个技术允许你不需要 AIDL的情况下执行进程间通信( IPC)。

下面是使用 Messenger的总结:

· 服务实现一个 Handler,为每一个来自客户端的调用接收一个回调。

· Handler用来创建 Messenger实体 (他是一个到 Handler的引用 )

· Messenger创建一个 IBinder,用来作为服务的 onBind()的返回值。

· 客户端使用 IBinder来初始化一个 Messenger(他是到服务的 Handler的一个引用 ),客户端用他来发送 Message到服务。

· 服务在他 Handler中接收每一个 Message,特别的,在 handleMessage()方法中。

用这种方法,服务没有为客户端提供调用的方法。相反,客户端传递 message,服务在 Handler中接收他。

下面是一个使用 Messengar的例子:


注意 Handler handleMessage()方法,他是服务接收消息的地方,并且决定去做什么,基于 what成员。

客户端需要做的所有工作是创建一个基于从服务返回的 IBinder Messenger,然后使用 send()发送一个消息 (message)。下面示例一个 activity绑定到这个服务,并且向服务传递 MSG_SAY_HELLO消息。

注意,这个示例没有显示服务怎样才能响应到客户端。如果你想要你的服务响应,你也需要在你的客户端中创建 一个 Messenger。然后当客户端接到 onServiceConnected()回调,他发送一个 Message到服务,他在 replyTo参数的 send()方法中包括客户端的 Messenger

绑定到一个服务 (Binding to a Service)

应用组件可以通过 bindService()绑定到一个服务。 Android系统然后调用系统的 onBind()方法,他返回一个 IBinder以供与服务交互。

绑定是异步的。 bindService()会立即返回,并不返回 IBinder到客户端。为了接收 IBinder,客户端必须创建一个 ServiceConnection的实例,并将他传递给 bindService()方法。 ServiceConnection包括一个回调方法,系统可以用来交付 IBinder

注:只有 Activity Service ,和 Content Provider 可以绑定到服务,你不能从广播接收者 (Broadcast receiver) 来绑定服务。

所以,从客户端绑定一个服务,你需要:

1. 实现一个 ServiceConnection

你的实现必须重载以下两个方法 :

onServiceConnected()

系统调用这个方法传递 onBind()返回的 IBinder

onServiceDisconnected()
当与服务的连接被异常中断时 Android系统会调用这个方法,例如当服务崩溃 (crash)了或者被杀死 (kill)了。当客户端调用 unBind()时系统是不会调用该方法( onServiceDisconnected() )。

2. 调用 BindService(),传递 ServiceConnection的实现。

3. 当系统调用你的 onServiceConnected()方法时,你可以使用接口定义了的方法向服务做出一个调用。

4. 断开与一个服务的连接,使用 unBindService()

当你的客户端被销毁了,他将与服务解除绑定关系。但你总是应该在完成与服务的交互之后来解除这种绑定,或者当你的 Activity处于 Pause状态时,当服务不在使用时应该关闭。

例如,以下代码片断连接一个客户端到一个扩展 Binder类,所以需要做的是获取一个 IBinder LoacalService类并且请求 LocalService的实例。

使用这个 ServiceConnection,客户端可以传递他给 bindService()来绑定服务。例如:

bindService()的第一个参数是一个 intent,他显式地指明了要绑定的服务(尽管他可以是隐式的)。

第二个参数是这个 ServiceConnection对象。

第三个参数是一个标志,他指明的绑定的选项。他通常应该是 BIND_AUTO_CREATE,如果这个服务不是活动的将会创建他。别的可能的值有 BIND_DEBUG_UNBIND BIND_NOT_FORGOUND,或者是 0表示什么也没有。

其它注意事项 (Additional notes)

这里有关于绑定到服务的一些比较重要的提示:

你总是应该要注意捕捉 DeadObjectException异常,当连接被中断了会抛出这个异常。这是远程方法中唯一抛出的异常。

对象是跨进程计数器。

你应该让你的绑定和解除绑定在你的客户端的生命周期的启动与销毁间配对。例如:

如果你仅需要在你的 Activity可见期间与服务通信,你应该在 onStart()中绑定他,在 onStop()中解除绑定。

如果你的 Activity在停止之后还接收服务的响应,那你应该在 onCreate()中绑定他,在 onDestroy()中解除这种绑定。

注:通常你不应该在 onResume()中绑定和在 onPause()中解除绑定。因为这两个回调在每一个生命周期的转换中都会发生,你应该保持这种处理的最小化。

管理一个绑定服务的生命周期 (Managing the Lifecycle of a Bound Service)

当一个服务与所有的客户解除绑定了, Android系统将销毁他 (他也被 onStartCommand()启动除外 )。因此,如果你的服务是一个纯 bind的服务,你不需要管理你的服务的生命周期。 Android系统将基于他是否绑定到客户端而为你管理他。

然而,如果你的选择了实现 onStartCommand()的回调,你必须显示的停止掉你的服务,因为现在系统认为你的服务是 started的。这种情况下,服务运行到自己调用 stopSelf()或者其它组件调用 stopService(),不论他是否绑定到客户端。

如果你的服务既是 started,也接受绑定,当系统调用你的 onUnbind()方法,如果你更希望下次客户端绑定到服务时接到 onRebind()的调用,你可以选择性的返回 true onRebind()返回一个 void,但是客户端仍然可以在 onServiceConnected()中接到 IBinder对象。

分享到:
评论

相关推荐

    android_interview_guide.pdf

    这部分内容从Android四大组件(Activity、Service、BroadcastReceiver、ContentProvider)开始,对每个组件进行了深入的解析,例如Activity的生命周期、Service的启动和绑定过程、BroadcastReceiver的分类和使用,...

    Android期末复习题02

    在Android期末复习题02中,我们关注到几个关键知识点,包括内存回收、Intent的作用、自定义style的声明、Menu的使用、SQLiteOpenHelper的操作、Service生命周期以及BroadcastReceiver的注册。 1. **内存回收**:在...

    android_api_demo

    【Android_API_Demo】是一个专为Android初学者设计的实践项目,它包含了Android开发中常用API的各种示例代码,帮助开发者了解并掌握Android组件的使用方法。在这个项目中,你可以找到关于活动(Activity)、意图...

    Android期末复习课件.rar

    【Android期末复习课件】 Android,作为全球最广泛使用的移动操作系统之一,对于计算机科学与信息技术专业的学生来说,理解和掌握其核心概念和技术至关重要。这个“Android期末复习课件”旨在帮助学生系统地回顾...

    Android期末复习选择题100道

    Android是谷歌主导的移动操作系统,其核心特性之一就是四大组件,包括Activity、Service、BroadcastReceiver和ContentProvider。这些组件构成了Android应用程序的基础架构。 1. **Activity**:Activity是用户界面的...

    安卓android期末考试复习要点.docx

    ### 安卓Android期末考试复习要点 #### 一、复习重点概述 在准备安卓Android期末考试的过程中,以下几点是必须掌握的关键知识点: 1. **字符、数组资源的定义**: - 字符资源通常用于存储单个字符或短字符串,如...

    Android复习纲要.zip_android开发_Java_

    本文将基于“Android复习纲要.zip”提供的资料,深入探讨Android入门知识,以及Java在其中的角色。 首先,了解Android的基础架构至关重要。Android是一个开源的操作系统,主要应用于移动设备,如智能手机和平板电脑...

    Android面试复习资料

    2. **Android基础**: - 活动(Activity):理解活动生命周期,以及如何在不同状态间切换。 - 布局管理器(Layout Manager):熟悉LinearLayout、RelativeLayout、ConstraintLayout等布局的使用。 - 数据持久化:...

    Android_studio各种笔记资料基础信息

    根据提供的文件信息,我们可以归纳和扩展出以下与Android开发中的传感器相关的知识点: ### Android Studio 中的传感器管理(Sensor Management) #### 1. **SensorManager** 概述 `SensorManager` 类是Android...

    Android复习题 .docx

    【Android复习题】 Android是一种基于Linux内核的开源操作系统,主要应用于移动设备,如智能手机和平板电脑,但也逐渐扩展到智能电视、汽车娱乐系统等领域。本复习题旨在帮助你全面回顾和深入理解Android开发中的...

    android复习

    ### Android复习知识点详解 #### 一、Android系统架构 Android系统采用了典型的分层架构设计,由四个主要层次组成,从上至下分别为: 1. **应用程序层**:这是用户可以直接看到并使用的各种应用,比如联系人管理...

    android考试复习资料

    在复习 Android 相关知识时,确保对这些核心概念有深入理解,熟悉它们的工作原理和使用方法,这对于通过考试以及实际开发都是非常重要的。同时,练习编写和调试代码,掌握 Android Studio 的使用技巧,也是提升技能...

    Android最新复习重点 (1).docx

    以下是根据提供的复习重点进行的详细解释: 1. **Intent**:Intent是Android中的一个核心概念,用于在组件间通信。分为显式和隐式两种。显式Intent直接指定目标组件,如`new Intent(this, Activity02.class)`,常...

    传智播客_Andorid_传智播客_8天Android视频教程_视频

    这些知识点将帮助初学者系统地学习Android开发,同时也为有一定经验的开发者提供了复习和深入理解的机会。通过8天的视频教程,学员可以逐步掌握Android开发的核心技能,并能构建自己的Android应用程序。

    android复习习题集(河北工业大学)

    【Android复习知识点】 1. **AbsoluteLayout属性**:在AbsoluteLayout布局中,android:layout_X和android:layout_Y属性用于指定控件的精确位置,X坐标和Y坐标分别对应控件在屏幕上的水平和垂直位置。 2. **...

    Android考试复习题

    ### Android考试复习题知识点详解 #### 一、解答题知识点详解 **1. Android应用程序的四大组件** - **Activity**:表示用户可见的界面。一个应用程序通常由多个Activity组成,每个Activity代表一个屏幕上的交互...

    Android复习

    在Android开发领域,复习是巩固和提升技能的关键环节。这里我们关注的是几个核心主题:JNI、ViewPager、Android组件间的通信,以及数据解析方法。以下是对这些主题的详细讲解。 首先,JNI(Java Native Interface)...

    Android上学期复习

    在准备Android上学期的复习时,我们关注的重点是掌握Android应用程序的基本架构和开发流程。首先,Android体系结构分为六个层次,包括系统App层、Java API框架层、原生C/C++库、Android运行时、硬件抽象层(HAL)...

Global site tag (gtag.js) - Google Analytics