欢迎阅读本文,你能关注本文,你知道你需要进程间通信、需要AIDL(以及Binder),那么可以默认你对这些概念已经有了一些了解,你(大致)知道它们是什么,它们有什么用,所以为了节约大家的眼力和时间,在此我不复制粘贴网上泛滥的博客或者翻译冗长的android文档。 关于AIDL的介绍在文档:docs/guide/developing/tools/aidl.html 关于IBinder的介绍在文档:docs/reference/android/os/IBinder.html 以及Binder:docs/reference/android/os/Binder.html 在后文中,我将以我自己的理解向你介绍相关的概念。以我目前粗浅的经验,应用程序使用AIDL的地方,几乎都和Service有关,所以你也需要知道一些关于Service的知识。日后得闲我也会继续写一些关于Service的贴。 本文将以一个例子来和你分享使用AIDL的基础技能,这个例子里有: 1、一个类mAIDLActivity,继承Activity。里面有三个按钮,text分别为StartService,StopService,CallbackTest。 2、一个类mAIDLService,继承Service。为了充分展示ADIL的功能,它做以下工作:当用户点击CallbackTest按钮时,从mAIDLActivity调用mAIDLService中的Stub
对象的一个方法invokCallBack(),而这个方法又会调用mAIDLActivity中Stub
对象的一个方法performAction(),这个方法在屏幕上显示一个toast。没什么意义,只是展示一下AIDL如何使用。 3、两个AIDL文件:forService.aidl和forActivity.aidl。对应名字,在Service和Activity中分别有对象需要用到它们定义的接口。 4、相关XML文件,略过。关于manifest中Service的语法,见docs/guide/topics/manifest/service-element.html。你也可以简单地在<application></application>中加入 <service android:name=".mAIDLService" android:process=":remote"> </service> 开发环境为Eclipse。 拣重要的先说,来看看aidl文件的内容: 文件:forActivity.aidl 文件:forService.aidl 这两个文件和Java文件放置的地方一样,看包名。 在Eclipse中它们将被自动编译为forActivity.java和forService.java,它们存放在gen目录下。为了方便手头无法演练的读者,代码贴上,不用细看。 文件forActivity.java: 文件forService.java: 两段代码差不多,前面基本一样,从后面看,最后跟着我们在AIDL中自定义的方法,没有实现。两个文件各定义一个了接口,这两个接口分别会在Activity和Service中使用,在那里我们将实现自定义的方法。两个接口中都定义了一个抽象类Stub,实现所在的接口。Stub中又有一个类Proxy。Stub中有一个static的asInterface()方法,里面有很多return语句,在mAIDLActivity中调用它时,它返回一个新创建的内部类Proxy对象。 这个Stub对我们来说很有用,它继承了Binder。Binder有什么用呢?一个类,继承了Binder,那么它的对象就可以被远程的进程使用了(前提是远程进程获取了这个类的对象【对象的引用】,至于如如何获得看下文),在本例中就是说,如果一个Service中有一个继承了Stub的类的对象,那么这个对象中的方法就可以在Activity中使用,对Activity也是这样。至于Binder的细节,网上有很多贴介绍,看不明白也不影响我们完成这个例子。 再看mAIDLActivity.java: 很短,相信大家很容易看明白。注意mConnection,它的onServiceConnected()中有一句mService = forService.Stub.asInterface(service);给mService赋值了,这个mService是一个forService,而service是onServiceConnected()传进来的参数,onServiceConnected()会在连接Service的时候被系统调用,这个service参数的值来自哪里呢?看mAIDLService.java: 注意onBind(),它的返回类型为IBinder,返回了一个mBinder,看看mBinder的定义: private final forService.Stub mBinder = new forService.Stub() { @Override @Override } }; 它是实现了我们在AIDL中定义的方法,这个mBinder最终返回给了mAIDLActivity中的mService,于是在mAIDLActivity中可以使用mBinder中的方法了。在mAIDLActivity中也有一个类似mBinder的对象,看看定义: private forActivity mCallback = new forActivity.Stub() { 我们要在界面上显示一个toast,就是在这里实现的。这个对象,在mConnection的onServiceConnected()被调用时,通过调用mService(也就是远程的mAIDLService中的mBinder)的registerTestCall(),传递给了mAIDLService,于是在mAIDLService中可以调用performAction()了。 很啰嗦,只为了能把这个细节说清楚。请大家认真看,我尽量避免错别字、混乱的大小写和逻辑不清的语法,相信你会看明白。是不是很简单?再啰嗦一下,做一个大致总结,我们使用AIDL是要做什么呢: 让Acticity(或者说一个进程/一个类?)和Service(或者说远端进程/远端类/对象?)获取对方的一个Stub对象,这个对象在定义时实现了我们在AIDL中定义的方法,于是这些远程对象中的方法可以在本地使用了。如果这种使用(通信)是单向的,比如只是Activity需要通知Service做什么,那么只要Service中有一个Stub对象,并且传给Acticity就够了。 至于如何获得远程的Stub,参看上面的代码,看mConnection、registerTestCall、onRebind,它们展示了一种方法。 另外,有时候我们可能在一个类中有多个Stub对象,它们都要给远程交互的类的实例,这个时候可以考虑使用RemoteCallbackList<>(docs/reference/android/os/RemoteCallbackList.html)。 欢迎阅读、收藏本文。例子随手写的,功能只在演示AIDL的使用。您可以转载本文,但请勿盲目乱贴。不是我小气,我不权威,我怕它被贴到泛滥,以讹传讹,害了人。
public void invokCallBack() throws RemoteException
{
callback.performAction();
}
public void registerTestCall(forActivity cb) throws RemoteException
{
callback = cb;
public void performAction() throws RemoteException
{
Toast.makeText(mAIDLActivity.this, "this toast is called from service", 1).show();
}
};
发表评论
-
下拉刷新的代码--转发
2013-11-19 14:18 535转发别人的代码 -
播放raw中的音乐范例
2013-03-05 16:09 918package cn.test.lee; impor ... -
创建可访问https的client
2012-05-23 09:54 939import java.io.IOException; ... -
android中将读回的xml inputstream打印为日志
2012-05-21 10:40 2573if(StringUtils.IsShowLog) ... -
将保存的文件读为bitmap
2012-05-21 10:38 1075private boolean getSavedPng ... -
将bitmap保存为文件
2012-05-21 10:37 810private void saveBmpToSd(Bi ... -
安装apk的函数
2012-04-12 13:04 940private void installApk(){ ... -
读取存储卡剩余空间
2012-01-06 21:37 742void readSDCard() { String st ... -
向Eclipse导入linux编译生成的jar包,调试android原生app
2012-01-06 11:01 4099Android 系统应用程序 Eclipse 开 ... -
转载---AIDL代理模式讲解图
2011-12-08 20:02 784goi -
监听电话的receiver片段
2011-11-24 12:05 740public class PhoneStatRecei ... -
Android系统应用程序Eclipse开发环境的搭建
2011-11-09 19:19 1<!-- [if !mso]> <styl ... -
转发---Android DRM
2011-11-09 19:17 1188简而言之,DRM系统提供一套机制对用户使用手机上的媒体内容(如 ... -
android 编译单独模块的命令
2011-10-20 19:47 1<!-- [if !mso]> <styl ... -
不匀速移动的Animaiton实例XML
2011-10-20 10:16 857<?xml version="1.0" ... -
截取屏幕图像返回Bitmap的函数
2011-10-20 10:14 1730Handler mMyHandler = new Ha ... -
光影魔术手--不失真压缩图片的方法
2011-08-31 12:51 6438光影魔术手--不失真压缩图片的方法 “光影魔术手(nEO i ... -
Android JNI完整调试过程
2011-08-18 15:06 7339整个JNI的调试过程如下: 1.创建手电筒工程 在工程中加 ...
相关推荐
AIDL----Android进程间通信(IPC)浅析测试代码,注释非常详细
android-AIDL-服务端+客户端Demo 都是一些简单的调用,里面包含hex工具类,安卓证书MD5,SHA-1获取工具类
AIDL(Android Interface Definition Language)示例程序,实现了在 Android 上的进程间通信(IPC),包含客户端和服务端代码。
Android IPC机制之 - AIDLhttps://blog.csdn.net/amoscxy/article/details/80262214对应源码
Android-AIDL(原文档翻译) AIDL==AndRoid接口描述语言
压缩包里面包括AIDL的服务端和客户端,可以实现跨APP访问的功能
Android-AIDL进程间通讯
本文详细讲解了android中AIDL的实现,浅显易懂。
aidl-Demo 遇到的问题: 1. Override的onServiceConnected无法回调:AndroidManifest的service的包名称要正确。 2.注意客户服务两端包名要一样。
《Android 中如何使用 AIDL 详细解析应用》的源代码。详见:https://blog.csdn.net/chaoqiangscu/article/details/83013010
Android艺术探索-AIDL笔记code
Android中Service的进程通信方式 - AIDL入门实践
安卓开发-aidl跨进程调用.zip
手动编写的AIDL,更好地理解Binder。理解binder在应用层面的通信过程。 了解服务端接口、Binder驱动、客户端接口三个模块之间的关系。
AIDLService,远程调用例子。包括服务端与客户端两个工程文件.zip,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
第一次成功尝试使用aidl进行activity进程和service进程之间的通信,第一次尝试的可以参考下。
AIDL
AIDL概述:AIDL是一个缩写,全称是Android Interface Definition Language,也就是Android接口定义语言,设计这门语言的目的是为了实现进程间通信。接下来我写了两个demo(AildeService和AidleClient),他们之间...
AIDL示例-进程间通信
本文档里含有详细的步骤,还有齐全的代码,复制粘贴即可运行