Android技术22:Android中AIDL

在Android中进程内部通过全局变量,文件,preference,数据库作为数据的载体实现数据共享和通信。然后在进程之间则需要借助Binder实现IPC调用。Android进程通信框架:服务端,客户端,Linux binder驱动。Binder驱动成为连接两端的桥梁。我们首先通过aidl语言实现一个简单的多进程通信。具体实现步骤如下:

1.定义aidl文件

IService.aidl,定义一个接口,test() ,不包含负责的类和数据。

1 package com.demo.ipc;
2
3 interface IService{
4     void test();
5 }

2.在gen目录下自动生成响应java文件,其主要类下生成一个Stub,该类为抽象类,继承了IBinder类,主要作为服务端,用于接收服务请求,与客户端打交道。

 1 /*
 2  * This file is auto-generated.  DO NOT MODIFY.
 3  * Original file: D:\\Android\\ipc\\src\\com\\demo\\ipc\\IService.aidl
 4  */
 5 package com.demo.ipc;
 6 public interface IService extends android.os.IInterface
 7 {
 8 /** Local-side IPC implementation stub class. */
 9 public static abstract class Stub extends android.os.Binder implements com.demo.ipc.IService
10 {
11 private static final java.lang.String DESCRIPTOR = "com.demo.ipc.IService";
12 /** Construct the stub at attach it to the interface. */
13 public Stub()
14 {
15 this.attachInterface(this, DESCRIPTOR);
16 }
17 /**
18  * Cast an IBinder object into an com.demo.ipc.IService interface,
19  * generating a proxy if needed.
20  */
21 public static com.demo.ipc.IService asInterface(android.os.IBinder obj)
22 {
23 if ((obj==null)) {
24 return null;
25 }
26 android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
27 if (((iin!=null)&&(iin instanceof com.demo.ipc.IService))) {
28 return ((com.demo.ipc.IService)iin);
29 }
30 return new com.demo.ipc.IService.Stub.Proxy(obj);
31 }
32 @Override public android.os.IBinder asBinder()
33 {
34 return this;
35 }
36 @Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException
37 {
38 switch (code)
39 {
40 case INTERFACE_TRANSACTION:
41 {
42 reply.writeString(DESCRIPTOR);
43 return true;
44 }
45 case TRANSACTION_test:
46 {
47 data.enforceInterface(DESCRIPTOR);
48 this.test();
49 reply.writeNoException();
50 return true;
51 }
52 }
53 return super.onTransact(code, data, reply, flags);
54 }
55 private static class Proxy implements com.demo.ipc.IService
56 {
57 private android.os.IBinder mRemote;
58 Proxy(android.os.IBinder remote)
59 {
60 mRemote = remote;
61 }
62 @Override public android.os.IBinder asBinder()
63 {
64 return mRemote;
65 }
66 public java.lang.String getInterfaceDescriptor()
67 {
68 return DESCRIPTOR;
69 }
70 @Override public void test() throws android.os.RemoteException
71 {
72 android.os.Parcel _data = android.os.Parcel.obtain();
73 android.os.Parcel _reply = android.os.Parcel.obtain();
74 try {
75 _data.writeInterfaceToken(DESCRIPTOR);
76 mRemote.transact(Stub.TRANSACTION_test, _data, _reply, 0);
77 _reply.readException();
78 }
79 finally {
80 _reply.recycle();
81 _data.recycle();
82 }
83 }
84 }
85 static final int TRANSACTION_test = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);
86 }
87 public void test() throws android.os.RemoteException;
88 }

3.创建服务端RemoteService

重写onBind()方法。

 1 public class RemoteService extends Service {
 2
 3     @Override
 4     public IBinder onBind(Intent intent) {
 5         return mBinder;
 6     }
 7
 8     IService.Stub mBinder=new Stub() {
 9
10         @Override
11         public void test() throws RemoteException {
12             Log.i("tag", "RemoteService--mBinder--add");
13
14         }
15     };
16
17 }

5.AndroidManifest.xml注册声明Service

1     <service android:name="com.demo.ipc.RemoteService" android:process=":remote">
2             <intent-filter>
3                 <action android:name="com.demo.ipc.RemoteService"/>
4             </intent-filter>
5         </service>

6.定义客户端

 1 package com.demo.ipc;
 2
 3 import android.content.ComponentName;
 4 import android.content.Context;
 5 import android.content.Intent;
 6 import android.content.ServiceConnection;
 7 import android.os.Bundle;
 8 import android.os.IBinder;
 9 import android.os.RemoteException;
10 import android.support.v7.app.ActionBarActivity;
11 import android.util.Log;
12 import android.view.View;
13 import android.view.View.OnClickListener;
14 import android.widget.Button;
15
16 public class MainActivity extends ActionBarActivity {
17
18     private Button bt1,bt2;
19     private IService mService;
20     private boolean isOpen=false;
21     private ServiceConnection serviceConnection=new ServiceConnection() {
22
23         @Override
24         public void onServiceDisconnected(ComponentName name) {
25             Log.i("tag", "MainActivity--ServiceConnextion--onServiceDisconnected");
26             mService=null;
27         }
28
29         @Override
30         public void onServiceConnected(ComponentName name, IBinder service) {
31             Log.i("tag", "MainActivity--ServiceConnextion--onServiceConnected");
32             mService=IService.Stub.asInterface(service);
33         }
34     };
35     @Override
36     protected void onCreate(Bundle savedInstanceState) {
37         super.onCreate(savedInstanceState);
38         setContentView(R.layout.activity_main);
39         bt1=(Button) findViewById(R.id.bt1);
40         bt2=(Button) findViewById(R.id.bt2);
41         bt1.setOnClickListener(new OnClickListener() {
42
43             @Override
44             public void onClick(View v) {
45                 if(!isOpen){
46                     bindService(new Intent("com.demo.ipc.RemoteService"), serviceConnection, Context.BIND_AUTO_CREATE);
47                 }else{
48                     unbindService(serviceConnection);
49                 }
50
51             }
52         });
53         bt2.setOnClickListener(new OnClickListener() {
54
55             @Override
56             public void onClick(View v) {
57                 try {
58                     mService.test();
59                 } catch (RemoteException e) {
60                     e.printStackTrace();
61                 }
62
63             }
64         });
65     }
66
67
68 }

