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

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

最近来看研究一下神奇的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 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    335 引用 • 324 回帖
  • AIDL
    1 引用

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    498 引用 • 1395 回帖 • 249 关注
  • CongSec

    本标签主要用于分享网络空间安全专业的学习笔记

    1 引用 • 1 回帖 • 29 关注
  • FlowUs

    FlowUs.息流 个人及团队的新一代生产力工具。

    让复杂的信息管理更轻松、自由、充满创意。

    1 引用 • 1 关注
  • Linux

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议,并支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    952 引用 • 944 回帖
  • 星云链

    星云链是一个开源公链,业内简单的将其称为区块链上的谷歌。其实它不仅仅是区块链搜索引擎,一个公链的所有功能,它基本都有,比如你可以用它来开发部署你的去中心化的 APP,你可以在上面编写智能合约,发送交易等等。3 分钟快速接入星云链 (NAS) 测试网

    3 引用 • 16 回帖
  • SQLite

    SQLite 是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是全世界使用最为广泛的数据库引擎。

    5 引用 • 7 回帖
  • 房星科技

    房星网,我们不和没有钱的程序员谈理想,我们要让程序员又有理想又有钱。我们有雄厚的房地产行业线下资源,遍布昆明全城的 100 家门店、四千地产经纪人是我们坚实的后盾。

    6 引用 • 141 回帖 • 593 关注
  • 钉钉

    钉钉,专为中国企业打造的免费沟通协同多端平台, 阿里巴巴出品。

    15 引用 • 67 回帖 • 286 关注
  • 国际化

    i18n(其来源是英文单词 internationalization 的首末字符 i 和 n,18 为中间的字符数)是“国际化”的简称。对程序来说,国际化是指在不修改代码的情况下,能根据不同语言及地区显示相应的界面。

    8 引用 • 26 回帖 • 1 关注
  • AngularJS

    AngularJS 诞生于 2009 年,由 Misko Hevery 等人创建,后为 Google 所收购。是一款优秀的前端 JS 框架,已经被用于 Google 的多款产品当中。AngularJS 有着诸多特性,最为核心的是:MVC、模块化、自动化双向数据绑定、语义化标签、依赖注入等。2.0 版本后已经改名为 Angular。

    12 引用 • 50 回帖 • 507 关注
  • V2Ray
    1 引用 • 15 回帖 • 2 关注
  • 生活

    生活是指人类生存过程中的各项活动的总和,范畴较广,一般指为幸福的意义而存在。生活实际上是对人生的一种诠释。生活包括人类在社会中与自己息息相关的日常活动和心理影射。

    230 引用 • 1454 回帖
  • ReactiveX

    ReactiveX 是一个专注于异步编程与控制可观察数据(或者事件)流的 API。它组合了观察者模式,迭代器模式和函数式编程的优秀思想。

    1 引用 • 2 回帖 • 183 关注
  • 禅道

    禅道是一款国产的开源项目管理软件,她的核心管理思想基于敏捷方法 scrum,内置了产品管理和项目管理,同时又根据国内研发现状补充了测试管理、计划管理、发布管理、文档管理、事务管理等功能,在一个软件中就可以将软件研发中的需求、任务、bug、用例、计划、发布等要素有序的跟踪管理起来,完整地覆盖了项目管理的核心流程。

    6 引用 • 15 回帖 • 24 关注
  • etcd

    etcd 是一个分布式、高可用的 key-value 数据存储,专门用于在分布式系统中保存关键数据。

    6 引用 • 26 回帖 • 547 关注
  • Gzip

    gzip (GNU zip)是 GNU 自由软件的文件压缩程序。我们在 Linux 中经常会用到后缀为 .gz 的文件,它们就是 Gzip 格式的。现今已经成为互联网上使用非常普遍的一种数据压缩格式,或者说一种文件格式。

    9 引用 • 12 回帖 • 165 关注
  • 浅吟主题

    Jeffrey Chen 制作的思源笔记主题,项目仓库:https://github.com/TCOTC/Whisper

    1 引用 • 28 回帖
  • 创造

    你创造的作品可能会帮助到很多人,如果是开源项目的话就更赞了!

    184 引用 • 1015 回帖
  • CAP

    CAP 指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得。

    12 引用 • 5 回帖 • 635 关注
  • Kubernetes

    Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。

    116 引用 • 54 回帖
  • 深度学习

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

    54 引用 • 41 回帖
  • 导航

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

    43 引用 • 177 回帖
  • 分享

    有什么新发现就分享给大家吧!

    248 引用 • 1794 回帖 • 2 关注
  • Word
    13 引用 • 40 回帖
  • JWT

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

    20 引用 • 15 回帖 • 23 关注
  • PWA

    PWA(Progressive Web App)是 Google 在 2015 年提出、2016 年 6 月开始推广的项目。它结合了一系列现代 Web 技术,在网页应用中实现和原生应用相近的用户体验。

    14 引用 • 69 回帖 • 178 关注
  • uTools

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

    7 引用 • 27 回帖