Android AIDL使用特定的解释
1.什么是aidl:aidl这是 Android Interface definition language缩写,认清,这是android进程间通信接口的叙事语言描述。通过它我们可以定义进程间通信接口
icp:interprocess communication :内部进程通信
2.既然aidl能够定义并实现进程通信,那么我们怎么使用它呢?文档/android-sdk/docs/guide/developing/tools/aidl.html中对步骤作了具体描写叙述:
--1.Create your .aidl file - This file defines an interface (YourInterface.aidl) that defines the methods and fields available to a client.
创建你的aidl文件,我在后面给出了一个样例,它的aidl文件定义例如以下:写法跟java代码类似,可是这里有一点值得注意的就是它可以引用其他aidl文件里定义的接口,可是不可以引用你的java类文件里定义的接口
- package com.cao.android.demos.binder.aidl;
 - import com.cao.android.demos.binder.aidl.AIDLActivity;
 - interface AIDLService {
 - void registerTestCall(AIDLActivity cb);
 - void invokCallBack();
 - }
 
--2.Add the .aidl file to your makefile - (the ADT Plugin for Eclipse manages this for you). Android includes the compiler, called AIDL, in the tools/ directory.
编译你的aidl文件,这个仅仅要是在eclipse中开发,你的adt插件会像资源文件一样把aidl文件编译成java代码生成在gen目录下。不用手动去编译:编译生成AIDLService.java如我样例中代码

--3.Implement your interface methods - The AIDL compiler creates an interface in the Java programming language from your AIDL interface. This interface has an inner abstract class named Stub that inherits the interface (and implements a few additional methods
 necessary for the IPC call). You must create a class that extends YourInterface.Stub and implements the methods you declared in your .aidl file.
实现你定义aidl接口中的内部抽象类Stub,public static abstract class Stub extends android.os.Binder implements com.cao.android.demos.binder.aidl.AIDLService
Stub类继承了Binder,并继承我们在aidl文件里定义的接口。我们须要实现接口方法,以下是我在样例中实现的Stub类:
- private final AIDLService.Stub mBinder = new AIDLService.Stub() {
 - @Override
 - public void invokCallBack() throws RemoteException {
 - Log("AIDLService.invokCallBack");
 - Rect1 rect = new Rect1();
 - rect.bottom=-1;
 - rect.left=-1;
 - rect.right=1;
 - rect.top=1;
 - callback.performAction(rect);
 - }
 - @Override
 - public void registerTestCall(AIDLActivity cb) throws RemoteException {
 - Log("AIDLService.registerTestCall");
 - callback = cb;
 - }
 - };
 
Stub翻译成中文是存根的意思,注意Stub对象是在被调用端进程,也就是服务端进程,至此,服务端aidl服务端得编码完毕了。
--4.Expose your interface to clients - If you're writing a service, you should extend Service and override Service.onBind(Intent) to return an instance of your class that implements your interface.
第四步告诉你怎么在client怎样调用服务端得aidl描写叙述的接口对象。doc仅仅告诉我们须要实现Service.onBind(Intent)方法,该方法会返回一个IBinder对象到client。绑定服务时不是须要一个ServiceConnection对象么。在没有了解aidl使用方法前一直不知道它是什么作用,事实上他就是用来在client绑定service时接收service返回的IBinder对象的:
- AIDLService mService;
 - private ServiceConnection mConnection = new ServiceConnection() {
 - public void onServiceConnected(ComponentName className, IBinder service) {
 - Log("connect service");
 - mService = AIDLService.Stub.asInterface(service);
 - try {
 - mService.registerTestCall(mCallback);
 - } catch (RemoteException e) {
 - }
 - }
 - public void onServiceDisconnected(ComponentName className) {
 - Log("disconnect service");
 - mService = null;
 - }
 - };
 
mService就是AIDLService对象,详细能够看我后面提供的演示样例代码,须要注意在client须要存一个服务端实现了的aidl接口描写叙述文件,可是client仅仅是使用该aidl接口,不须要实现它的Stub类,获取服务端得aidl对象后mService = AIDLService.Stub.asInterface(service);,就能够在client使用它了。对mService对象方法的调用不是在client运行。而是在服务端运行。
4.aidl中使用java类,须要实现Parcelable接口,而且在定义类同样包以下对类进行声明:
上面我定义了Rect1类
之后你就能够在aidl接口中对该类进行使用了
package com.cao.android.demos.binder.aidl;  
import com.cao.android.demos.binder.aidl.Rect1;
interface AIDLActivity {   
    void performAction(in Rect1 rect);   
}  
注意in/out的说明,我这里使用了in表示输入參数。out没有试过。为什么使用in/out临时没有做深入研究。
5.aidl使用完整演示样例,为了清除说明aidl使用,这里有一个样例,样例參考了博客:
http://blog.csdn.net/saintswordsman/archive/2010/01/04/5130947.aspx
作出说明
样例实现了一个AIDLTestActivity。AIDLTestActivity通过bindservice绑定一个服务AIDLTestService,通过并获取AIDLTestActivity的一个aidl对象AIDLService。该对象提供两个方法,一个是registerTestCall注冊一个aidl对象。通过该方法,AIDLTestActivity把本身实现的一个aidl对象AIDLActivity传到AIDLTestService,在AIDLTestService通过操作AIDLActivity这个aidl远端对象代理,使AIDLTestActivity弹出一个toast。完整样例见上传的资源:http://download.csdn.net/source/3284820
版权声明:本文博客原创文章,博客,未经同意,不得转载。
Android AIDL使用特定的解释的更多相关文章
- Android aidl Binder框架浅析
		
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38461079 ,本文出自[张鸿洋的博客] 1.概述 Binder能干什么?B ...
 - Android AIDL自动生成Java文件测试
		
