前言:

前面总结了程序间共享数据,可以使用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一致

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

  1. Android探索之旅 | AIDL原理和实例讲解

    轉載自http://www.jianshu.com/p/ef86f682a8f9 -- 作者 谢恩铭 转载请注明出处 前言 为使应用程序之间能够彼此通信,Android提供了IPC (Inter Pr ...

  2. (转载)Android:学习AIDL,这一篇文章就够了(上)

    前言 在决定用这个标题之前甚是忐忑,主要是担心自己对AIDL的理解不够深入,到时候大家看了之后说——你这是什么玩意儿,就这么点东西就敢说够了?简直是坐井观天不知所谓——那样就很尴尬了.不过又转念一想, ...

  3. Android开发之---AIDL

    在Android开发中,有时会用到多进程通信,这时,可选的方案为: 1. Bundle    :四大组件之间的进程间通信 2. 文件共享   :适合无并发情景 3. Messager : 低并发的一对 ...

  4. Android 中的AIDL,Parcelable和远程服务

    Android 中的AIDL,Parcelable和远程服务      早期在学习期间便接触到AIDL,当时对此的运用也是一撇而过.只到近日在项目中接触到AIDL,才开始仔细深入.AIDL的作用    ...

  5. Android开发高级进阶——多进程间通信

    一. 什么是多进程? 多进程就是多个进程的意思,那么什么是进程呢? 当一个应用在开始运行时,系统会为它创建一个进程,一个应用默认只有一个进程,这个进程(主进程)的名称就是应用的包名. 进程的特点: 进 ...

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

    Service 什么是Service 在后台长期运行的没有界面的组件.其他组件可以启动Service让他在后台运行,或者绑定Service与它进行交互,甚至实现进程间通信(IPC).例如,可以让服务在 ...

  7. Android:学习AIDL,这一篇文章就够了(下)

    前言 上一篇博文介绍了关于AIDL是什么,为什么我们需要AIDL,AIDL的语法以及如何使用AIDL等方面的知识,这一篇博文将顺着上一篇的思路往下走,接着介绍关于AIDL的一些更加深入的知识.强烈建议 ...

  8. Android service binder aidl 关系

    /********************************************************************************** * Android servic ...

  9. (转载)Android:学习AIDL,这一篇文章就够了(下)

    前言 上一篇博文介绍了关于AIDL是什么,为什么我们需要AIDL,AIDL的语法以及如何使用AIDL等方面的知识,这一篇博文将顺着上一篇的思路往下走,接着介绍关于AIDL的一些更加深入的知识.强烈建议 ...

随机推荐

  1. 终于等到你:CYQ.Data V5系列 (ORM数据层)最新版本开源了

    前言: 不要问我框架为什么从收费授权转到免费开源,人生没有那么多为什么,这些年我开源的东西并不少,虽然这个是最核心的,看淡了就也没什么了. 群里的网友:太平说: 记得一年前你开源另一个项目的时候我就说 ...

  2. MVVM TextBox的键盘事件

    MVVM下RichTextBox的键盘回车事件设置为发送,不是回车 xmlns:i="http://schemas.microsoft.com/expression/2010/interac ...

  3. javascript之Object.defineProperty的奥妙

    直切主题 今天遇到一个这样的功能: 写一个函数,该函数传递两个参数,第一个参数为返回对象的总数据量,第二个参数为初始化对象的数据.如: var o = obj (4, {name: 'xu', age ...

  4. angular2系列教程(九)Jsonp、URLSearchParams、中断选择数据流

    大家好,今天我们要讲的是http模块的第二部分,主要学习ng2中Jsonp.URLSearchParams.observable中断选择数据流的用法. 例子

  5. java 利用ManagementFactory获取jvm,os的一些信息--转

    原文地址:http://blog.csdn.net/dream_broken/article/details/49759043 想了解下某个Java项目的运行时jvm的情况,可以使用一些监控工具,比如 ...

  6. 不懂CSS的后端难道就不是好程序猿?

    由于H5在移动端的发展如日中天,现在大部分公司对高级前端需求也是到处挖墙角,前端薪资也随之水涨船高,那公司没有配备专用的前端怎么办呢? 作为老板眼中的“程序猿” 前端都不会是非常无能的表现,那作为后端 ...

  7. duang~免费的学习视频来啦:学霸君之全栈测试

    学霸君向童鞋们推荐一款 同名学霸学习 视频教程 重点是完全免费收看学习噢!!! 今天 学霸君推荐腾讯课堂的学霸君之全栈测试 复制下方链接至腾讯课堂中报名学习 https://ke.qq.com/cou ...

  8. linux服务器开发一 基础

    注:本文仅限交流使用,请务用于商业用途,否则后果自负! Linux 1.Linux介绍 Linux是类Unix计算机操作系统的统称. Linux操作系统的内核的名字也是“Linux”. Linux这个 ...

  9. linux压力测试工具stress

    最近给PASS平台添加autoscaling的功能,根据服务器的负载情况autoscaling,为了测试这项功能用到了stress这个压力测试工具,这个工具相当好用了.具体安装方式就不说了.记录下这个 ...

  10. ELK分析IIS日志

      LogStash.conf input { file { type => "iis_log" path => ["C:/inetpub/logs/LogF ...