Android:进程间通信第一发----AIDL

本贴最后更新于 3634 天前,其中的信息可能已经时移世异

最近来看研究一下神奇的AIDL通信,结果发现网上的教程都是很老很老的啊,全是在Eclipse上进行的,放到Android Studio有些方法就不行嘛.....

其实感觉网上的教程是有点过时,很多都是11,12年的。。现在的少年不太愿意分享咩= =

先发一下自己的代码链接吧:

https://github.com/buptljy/aidl_demo-service

https://github.com/buptljy/aidl_demo-client

这个demo呢,由service和client两个程序组成,把这两个程序下载到手机里,运行就OK了。

现在呢,我们来看看怎么做吧。好可惜不能上图,所以我会尽量的说的详细一点。

Android和Eclipse最大的不同是gradle的引入吧,虽然Eclipse也有,但没有Android Studio那么重视。

在Eclipse中,当你建立aidl文件之后,ADT会自动帮你生成java文件,而在Android Studio 中却需要自己手动操作啦!也不是很麻烦。下面说详细步骤!(代码贴在最后)


  1. 建立两个工程,package name不能一样!否则无法安装!我这里service的package是com.styling,client的package是com.style
  2. 将两个工程以Project的形式展开(这样你也可以看到generated文件夹里的生成的java文件),以下都为两个工程都要进行的操作:在main下建立一个名为aidl文件夹,在aidl下建立package,此时两个package的名字都要一样,如com.style,在com.style中建立mInterface.aidl文件。
  3. 打开client工程,在client工程里的MainActivity中写下绑定Service的代码,打开service工程,新建一个service,并在manifest.xml文件中定义service。


AIDL代码:
package com.style;
interface mInterface {
    void invokeTest();
}


MainActivity代码:
public class MainActivity extends Activity {
private static final String TAG = "AIDLActivity"; private Button btnOk; private Button btnCancel; private Button btnCallBack; private void Log(String str){ Log.d(TAG,"----------" + str + "----------"); } mInterface mService; private ServiceConnection mConnection = new ServiceConnection(){ public void onServiceConnected(ComponentName className, IBinder service){ Log("connect service"); mService = mInterface.Stub.asInterface(service); } public void onServiceDisconnected(ComponentName className){ Log("disconnect service"); mService = null; } }; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnOk = (Button)findViewById(R.id.btn_ok); btnCancel = (Button)findViewById(R.id.btn_cancel); btnCallBack = (Button)findViewById(R.id.btn_callback); btnOk.setOnClickListener(new OnClickListener(){ public void onClick(View v){ Bundle args = new Bundle(); Intent intent = new Intent("com.styling.service"); intent.putExtras(args); bindService(intent,mConnection,Context.BIND_AUTO_CREATE); } }); btnCancel.setOnClickListener(new OnClickListener(){ public void onClick(View v){ unbindService(mConnection); } }); btnCallBack.setOnClickListener(new OnClickListener(){ public void onClick(View v){ try{ Log.i(TAG,"current Thread id = " + Thread.currentThread().getId()); mService.invokeTest(); } catch(RemoteException e){ e.printStackTrace(); } } }); }

}


这里新建的ServiceConnection对象mConnection重写了两个方法,其中onServiceConnected方法,在Service连接之后会自动调用,这里是调用之后,实例化接口对象。

然后在看下面的Service代码,注意新建的mInterface.Stub对象mBinder,client在连接Service的时候,传入onServiceConnected函数的IBinder对象就是这个mBinder!然后在client端利用mBinder建立了一个mInterface的实例。这就实现了进程间的通信,有没有感觉这里有个Proxy,client并没有直接和Service通信,而是间接的!由于两个aidl文件所在的包名必须相同,所以我推测,进程间通信是根据aidl文件所在包来做选择的。


