Android ApiDemos示例解析(39):App->Service->Local Service Binding

本例和下列Local Service Controller 的Activity代码都定义在LocalServiceActivities.Java 中,作为 LocalServiceActivities 内部类实现的。 调用的Service为LocalService。

LocalService既可以做为“Started” Service,也可以做为”Bound” Service。

一个“Bound” Service 可以通过Client/Service模式提供Service。它运行 应用程序组件(比如Activity)与之绑定,然后接受请求并返回响应或者提供进程间通信机制,它的生命周期通常与调用它的组 件(如Activity)相同。 而对于LocalService即作为“Started” Service又作为“Bound”Service,如果LocalService已作为 “Started” Service启动,中即使所有Client都断开与它的绑定,LocalService也不会停止。

如果一个Service需要作 为“Bound”Service运行其它组件与之绑定,就必须实现onBind方法。这个方法返回一个IBound对象给Client。Client可以通过 这个IBind对象来调用Service的方法。

Client可以通过bindService来实现与“Bound”Service的绑定,Service 与 Client 的绑定是异步实现的,因此Client 需要通过 ServiceConnection 接口来监视与Service之间的连接。 Client 调用 bindService 时,bindService 立即返回,之后当Android系统为Client 和Service之间建立起链接后调用 ServiceConnection 的 onServiceConnection 来通知Client 与Service之间的链接建立成功,并给Client返回 Service 提供的IBind对象。

LocalService 只提供给同一个Application的组件使用,不提供进程间通信接口,因此只需要派生一个Binder的子类如 果直接的函数调用接口。

// Class for clients to access.  Because we know
 // this service always runs in the same process as
 //its clients, we don't need to deal with IPC.
public class LocalBinder extends Binder {
 LocalService getService() {
 return LocalService.this;
 }
}

LocalBinder只提供了一个方法getService ,返回LocalService 对象自身。

LocalService的 onBind方法定 义:

@Override
public IBinder onBind(Intent intent) {
 return mBinder;
}

// This is the object that receives interactions from clients.  See
// RemoteService for a more complete example.
private final IBinder mBinder = new LocalBinder();

onBind的返回值为mBinder 为 LocalBinder类对象。它定义 了一个方法getService。

再来看看Client类 LocalServiceActivities.Binding 的实现:

