`
izuoyan
  • 浏览: 8934161 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Android之使用AIDL与远程服务实现进程通信

 
阅读更多

【0】通过startService()stopService()启动关闭服务。适用于服务和Activity之间没有调用交互的情况。

如果相互之间需要方法调用或者传递参数,需要使用bindService()unbindService()方法启动关闭服务。

采用Context.bindService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onBind()方法,这个时候调用者和服务绑定在一起。 如果客户端要与服务进行通信,那么,onBind()方法必须返回Ibinder对象。如果调用者退出了,系统就会先调用服务的onUnbind()方法,接着调用onDestroy()方法。如果调用bindService()方法前服务已经被绑定,多次调用bindService()方法并不会导致多次创建服务及绑定(也就是说onCreate()onBind()方法并不会被多次调用)。如果调用者希望与正在绑定的服务解除绑定,可以调用nbindService()方法,调用该方法也会导致系统调用服务的onUnbind()-->onDestroy()方法

【1】Android, 每个应用程序都有自己的进程,当需要在不同的进程之间传递对象时,该如何实现呢? 显然, Java中是不支持跨进程内存共享的。因此要传递对象, 需要把对象解析成操作系统能够理解的数据格式, 以达到跨界对象访问的目的。在JavaEE中,采用RMI通过序列化传递对象。在Android, 则采用AIDL方式实现。

AIDL(Android Interface Definition Language:接口描述语言)是一种接口定义语言,用于约束两个进程间的通讯规则,供编译器生成代码,实现Android设备上的两个进程间通信(IPC)AIDLIPC机制和EJB所采用的CORBA很类似,进程之间的通信信息,首先会被转换成AIDL协议消息,然后发送给对方,对方收到AIDL协议消息后再转换成相应的对象。由于进程之间的通信信息需要双向转换,所以android采用代理类在背后实现了信息的双向转换,代理类由android编译器生成,对开发人员来说是透明的。

【2】实现进程通信,一般需要下面四个步骤

  • 假设A应用需要与B应用进行通信,调用B应用中的download(String path)方法,B应用以Service方式向A应用提供服务。需要下面四个步骤:B应用中创建*.aidl文件,aidl文件的定义和接口的定义很相类,如:在cn.itcast.aidl包下创建IDownloadService.aidl文件,内容如下:

当完成aidl文件创建后,eclipse会自动在项目的gen目录中同步生成IDownloadService.java接口文件。接口文件中生成一个Stub的抽象类,里面包括aidl定义的方法,还包括一些其它辅助方法。值得关注的是asInterface(IBinder iBinder),它返回接口类型的实例,对于远程服务调用,远程服务返回给客户端的对象为代理对象,客户端在onServiceConnected(ComponentName name, IBinder service)方法引用该对象时不能直接强转成接口类型的实例,而应该使用asInterface(IBinder iBinder)进行类型转换。

编写Aidl文件时,需要注意下面几点:

1.接口名和aidl文件名相同。

2.接口和方法前不用加访问权限修饰符public,private,protected,也不能用final,static

3.Aidl默认支持的类型包话java基本类型(intlongboolean等)和(StringListMapCharSequence),使用这些类型时不需要import声明。对于ListMap中的元素类型必须是Aidl支持的类型。如果使用自定义类型作为参数或返回值,自定义类型必须实现Parcelable接口。

4.自定义类型和AIDL生成的其它接口类型在aidl描述文件中,应该显式import,即便在该类和定义的包在同一个包中。

5.aidl文件中所有非Java基本类型参数必须加上inoutinout标记,以指明参数是输入参数、输出参数还是输入输出参数。

6.Java原始类型默认的标记为in,不能为其它标记。

  • B应用中实现aidl文件生成的接口(本例是IDownloadService),但并非直接实现接口,而是通过继承接口的Stub来实现(Stub抽象类内部实现了aidl接口),并且实现接口方法的代码。内容如下:

  • B应用中创建一个Service(服务),在服务的onBind(Intent intent)方法中返回实现了aidl接口的对象(本例是ServiceBinder)。内容如下:

其他应用可以通过隐式意图访问服务,意图的动作可以自定义,AndroidManifest.xml配置代码如下:

  • B应用中aidl文件所在package连同aidl文件一起拷贝到客户端A应用,eclipse会自动在A应用的gen目录中为aidl文件同步生成IDownloadService.java接口文件,接下来就可以在A应用中实现与B应用通信,代码如下:

分享到:
评论

相关推荐

    android 使用AIDL和远程服务实现进程通信的学习

    NULL 博文链接:https://1002878825-qq-com.iteye.com/blog/1591195

    Android aidl远程服务代码

    Android 远程服务 aidl service代码demo,适合想要理解远程服务,跨进程通信

    Android AIDL 跨进程通信

    Android AIDL 远程服务实现跨进程通信,详解请参考:https://blog.csdn.net/Ikulm/article/details/131169568

    Android中如何利用AIDL机制调用远程服务

    在Android中,每个应用程序都有自己的进程,...AIDL是一种接口定义语言,用于约束两个进程间的通讯规则,供编译器生成代码,实现Android设备上的两个进程间通信(IPC)。AIDL的IPC机制和EJB所采用的CORBA很类似,进程之间

    Android Service的跨进程通信实战&Service/AIDL远程调用过程解析(Android Q)

    Service的跨进程通信实战 设想这么一个场景,我们有2个APP(或者2个进程,均可),...PersonServer端是服务的提供者,我们首先需要创建一个Service来提供该服务,并且需要该服务具备跨进程通信的能力,以便Client端进行

    实例讲解Android中的AIDL内部进程通信接口使用

    首先描述下我们想要实现的内容,我们希望在一个应用中通过点击按钮,去操作另一个进程中应用的音乐播放功能。 如图,我们点击“播放”时,系统就会去远程调用我们提供的一个service(与当前service不是同一个应用...

    android杀不死的app

    杀不死服务实现原理: 1:Android一个app可以启动2个进程 ...5:注意配置远程服务启动为一个新的进程,为新进程命名为 android:process=".remoteService" 6:进程A服务绑定进程B服务,进程B服务绑定进程A服务

    Android 进程间通信实现原理分析

    Android Service是分为两种: 本地服务(Local Service): 同一个apk内被调用 远程服务(Remote Service):被另一个apk调用远程服务需要借助AIDL来完成。 AIDL 是什么 AIDL (Android Interface Definition ...

    SimpleAIDL:用于远程服务和AIDL的简单Android应用演示

    简单AIDL 具有AIDL进程间通信的Android远程服务的简单示例本示例不处理配置更改。

    Android应用源码安卓源码(172个合集).zip

    android在wifi下手机与电脑的socket通信.rar android多线程断点下载.rar Android手机一键Root原理分析.zip Android手机的VoIP客户端 Sipdroid.rar Android有未接来电后处理(判断未接来电).rar Android模仿乐淘的应用...

    Android开发案例驱动教程 配套代码

    15.2 网络通信技术与实现 374 15.2.1 网络通信技术介绍 376 15.2.2 Java URL类实现方式 377 15.2.3 Apache HttpClient实现方式 378 15.3 数据交换格式 380 15.3.1 纯文本格式 381 15.3.2 XML格式 381 15.3.3 ...

    精通ANDROID 3(中文版)1/2

    11.2 使用Android服务  11.2.1 Android中的服务  11.2.2 本地服务  11.2.3 AIDL服务  11.2.4 在AIDL中定义服务接口  11.2.5 实现AIDL接口  11.2.6 从客户端应用程序调用服务  11.2.7 向服务传递复杂...

    android的服务

    与远程Service通信(进程间Service通信): 如何两个进程间的Service需要进行通信,则需要把对象序列化后进行互相发送。 Android提供了一个 AIDL (Android接口定义语言)工具 来处理序列化和通信。这种情况下Service...

    精通Android 3 (中文版)2/2

    11.2 使用Android服务  11.2.1 Android中的服务  11.2.2 本地服务  11.2.3 AIDL服务  11.2.4 在AIDL中定义服务接口  11.2.5 实现AIDL接口  11.2.6 从客户端应用程序调用服务  11.2.7 向服务传递复杂...

    Android 代码分析

    3 Android JAVA AIDL Analysis 15 4 Android JAVA Binder IPC System 20 5 Android Media Scanner Process 27 5.1 JAVA layer initialize 27 5.2 JAVA layer prescan 28 5.3 C++ layer processDirectory 28 5.4 JAVA...

Global site tag (gtag.js) - Google Analytics