Service代码:
public class mService extends Service{
    private static final String TAG = "AIDLService";
private void Log(String str){ Log.i(TAG, "----------" + str + "----------"); } public void onCreate(){ Log("service created"); } public void onStart(Intent intent, int startId){ Log("service started id = " + startId); } public IBinder onBind(Intent t){ Log("service on bind"); return mBinder; } public void onDestroy(){ Log("service on destroy"); super.onDestroy(); } public boolean onUnbind(Intent intent){ Log("service on unbind"); return super.onUnbind(intent); } public void onRebind(Intent intent){ Log("service on rebind"); super.onRebind(intent); } private final mInterface.Stub mBinder = new mInterface.Stub() { public void invokeTest() throws RemoteException { // TODO Auto-generated method stub Log.e(TAG, "remote call from client! current thread id = " + Thread.currentThread().getId()); } };

}





  • Android

    Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    337 引用 • 324 回帖 • 1 关注
  • AIDL
    1 引用

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • 友情链接

    确认过眼神后的灵魂连接,站在链在!

    25 引用 • 373 回帖
  • CodeMirror
    2 引用 • 17 回帖 • 187 关注
  • Vditor

    Vditor 是一款浏览器端的 Markdown 编辑器,支持所见即所得、即时渲染(类似 Typora)和分屏预览模式。它使用 TypeScript 实现,支持原生 JavaScript、Vue、React 和 Angular。

    381 引用 • 1875 回帖 • 1 关注
  • 前端

    前端技术一般分为前端设计和前端开发,前端设计可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括 HTML、CSS 以及 JavaScript 等。

    247 引用 • 1340 回帖
  • C++

    C++ 是在 C 语言的基础上开发的一种通用编程语言,应用广泛。C++ 支持多种编程范式,面向对象编程、泛型编程和过程化编程。

    108 引用 • 153 回帖
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    948 引用 • 1460 回帖
  • 周末

    星期六到星期天晚,实行五天工作制后,指每周的最后两天。再过几年可能就是三天了。

    14 引用 • 297 回帖
  • 黑曜石

    黑曜石是一款强大的知识库工具,支持本地 Markdown 文件编辑,支持双向链接和关系图。

    A second brain, for you, forever.

    29 引用 • 306 回帖
  • SMTP

    SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。

    4 引用 • 18 回帖 • 651 关注
  • 域名

    域名(Domain Name),简称域名、网域,是由一串用点分隔的名字组成的 Internet 上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)。

    43 引用 • 208 回帖
  • JVM

    JVM(Java Virtual Machine)Java 虚拟机是一个微型操作系统,有自己的硬件构架体系,还有相应的指令系统。能够识别 Java 独特的 .class 文件(字节码),能够将这些文件中的信息读取出来,使得 Java 程序只需要生成 Java 虚拟机上的字节码后就能在不同操作系统平台上进行运行。

    180 引用 • 120 回帖 • 2 关注
  • RabbitMQ

    RabbitMQ 是一个开源的 AMQP 实现,服务器端用 Erlang 语言编写,支持多种语言客户端,如:Python、Ruby、.NET、Java、C、PHP、ActionScript 等。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

    49 引用 • 60 回帖 • 353 关注
  • Flume

    Flume 是一套分布式的、可靠的,可用于有效地收集、聚合和搬运大量日志数据的服务架构。

    9 引用 • 6 回帖 • 669 关注
  • 书籍

    宋真宗赵恒曾经说过:“书中自有黄金屋,书中自有颜如玉。”

    84 引用 • 414 回帖
  • Solidity

    Solidity 是一种智能合约高级语言,运行在 [以太坊] 虚拟机(EVM)之上。它的语法接近于 JavaScript,是一种面向对象的语言。

    3 引用 • 18 回帖 • 451 关注
  • 深度学习

    深度学习(Deep Learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。

    45 引用 • 44 回帖 • 1 关注
  • Mac

    Mac 是苹果公司自 1984 年起以“Macintosh”开始开发的个人消费型计算机,如:iMac、Mac mini、Macbook Air、Macbook Pro、Macbook、Mac Pro 等计算机。

    167 引用 • 597 回帖 • 3 关注
  • JWT

    JWT(JSON Web Token)是一种用于双方之间传递信息的简洁的、安全的表述性声明规范。JWT 作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以 JSON 的形式安全的传递信息。

    20 引用 • 15 回帖 • 19 关注
  • jsoup

    jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。

    6 引用 • 1 回帖 • 513 关注
  • Gitea

    Gitea 是一个开源社区驱动的轻量级代码托管解决方案,后端采用 Go 编写,采用 MIT 许可证。

    5 引用 • 16 回帖 • 6 关注
  • DNSPod

    DNSPod 建立于 2006 年 3 月份,是一款免费智能 DNS 产品。 DNSPod 可以为同时有电信、网通、教育网服务器的网站提供智能的解析,让电信用户访问电信的服务器,网通的用户访问网通的服务器,教育网的用户访问教育网的服务器,达到互联互通的效果。

    6 引用 • 26 回帖 • 535 关注
  • CSDN

    CSDN (Chinese Software Developer Network) 创立于 1999 年,是中国的 IT 社区和服务平台,为中国的软件开发者和 IT 从业者提供知识传播、职业发展、软件开发等全生命周期服务,满足他们在职业发展中学习及共享知识和信息、建立职业发展社交圈、通过软件开发实现技术商业化等刚性需求。

    14 引用 • 155 回帖
  • Angular

    AngularAngularJS 的新版本。

    26 引用 • 66 回帖 • 568 关注
  • Jenkins

    Jenkins 是一套开源的持续集成工具。它提供了非常丰富的插件,让构建、部署、自动化集成项目变得简单易用。

    54 引用 • 37 回帖 • 1 关注
  • 导航

    各种网址链接、内容导航。

    45 引用 • 177 回帖
  • 人工智能

    人工智能(Artificial Intelligence)是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门技术科学。

    125 引用 • 370 回帖
  • uTools

    uTools 是一个极简、插件化、跨平台的现代桌面软件。通过自由选配丰富的插件,打造你得心应手的工具集合。

    8 引用 • 37 回帖 • 1 关注