private LocalService mBoundService;private ServiceConnection mConnection = new ServiceConnection() { public void onServiceConnected(ComponentName className, IBinder service) { // This is called when the connection with the service has been // established, giving us the service object we can use to // interact with the service.  Because we have bound to a explicit // service that we know is running in our own process, we can // cast its IBinder to a concrete class and directly access it. mBoundService = ((LocalService.LocalBinder)service).getService(); // Tell the user about this for our demo. Toast.makeText(Binding.this, R.string.local_service_connected, Toast.LENGTH_SHORT).show(); } public void onServiceDisconnected(ComponentName className) { // This is called when the connection with the service has been // unexpectedly disconnected -- that is, its process crashed. // Because it is running in our same process, we should never // see this happen. mBoundService = null; Toast.makeText(Binding.this, R.string.local_service_disconnected, Toast.LENGTH_SHORT).show(); }}; 

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索方法
, service
, client
, can通信
, getservice
, 一个
, The
, App之间的通信
, App之间通信
与Service
android studio、android官网、android sdk、android开发、android sdk下载,以便于您获取更多的相关知识。

时间: 2024-11-02 00:38:27

Android ApiDemos示例解析(39):App->Service->Local Service Binding的相关文章

Android ApiDemos示例解析(43):App->Service->Remote Service Controller

Remote Service Controller 和使用Local Service的Android ApiDemo示例解析(40):App->Service->Local Service Controller 都是使用Service的"Started" 模式,RemoteService在 AndroidManifest.xml中的定义如下: <service android:name=".app.RemoteService" android:pr

Android ApiDemos示例解析(37):App-&amp;gt;Search-&amp;gt;Query Search Results

这个例子单独运行时(从Launcher启动),这时接受到的Intent不含ACTION_SEARCH,和一个普通的Activity没有什么两样. 在例(36)时,它是作为查询处理Activity用于显示用户查询内容. SearchQueryResults 在AndroidManifest.xml定义为 Searchable Activity: <intent-filter> <action android:name="android.intent.action.SEARCH&q

Android ApiDemos示例解析(35):App-&amp;gt;Preferences-&amp;gt;Advanced preferences

前篇文章Android ApiDemo示例解析(31):App->Preferences->Launching preferences 中用到了Advanced preferences 中定义的AdvancedPreferences. 本篇具体介绍AdvancedPreferences, 这个例子称为Advanced ,是因为 它涉及到了自定义Preference, 并在一个工作线程中刷新某个Preference的值. Preference 为显示在 PreferenceActivity (一

Android ApiDemos示例解析(30) App-&amp;gt;Preferences-&amp;gt;Preferences from XML

我们在前面的例子Android ApiDemo示例解析(9):App->Activity->Persistent State 介绍了可以使用Shared Preferences来存储一些状态,Shared Preferences更一般的用法是用来存储一些应用程序偏好(设置). 包 android.preference 提供了很多类可以方便应用程序来显示和设置应用相关的偏好.当然你可以使用自定义的UI来配置这些程 序偏好.但使用android.preference中定义的类可以给用户一个统一的U

Android ApiDemos示例解析(14) App-&amp;gt;Activity-&amp;gt;Save &amp;amp; Restore State

Save & Restore State与之前的例子Android ApiDemo示例解析(9):App->Activity->Persistent State 实现的 UI类似,但功能和实现方法稍有不同.(9)是通过Shared Preferences 和 Activity 的onPause() ,和onResume()来保持UI中 EditText 的值.本例是通过onSaveInstanceState(Bundle savedBundle) 来实现保持UI状态. 和onPause

Android ApiDemos示例解析(42):App-&amp;gt;Service-&amp;gt;Remote Service Binding

本例和下个例子Remote Service Controller 涉及到的文件有RemoteService.java ,IRemoteService.aidl, IRemoteServiceCallback.aidl 及ISecondary.aidl. Android Interface Definition Language(AIDL)和其它一些支 持远程方法调用RMI的系统的IDL类似,它定义了Service和Client 之间的使用接口约定,这种远程调用一般需要通过进程间通信 机制(IPC

Android ApiDemos示例解析(40):App-&amp;gt;Service-&amp;gt;Local Service Controller

Local Service Controller 是将LocalService当作"Started"Service来使用,相对于"Bound" Service 来说,这种模式 用法要简单得多,LocalServiceActivities.Controller 启动Local Service 之后就基本上不管LocalService了 startService(new Intent(Controller.this, LocalService.class)); Loca

Android ApiDemos示例解析(20) App-&amp;gt;Alarm-&amp;gt;Alarm Service

Alarm Service和Alarm Controller 例子非常类似,只是Alarm Service是用来Schedule一个Service,而前面的例子是来 Schedule一个Broadcast. 前面说过PendingIntent ,可以来描述一个Activity ,Broadcast,或是一个Service.本例是 Schedule一个Alarm事件来启动一个Service.这通常用于来执行一个较费时的任务. 关于如果编写一个Service将在后面 的有专门的例子来说明,只里不详述

Android ApiDemos示例解析(21) App-&amp;gt;Device Admin

Device Admin示例介绍了类DeviceAdminReceiver,DevicePolicyManager和ActivityManager. 类 DevicePolicyManager 用于管理Android设备定义的一些策略,主要指密码定义的长度,密码是否要含大写字母,小写字母等设 置密码需要满足的规范,锁定设备或是清除所有用户数据,这个类一般需要配合DeviceAdminReceiver来使用. DeviceAdminReceiver派生于BroadcastReceiver,可以接受