7.显示结果

Android技术22:Android中AIDL,布布扣,bubuko.com

时间: 2024-08-05 11:18:21

Android技术22:Android中AIDL的相关文章

Android技术——在Android中的随意视图中找控件

1.在非常多情况下,我们可能不知道控件的id,可是我们却希望在包括这个控件的视图中找到它,能够採用例如以下做法: 例:在Activity的根视图中找出当中全部的Button控件 private void findButton(ViewGroup group, List<Button> result) { if (group != null) { for (int i = 0, j = group.getChildCount(); i < j; i++) { View child = gr

Android技术18:Android中Adapter类详解

1.Adapter设计模式 Android中adapter接口有很多种实现,例如,ArrayAdapter,BaseAdapter,CursorAdapter,SimpleAdapter,SimpleCursorAdapter等,他们分别对应不同的数据源.例如,ArrayAdater对应List和数组数据源,而CursorAdapter对应Cursor对象(一般从数据库中获取的记录集).这些Adapter都需要getView方法返回当前列表项显示的View对象.当Model发生改变时,会调用Ba

彻底明白Android中AIDL及其使用

1.为什么要有AIDL? 无论学什么东西,最先得弄明白为什么要有这个东西,不要说存在即是合理,存在肯定合理,但是你还是没有明白.对于AIDL有一些人的浅显概念就是,AIDL可以跨进程访问其他应用程序,和其他应用程序通讯,那我告诉你,很多技术都可以访问,如广播(应用A在AndroidManifest.xml中注册指定Action的广播)应用B发送指定Action的广播,A就能收到信息,这样也能看成不同应用之间完成了通讯(但是这种通讯是单向的):还如ContentProvider,通过URI接口暴露

彻底明确Android中AIDL及其使用

1.为什么要有AIDL? 不管学什么东西,最先得弄明确为什么要有这个东西.不要说存在即是合理.存在肯定合理,可是你还是没有明确. 对于AIDL有一些人的浅显概念就是,AIDL能够跨进程訪问其它应用程序,和其它应用程序通讯,那我告诉你.非常多技术都能够訪问,如广播(应用A在AndroidManifest.xml中注冊指定Action的广播)应用B发送指定Action的广播,A就能收到信息,这样也能看成不同应用之间完毕了通讯(可是这样的通讯是单向的).还如ContentProvider,通过URI接

Android中AIDL通信机制分析

一.背景 ·1.AIDL出现的原因 在android系统中,每一个程序都是运行在自己的进程中,进程之间无法进行通讯,为了在Android平台,一个进程通常不能访问另一个进程的内存空间,所以要想对话,需要将对象分解成操作系统可以理解的基本单元,并且有序的通过进程边界.通过代码来实现这个数据传输过程是冗长乏味的,Android提供了AIDL工具来处理这项工作,实现IPC(进行间的通信)与J2e中的RMI类似. ·2.绑定service 我看了很多人都博客都没有说到这里,其实我个人感觉AIDL就是一个

Android技术4:Android4.4中如何更新相册信息

当你到这篇文章时,你肯定遇到了在Android4.4版本中需要使用本地相册时,无法找到最新的照片这一问题.在Android4.4以前在需要获取手机本地图片信息时,只需要发送一个广播更新相册信息,然而系统更新到4.4之后该广播无效且报错. 广播如下: sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));

Android技术14:Android中layout_weight属性解析

为了更好的对空间进行布局,在LinearLayout中使用layout_weight,然后对于这一属性,在有些书上或者Android的初学者直接认为layout_weight值越大,控件权重就越大,所占用的空间就越大或者layout_wight值越小,控件空间就越大.这两种都是片面的,没有真正认识到layout_weight含义以及如何布局.下面首先演示使用代码为什么会有这两种感觉. 1.演示权重成反比 LinearLayout设置水平布局,然后里面空间宽度为fill_parent,layout

MyEclipse 10 中安装Android ADT 22插件的方法

MyEclipse 10 中安装Android ADT 22插件的方法 下载ADT包:http://dl.google.com/android/ADT-22.0.0.zip 将ADT-22.0.0.zip文件放在指定的目录下,例如D:\Programs\Android,不解压. 打开MyEclipse,点击菜单Help >MyEclipse Configuration Center,如下图 在MyEclipse Configuration Center中,点击Software标签,再点击add

Android中AIDL详解

欢迎转载,转载请注明出处http://blog.csdn.net/l664675249/article/details/50649676 介绍 Android Interface Definition Language (AIDL), Android接口定义语言.系统中的进程之间不能共享内存,因此,需要提供一些机制在不同进程之间进行数据通信Interprocess communication (IPC).AIDL就是解决这个问题的. 阅读本文需要了解Service的相关知识,关于Service的