Android探索之AIDL实现进程间通信

前言:

前面总结了程序间共享数据,可以使用ContentProvider也可以使用SharedPreference,那么进程间怎么共享内存呢?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)服务。

接下来实战一下具体实现:

1.)首先新建一个aidl文件
interface ITestInterface {
     //获取进程ID
    int getProcessId();

    //处理字符串
    String dealString( String srcString);

    //字符串追加
    String appendString( String srcString);

    void addPerson(in Person person);

    List<Person> getPersons();
}

aidl语法解说:

  • 声明函数基本和Java一致,可以传参和返回值,参数和返回值
  • 参数和返回值   Java编程语言的基本数据类型 (int, long, char, boolean等),String和CharSequence,集合接口类型List和Map、其他AIDL接口类型、实现Parcelable接口的自定义对象
  • 方向指示    在使用aidl传输数据时,对于非基本数据类型,也不是String和CharSequence类型的,(即Parcelable类型)需要有方向指示,包括in、out和inout。
  • AIDL只支持接口方法,不能公开static变量。

2.)服务端实现接口

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

        public int getProcessId(){
            Log.e("TestService","TestService  Thread: " + Thread.currentThread().getName());
            Log.e("TestService","TestService  getProcessId()");
            return  android.os.Process.myPid();
        }
        //处理字符串
        public String dealString( String srcString)
        {
            return srcString+srcString;
        }

        //字符串追加
        public  String appendString( String srcString)
        {
            return srcString+srcString;
        }

3.)客户端获取接口

   private  ServiceConnection connection = new ServiceConnection() {

        @Override
        public void onServiceDisconnected(ComponentName name) {
            Log.e("TestService","TestService  onServiceDisconnected()");
        }

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            iTestInterface =    ITestInterface.Stub.asInterface(service);
            try {
                Log.e("TestService","TestService  onServiceConnected()");
                int remoteId=iTestInterface.getProcessId();
                Log.e("TestService","TestService  remoteId---->"+remoteId);
                int currentPid = android.os.Process.myPid();
                Log.e("TestService","TestService  currentPid---->"+currentPid);
                Log.e("TestService","TestService  dealString---->"+iTestInterface.dealString("Remote Service"));
                Log.e("TestService","TestService  appendString---->"+iTestInterface.appendString("Remote Service"));
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }
    };

4.)通过IPC调用/传递数据

                int remoteId=iTestInterface.getProcessId();
                Log.e("TestService","TestService  remoteId---->"+remoteId);
                int currentPid = android.os.Process.myPid();
                Log.e("TestService","TestService  currentPid---->"+currentPid);
                Log.e("TestService","TestService  dealString---->"+iTestInterface.dealString("Remote Service"));
                Log.e("TestService","TestService  appendString---->"+iTestInterface.appendString("Remote Service"));

5.)Service声明以及绑定/解绑

声明:

       <service
            android:name=".TestService"
            android:enabled="true"
            android:exported="true"
            android:label="remoteService"
            android:process=":remote">
            <intent-filter android:priority="1000">
                <category android:name="android.intent.category.DEFAULT" />
                <action android:name="com.whoislcj.testaidl.TestService" />
            </intent-filter>
        </service>

绑定:

                Intent intent = new Intent("com.whoislcj.testaidl.TestService");
                intent.setPackage(getPackageName());//这里你需要设置你应用的包名
                bindService(intent, connection, Context.BIND_AUTO_CREATE);

解绑:

               unbindService(connection);
6.)访问权限同Service一致
时间: 2024-10-20 17:55:09

Android探索之AIDL实现进程间通信的相关文章

Android Studio中使用AIDL进行进程间通信

什么是AIDL aidl是 Android Interface definition language的缩写,也就是安卓接口定义语言 为什么要有AIDL AIDL允许你定义客户端与服务端达成一致的程序接口使用进程间通信相互交流. 在Android上面,一个进程不能正常的访问另一个进程的内存. 所以说,他们需要分解他们的对象为操作系统可以理解的基本单位,然后为你把这些对象按次序跨越进程边界 ,书写这些代码是单调冗长的,所以android使用AIDL为你处理这个问题. 注意:使用AIDL只有在你允许

Android开发之---AIDL

