Android ApiDemos示例解析(42):App->Service->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系统,一个进程(Process)通常不能直接访问其它进程的内存空间,Android系统支持使用AIDL来 实现使用不同进程间调用服务接口。

在设计AIDL接口之前,要意识到使用AIDL接口是通过直接函数调用的方法来进行的 ,但这种远程调用所发生的线程Thread随调用者是否和Service提供者属于同一进程Process的不同而不同:

如 果调用者与Service属于同一个进程(可以称为Local Process),那么AIDL Call将使用与调用者同一线程执行。因此如果你的 应用只使用Local Process来访问AIDL Call,那么根本就无必要使用AIDL接口,使用Binder即可,参见Android ApiDemo示例解 析(39):App->Service->Local Service Binding。

如果使用Remote Process方式来调用AIDL ,Android 将会使用由本进程管理的线程池(Thread pool)来分发函数调用。因此你的Service需要能够处理多进程触发的AIDL Call,换句 话来说,AIDL接口的实现必须是Thread-safe的。

关键字oneway 可以修改远程调用的的行为,当使用oneway关 键字时,remote call调用后立即返回,有点类似异步调用。

定义AIDL 接口的步骤如下:

AIDL接口定 义使用Java Interface语法定义在 .aidl文件中,然后必须同时放在Service和Client 的 src目录下。 当使用Eclipse 编译时 ,Android SDK工具会根据 .aidl的接口定义自动生成对应的IBinder接口定义 (定义在gen目录下) Service必须实现由这个 IBinder接口定义。 Client然后可以通过绑定Service来访问这些方法。

1. 创建. aidl 文件

AIDL接口定义使用 和Java Interface定义同样的语法,每个.aidl文件只能定义一个调用接口,而且只能定义接口方法,不能含有静态变量定义。 AIDL缺省支持 int ,long, char, boolean, String, CharSequence, List ,Map 变量类型,也可以引用其它 .aidl中定义的类 型。

下面是IRemoteService.aidl 的定义,

package com.example.android.apis.app;
import com.example.android.apis.app.IRemoteServiceCallback;
/**
 * Example of defining an interface for calling on to a remote service
 * (running in another process).
 */
interface IRemoteService {
 /**
 * Often you want to allow a service to call back to its clients.
 * This shows how to do so, by registering a callback interface with
 * the service.
 */
 void registerCallback(IRemoteServiceCallback cb);
 /**
 * Remove a previously registered callback interface.
 */
 void unregisterCallback(IRemoteServiceCallback cb);<br />
}

编译时,Android SDK 工具自动在gen目录下生成对应的 IRemoteService.java。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索android
, android service
, 接口
, android + service
, aidl
, 进程
, service
, android callback
, app接口
, aidl文件定义
, app接口安全
, app接口天气android
, AIDL详解
AIDL进程间通信
android studio、android官网、android sdk、android开发、android sdk下载,以便于您获取更多的相关知识。

时间: 2024-09-17 03:40:11

Android ApiDemos示例解析(42):App-&gt;Service-&gt;Remote Service Binding的相关文章

Android ApiDemos示例解析(43):App-&amp;gt;Service-&amp;gt;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示例解析(39):App-&amp;gt;Service-&amp;gt;Local Service Binding

本例和下列Local Service Controller 的Activity代码都定义在LocalServiceActivities.Java 中,作为 LocalServiceActivities 内部类实现的. 调用的Service为LocalService. LocalService既可以做为"Started" Service,也可以做为"Bound" Service. 一个"Bound" Service 可以通过Client/Servi

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,可以接受

Android ApiDemos示例解析(19) App-&amp;gt;Alarm-&amp;gt;Alarm Controller

Alarm Controller演示如何在Android应用中使用Alarm事件,其功能和java.util.Timer ,TimerTask类似.但Alarm可以即使 当前应用退出后也可以做到Schedule一个任务在指定的时刻执行. AlarmManager 用于管理Alarm事件,支持单次执行或 重复执行. 和大都数Android服务一样,AlarmManager也是通过getSystemService来获取服务对象: AlarmManager am = (AlarmManager)get