AndroidStudio实现AIDL

AIDL的使用步骤

aidl远程调用传递的参数和返回值支持Java的基本类型(int long booen char byte等)和String,List,Map等。当然也支持一个自定义对象的传递。

服务端

新建一个MyAidlDemoServer工程,然后在main目录下右键新建一个aidl目录,然后在该目录下新建一个IMyAidlInterface.aidl文件,代码如下:

  

1 interface IMyAidlInterface {
2
3     int add(int arg1, int arg2);
4
5 }  //aidl文件里面的代码不需要加任何修饰符

这里定义了一个IMyAidlInterface接口,里面定义的add方法用于求和计算。

然后Build当前工程(Build选项里的Make Project)。

会发现在app/build/generated/source/aidl/debug目录下会生成一个与IMyAidlInterface.aidl文件同样包名的一个文件,该文件下面自动生成IMyAidlInterface文件,该文件里面自动实现了一些方法用于远程调用。

编写远程服务

新建MyService类继承Service,并实现以下代码。

  

 1 public class MyService extends Service {
 2     IMyAidlInterface.Stub mStub = new IMyAidlInterface.Stub() {
 3         @Override
 4         public int add(int arg1, int arg2) throws RemoteException {
 5             return arg1 + arg2;
 6         }
 7     };
 8
 9     @Override
10     public IBinder onBind(Intent intent) {
11         return mStub;
12     }
13 }

服务里的代码重写了IMyAidlInterface.Stub类中的 add方法,然后通过重写onBind()方法将重写的IMyAidlInterface.Stub类返回出去。

然后在AndroidManifest.xml对Service进行配置。

1  <service
2             android:process=":remote"
3             android:name=".MyService"
4             android:enabled="true"
5             android:exported="true">
6             <intent-filter>
7                 <action android:name="co.example.leo.myService"/>
8             </intent-filter>
9   </service>

这里设置了android:process属性,并且设置为":remote"。

android:process=":remote",代表在应用程序里,当需要该service时,会自动创建新的进程。而如果是android:process="remote",没有“:”分号的,则创建全局进程,不同的应用程序共享该进程。

然后添加了一个意图过滤器。

客户端

新建MyAidlDemoCustomer工程,然后直接把服务端的aidl目录直接拷贝到客户端的main目录下。这么一来客户端的aidl就无需编写了,直接和服务端的一模一样。包括路径的包名等。 当然也可以在客户端这边重新写aidl文件。

编辑布局文件:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent">
 5
 6     <TextView
 7         android:id="@+id/tv"
 8         android:layout_width="wrap_content"
 9         android:layout_height="wrap_content"
10         android:textSize="30sp" />
11 </LinearLayout>

这里只用了一个TextView来显示最终的计算结果。

然后编辑客户端的调用代码:

 1 public class MainActivity extends AppCompatActivity {
 2
 3         TextView tv;
 4         IMyAidlInterface mStub;
 5
 6         @Override
 7         protected void onCreate(Bundle savedInstanceState) {
 8             super.onCreate(savedInstanceState);
 9             setContentView(R.layout.activity_main);
10
11             tv = (TextView)findViewById(R.id.tv);
12
13             Intent intent = new Intent();
14             //由于是隐式启动Service 所以要添加对应的action,A和之前服务端的一样。
15             intent.setAction("co.example.leo.myService");
16             //android 5.0以后直设置action不能启动相应的服务,需要设置packageName或者Component。
17             intent.setPackage("co.example.leo.myaidldemoserver"); //packageName 需要和服务端的一致.
18             bindService(intent,serviceConnection,BIND_AUTO_CREATE);
19         }
20
21         private ServiceConnection serviceConnection = new ServiceConnection() {
22             @Override
23             public void onServiceConnected(ComponentName name, IBinder service) {
24                 //调用asInterface()方法获得IMyAidlInterface实例
25                   mStub = IMyAidlInterface.Stub.asInterface(service);
26                 if (mStub == null) {
27                     Log.e("MainActivity", "the mStub is null");
28                 } else {        //当mStub不为空就调用其add方法进行计算,并显示到TextView上面。
29                     try {
30                         int value = mStub.add(1, 8);
31                         tv.setText(value + "");
32                     } catch (RemoteException e) {
33                         e.printStackTrace();
34                     }
35                 }
36             }
37
38             @Override
39             public void onServiceDisconnected(ComponentName name) {
40
41             }
42         };
43
44
45         @Override
46         protected void onDestroy(){
47             //解绑服务
48             super.onDestroy();
49             unbindService(serviceConnection);
50         }
51 }
最后安装上客户端和服务端,打开客户端后会发现已经调用了服务端的方法并计算出了结果。

总结

这是一个在AS下最简单的一个AIDL编程: 
1.服务端创建一个aidl目录,然后在该目录下新建一个.aidl为后缀的接口类,该类定义远程调用的接口方法。 
2.build编译之后会在app/build/generated/source/aidl/debug目录下会生成aidl远程实现类,该类是AS自动生成的。 
3.在AndroidManifest.xml下配置Service的action和process属性。 
4.将服务端的aidl目录拷贝到客户端相应的目录下,然后编写客户端调用代码,AS下简单的aidl编程就ok了。

 
时间: 2024-10-23 03:09:31

