Android使用AIDL跨进程数据共享

 

AIDL:Android Interface Definition Language,即Android接口定义语言。

什么是AIDL

Android系统中的进程之间不能共享内存,因此,需要提供一些机制在不同进程之间进行数据通信。
为了使其他的应用程序也可以访问本应用程序提供的服务,Android系统采用了远程过程调用(Remote Procedure Call,RPC)方式来实现。与很多其他的基于RPC的解决方案一样,Android使用一种接口定义语言(Interface Definition Language,IDL)来公开服务的接口。我们知道4个Android应用程序组件中的3个(Activity、BroadcastReceiver 和ContentProvider)都可以进行跨进程访问,另外一个Android应用程序组件Service同样可以。因此,可以将这种可以跨进程访问 的服务称为AIDL(Android Interface Definition Language)服务。

既然aidl可以定义并实现进程通信,那么我们怎么使用它呢?文档/android-sdk/docs/guide/developing/tools/aidl.html中对步骤作了详细描述:

1.创建.aidl文件
AIDL使用简单的语法来声明接口,描述其方法以及方法的参数和返回值。这些参数和返回值可以是任何类型,甚至是其他AIDL生成的接口。
其中对于Java编程语言的基本数据类型 (int, long, char, boolean等),String和CharSequence,集合接口类型List和Map,不需要import 语句。
而如果需要在AIDL中使用其他AIDL接口类型,需要import,即使是在相同包结构下。AIDL允许传递实现Parcelable接口的类,需要import.
需要特别注意的是,对于非基本数据类型,也不是String和CharSequence类型的,需要有方向指示,包括in、out和inout,in表示由客户端设置,out表示由服务端设置,inout是两者均可设置。
AIDL只支持接口方法,不能公开static变量。

例如 (IMyService.aidl):

package com.demo; 

import com.demo.Person; 

interface IMyService { 
        void savePersonInfo(in Person person); 
        List<Person> getAllPerson(); 
}

 2.实现接口
创建一个类实现刚才那个aidl的接口:

public class RemoteService extends Service { 

        private LinkedList<Person> personList = new LinkedList<Person>(); 
         
        @Override 
        public IBinder onBind(Intent intent) { 
                return mBinder; 
        } 

        private final IMyService.Stub mBinder = new IMyService.Stub(){ 

                @Override 
                public void savePersonInfo(Person person) throws RemoteException { 
                        if (person != null){ 
                                personList.add(person); 
                        } 
                } 

                @Override 
                public List<Person> getAllPerson() throws RemoteException { 
                        return personList; 
                } 
        }; 
}

 代码较多,详细了解请移步:Android使用AIDL跨进程数据共享

猜你喜欢

转载自lexsain.iteye.com/blog/2176545