在Android开发中,有时会用到多进程通信,这时,可选的方案为: 1. Bundle    :四大组件之间的进程间通信 2. 文件共享   :适合无并发情景 3. Messager : 低并发的一对多即使通信,无RPC需求或无须要返回结果的RPC需求 4. AIDL        :一对多通信且有RPC需求 5. Content Provider : 一对多的进程间数据共享 6. Socket     : 网络数据交换 这里使用AIDL来举例,其实,Message底层也是AIDL来处理的,是对

Android中的AIDL Android studio中建aidl

1.aidl: android interface definition language,是一种它是一种android内部进程通信接口的描述语言,通过它我们可以定义进程间的通信接口icp:interprocess communication :内部进程通信 2.既然aidl可以定义并实现进程通信,那么我们怎么使用它呢?文档/android-sdk/docs/guide/developing/tools/aidl.html中对步骤作了详细描述: --1.Create your .aidl fil

Android中的Service与进程间通信(IPC)详解

Service 什么是Service 在后台长期运行的没有界面的组件.其他组件可以启动Service让他在后台运行,或者绑定Service与它进行交互,甚至实现进程间通信(IPC).例如,可以让服务在后台处理网络交互,播放音乐,文件I/O,或者与ContentProvider交互. 创建一个Service 新建一个类,继承Service,重写相关方法,如onBind,onUnBind,onCreate,onDestorey. 在AndroidManifest.xml中配置Service和相关权限

[转]Android 如何建立AIDL

建立AIDL服务要比建立普通的服务复杂一些,具体步骤如下:       (1)在Eclipse Android工程的Java包目录中建立一个扩展名为aidl的文件.该文件的语法类似于Java代码,但会稍有不同.详细介绍见实例52的内容.       (2)如果aidl文件的内容是正确的,ADT会自动生成一个Java接口文件(*.java).       (3)建立一个服务类(Service的子类).       (4)实现由aidl文件生成的Java接口.       (5)在AndroidMa

Android service binder aidl 关系

/********************************************************************************** * Android service binder aidl 关系 * 声明: * 最近一直被Android中的service.binder.aidl这三者之间的关系给搞得有点难受, * 于是就自己花了点时间,将他们之间的关系给画出来,这样思维上就清晰多了,也方便 * 和朋友沟通,减少沟通成本. * * 2016-1-10 晴 深圳

android 怎样用AIDL Service 传递复杂数据

大家都知道在Android中通过AIDL可以跨进程调用Service中的数据,网上也有很多实例,但是大部分实例都是关于基本数据类型的远程调用,很少讲到复杂数据的调用,今天我用一个例子来演示一下怎样用AIDL Service 传递复杂数据. 我们分2步开始: 第一步:部署我们的服务端,也就是Service端: 1:在Service端我先自定义2个类型:Person和Pet.因为我们需要跨进程传递Person对象和Pet对象,所以Person类和Pet类都必须实现Parcelable接口,并要求在实

Android中非aidl实现进程间通信(编写顺序的parcel写入与读出)

在android中进程间通信(IPC)的基石是Binder系统,Binder系统的核心Binder驱动是C来实现的,对于应用开发人员来说无疑晦涩难懂,而整个android框架是基于面向对象思想的,对于底层Binder驱动的操作细节全部隐藏,framework层提供了一个牛逼无比的Binder对象, 所以我们要实现进程间通信(IPC)只需玩转Binder对象即可. 在android源码中基于Binder对象的通信随处可见,几乎可以认定为以 I 打头的class,都具有进程间通信能力,如:IServ

Android学习小Demo(23)Aidl实现进程间通信

我们知道,Android是靠Binder机制来实现进程间的通信,而上一篇文章中,我们利用AIDL,简单地从代码方面的角度讲解了在服务端中的Binder的存在形式,是以服务的实现存在的,而在客户端,则是以代理的形式,实现存在的只是一个关于服务端的Binder实现的引用. 理论上的东西我们要去学习掌握,但是也不能忽略了实际的动手能力,对吧. 今天,我们就一步一步地利用我们所了解地关于AIDL的知识来实现一个跨进程通信的例子. 在Android的上层应用中,每一个App都是一个单独的进程,所以,要实现