/******************************************************************************** * Android AIDL自动生成 ...
 - Using self-defined Parcelable objects during an Android AIDL RPC / IPC call
		
Using self-defined Parcelable objects during an Android AIDL RPC / IPC call In my previous post “Usi ...
 - Android中的动画具体解释系列【4】——Activity之间切换动画
		
前面介绍了Android中的逐帧动画和补间动画,并实现了简单的自己定义动画.这一篇我们来看看怎样将Android中的动画运用到实际开发中的一个场景--Activity之间跳转动画. 一.定义动画资源 ...
 - Android Google Map v2具体解释:开发环境配置
		
Android Google Map v2具体解释:开发环境配置 --转载请注明出处:coder-pig 说在前面: 说到地 ...
 - log4net使用特定的解释
		
说明:该程序演示如何使用log4net记录日志信息. log4net它是-known开源组件的日志记录功能.使用log4net可以很容易地将信息记录到文件.控制台.Windows事件日志和数据库(含有 ...
 - Android系统APN配置具体解释
		
Android 系统APN配置具体解释 这些天一直在调系统原生的Settings.apk里面APN配置的问题.在设置里面手动添加了APN配置选项.可是在界面上还是看不到.所以跟了下代码.原以为就是简 ...
 - ANDROID L——Material Design详细解释(UI控制)
		
转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! Android L: Google已经确认Android L就是Android Lolli ...
 - Android开发之异步具体解释(二)之AsyncTask
		
请尊重他人的劳动成果,转载请注明出处:Android开发之异步具体解释(二)之AsyncTask http://blog.csdn.net/fengyuzhengfan/article/details ...
 
随机推荐
- Facebook Asynchronous Layout and Rending
			
Facebook Asynchronous Layout and Rending by 吴雪莹 dispatch_async(backgroundQueue, ^{ storyNode = [[FBS ...
 - Qt中使用的编码QTextCodec::
			
//如果界面上的中文依然显示乱码,那么请将main.cpp文件中的: QTextCodec::setCodecForTr(QTextCodec::codecForLocale()); //更改为: Q ...
 - hdu 4308 Saving Princess claire_  BFS
			
为了准备算法考试刷的,想明确一点即可,全部的传送门相当于一个点,当遇到一个传送门的时候,把全部的传送门都压入队列进行搜索 贴代码: #include <iostream> #include ...
 - projecteuler---->problem=14----Longest Collatz sequence
			
title: The following iterative sequence is defined for the set of positive integers: n n/2 (n is eve ...
 - poj 2935 Basic Wall Maze
			
是一个图论的基础搜索题- 没什么好说的就是搜索就好 主要是别把 代码写的太屎,错了不好找 #include<cstdio> #include<algorithm> #inclu ...
 - 【转】Directx11 SDK文档
			
原文地址:http://blog.csdn.net/cmt100/article/details/6343274 总结 这是一个初步的教程.我们将通过必要的步骤来创建一个Win32 Applicati ...
 - poj 1061 扩展欧几里德同余方程求解
			
摘要写在一瞪眼. #include<iostream> using namespace std; long long exgcd(long long a,long long b,long ...
 - 纯 Swift 封装的 SQLite 框架:SQLite.swift
			
SQLite.swift 是一个使用纯 Swift 语言封装 SQLite3 的操作框架. 特性: 简单的查询和参数绑定接口 安全.自动类型数据访问 隐式提交和回滚接口 开发者友好的错误处理和调试 文 ...
 - ASP.NET之AdRotator实现淘宝浏览页面的商品随机推荐功能
			
如今随便上个网都能够看到淘宝.京东等各大电商平台的双十一购物狂欢宣传,从2009年開始淘宝愣是把11.11这一天打造成了全民购物狂欢节.阿里巴巴的上市更是激发了阿里人的斗志,据说他们今年的目标是100 ...
 - Mybatis之ResultMap一个简短的引论,关联对象
			
基础部分能够查看我的还有一篇博客http://blog.csdn.net/elim168/article/details/40622491 MyBatis中在查询进行select映射的时候.返回类型能 ...