AndroidStudio实现AIDL的相关文章

AndroidStudio通过AIDL开启、绑定远程Service

前言 关于服务的启动方式(startService().stopService().bindService().unbindService()),我这里就不多说了,可以参考这篇博文. 示例原理图 本文以一个简单的案例,记录一下怎么使用AIDL结合服务实现进程间的通信: 首先,创建两个项目,一个项目(RemoteService)作为远程服务提供端,另一个(RemoteServiceTest)作为调用远程服务的客户端.然后,当客户端绑定远程服务后,可以通过AIDL接口调用远程服务中的方法,原理过程如

AndroidStudio 使用AIDL

http://blog.csdn.net/ducklikejava/article/details/51559244 Android Studio中写的一个AIDL的小DEMO. 步骤很繁琐,本来不准备写的.但是写一下是为了记录,这一下午终于跑通了这玩意. 首先,你要有3个 Module,至少两个,但是最好是3个  一个是你的AIDL文件与它的Service所在的Module 一个是你的客户端Module,也就是你真正调用AIDL的Module 最后一个是你的AIDL需要使用的Parcelabl

AndroidStudio通过AIDL开启 绑定远程Service

转载 示例原理图 本文以一个简单的案例,记录一下怎么使用AIDL结合服务实现进程间的通信: 首先,创建两个项目,一个项目(RemoteService)作为远程服务提供端,另一个(RemoteServiceTest)作为调用远程服务的客户端.然后,当客户端绑定远程服务后,可以通过AIDL接口调用远程服务中的方法,原理过程如图: 远程服务RemoteService 项目 1.创建AIDL文件,选中要提供的服务类所在的包名,右键 -> New -> AIDL -> AIDL File文件,如图

Android Studio创建AIDL文件并实现进程间通讯

在Android系统中,跨进程通信是非常普遍的事情,它用到了Binder机制处理进程之间的交互.Binder机制会开放一些接口给java层,供android开发工程师调用进程之间通信.这些接口android封装到了AIDL文件里,当我们项目用到跨进程通信时可以创建.aidl文件,.aidl文件可以协助我们达到跨进程的通信.下面简单介绍用AndroidStudio创建AIDL文件的过程. a.新建AIDL文件 1.项目文件夹右键---> new --->选择AIDL 2.自定义一个接口名称 3.

Android Service的全面解析

Service基本用法 基本用法即同进程下Activity与Service双向通信,先描述整体实现过程然后直接上代码: 新建一个继承自Service的类MyService,然后在AndroidManifest.xml里注册这个Service Activity里面使用bindService方式启动MyService,也就是绑定了MyService(到这里实现了绑定,Activity与Service通信的话继续下面的步骤) 新建一个继承自Binder的类MyBinder 在MyService里实例化

[Android Pro] AndroidStudio导出jar包

reference :  http://blog.csdn.net/beijingshi1/article/details/38681281 不像在Eclipse,可以直接导出jar包.AndroidStudio只可以生成aar包. 在网上看到许多朋友问怎么可以像Eclipse一样导出jar包,其实我们只要知道它的原理就可以了. 用jar命令就可以打包你所需要的资源,并指定jar包名. 在网上下载Volley源代码,导出jar包为例子. 在Volley项目工程中,我修改了下他的gradle版本,

android的AIDL

一.AIDL的意义:           AIDL全称是Android Interface Definition Language,是android接口定义语言.AIDL就是为了避免我们一遍遍的写一些千篇一律的代码而出现的一个模板. 目的:实现进程间通信,而且在能在多进程并发的情况下进行进程间的通信. 与Messenger的区别: Messenger 是以串行的方式处理客户端发来的消息,如果有大量的并发请求那么Messenger就不大适合这些情况了,同时Messenger的作用主要是为了传递消息

AndroidStudio学习记录

AndroidStudio学习记录 1. 插件的使用. plugins.jetbrains.com插件网站. 2. 目录介绍: 1.Studio中有Project和Module的概念,前面说到Studio中一个窗口只能有一个项目,即Project,代表一个workspace,但是一个Project可以包含多个Module,比如你项目引用的Android Library, Java Library等,这些都可以看做是一个Module; 2.上述目录中将java代码和资源文件(图片.布局文件等)全部

Android的IPC机制(一)——AIDL的使用

综述 IPC(interprocess communication)是指进程间通信,也就是在两个进程间进行数据交互.不同的操作系统都有他们自己的一套IPC机制.例如在Linux操作系统中可以通过管道.信号量.消息队列.内存共享.套接字等进行进程间通信.那么在Android系统中我们可以通过Binder来进行进程间的通信.当然除了Binder我们还可以使用Socket来进行进程间的通信.  既然需要进程通信,那么就必须有多个进程.当然,在两个应用交互中必然出现多进程的情况.若是在一个应用中呢?我们