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

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

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

    333 引用 • 323 回帖 • 67 关注
  • AIDL
    1 引用

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • Eclipse

    Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。

    75 引用 • 258 回帖 • 626 关注
  • 机器学习

    机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。

    76 引用 • 37 回帖
  • Firefox

    Mozilla Firefox 中文俗称“火狐”(正式缩写为 Fx 或 fx,非正式缩写为 FF),是一个开源的网页浏览器,使用 Gecko 排版引擎,支持多种操作系统,如 Windows、OSX 及 Linux 等。

    7 引用 • 30 回帖 • 453 关注
  • LeetCode

    LeetCode(力扣)是一个全球极客挚爱的高质量技术成长平台,想要学习和提升专业能力从这里开始,充足技术干货等你来啃,轻松拿下 Dream Offer!

    209 引用 • 72 回帖 • 2 关注
  • BND

    BND(Baidu Netdisk Downloader)是一款图形界面的百度网盘不限速下载器,支持 Windows、Linux 和 Mac,详细介绍请看这里

    107 引用 • 1281 回帖 • 25 关注
  • 学习

    “梦想从学习开始,事业从实践起步” —— 习近平

    161 引用 • 473 回帖
  • Hexo

    Hexo 是一款快速、简洁且高效的博客框架,使用 Node.js 编写。

    21 引用 • 140 回帖 • 30 关注
  • 前端

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

    247 引用 • 1347 回帖
  • HTML

    HTML5 是 HTML 下一个的主要修订版本,现在仍处于发展阶段。广义论及 HTML5 时,实际指的是包括 HTML、CSS 和 JavaScript 在内的一套技术组合。

    103 引用 • 294 回帖
  • 单点登录

    单点登录(Single Sign On)是目前比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

    9 引用 • 25 回帖 • 3 关注
  • 安装

    你若安好,便是晴天。

    128 引用 • 1184 回帖
  • 支付宝

    支付宝是全球领先的独立第三方支付平台,致力于为广大用户提供安全快速的电子支付/网上支付/安全支付/手机支付体验,及转账收款/水电煤缴费/信用卡还款/AA 收款等生活服务应用。

    29 引用 • 347 回帖
  • webpack

    webpack 是一个用于前端开发的模块加载器和打包工具,它能把各种资源,例如 JS、CSS(less/sass)、图片等都作为模块来使用和处理。

    41 引用 • 130 回帖 • 295 关注
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    6564 引用 • 29469 回帖 • 247 关注
  • Telegram

    Telegram 是一个非盈利性、基于云端的即时消息服务。它提供了支持各大操作系统平台的开源的客户端,也提供了很多强大的 APIs 给开发者创建自己的客户端和机器人。

    5 引用 • 35 回帖 • 1 关注
  • FFmpeg

    FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。

    22 引用 • 31 回帖 • 4 关注
  • Love2D

    Love2D 是一个开源的, 跨平台的 2D 游戏引擎。使用纯 Lua 脚本来进行游戏开发。目前支持的平台有 Windows, Mac OS X, Linux, Android 和 iOS。

    14 引用 • 53 回帖 • 513 关注
  • 30Seconds

    📙 前端知识精选集,包含 HTML、CSS、JavaScript、React、Node、安全等方面,每天仅需 30 秒。

    • 精选常见面试题,帮助您准备下一次面试
    • 精选常见交互,帮助您拥有简洁酷炫的站点
    • 精选有用的 React 片段,帮助你获取最佳实践
    • 精选常见代码集,帮助您提高打码效率
    • 整理前端界的最新资讯,邀您一同探索新世界
    488 引用 • 383 回帖 • 4 关注
  • IBM

    IBM(国际商业机器公司)或万国商业机器公司,简称 IBM(International Business Machines Corporation),总公司在纽约州阿蒙克市。1911 年托马斯·沃森创立于美国,是全球最大的信息技术和业务解决方案公司,拥有全球雇员 30 多万人,业务遍及 160 多个国家和地区。

    16 引用 • 53 回帖 • 122 关注
  • JetBrains

    JetBrains 是一家捷克的软件开发公司,该公司位于捷克的布拉格,并在俄国的圣彼得堡及美国麻州波士顿都设有办公室,该公司最为人所熟知的产品是 Java 编程语言开发撰写时所用的集成开发环境:IntelliJ IDEA

    18 引用 • 54 回帖
  • 架构

    我们平时所说的“架构”主要是指软件架构,这是有关软件整体结构与组件的抽象描述,用于指导软件系统各个方面的设计。另外还有“业务架构”、“网络架构”、“硬件架构”等细分领域。

    140 引用 • 441 回帖
  • GitHub

    GitHub 于 2008 年上线,目前,除了 Git 代码仓库托管及基本的 Web 管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。正因为这些功能所提供的便利,又经过长期的积累,GitHub 的用户活跃度很高,在开源世界里享有深远的声望,并形成了社交化编程文化(Social Coding)。

    207 引用 • 2031 回帖 • 1 关注
  • Typecho

    Typecho 是一款博客程序,它在 GPLv2 许可证下发行,基于 PHP 构建,可以运行在各种平台上,支持多种数据库(MySQL、PostgreSQL、SQLite)。

    12 引用 • 60 回帖 • 464 关注
  • GAE

    Google App Engine(GAE)是 Google 管理的数据中心中用于 WEB 应用程序的开发和托管的平台。2008 年 4 月 发布第一个测试版本。目前支持 Python、Java 和 Go 开发部署。全球已有数十万的开发者在其上开发了众多的应用。

    14 引用 • 42 回帖 • 687 关注
  • Vue.js

    Vue.js(读音 /vju ː/,类似于 view)是一个构建数据驱动的 Web 界面库。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。

    261 引用 • 662 回帖
  • GitLab

    GitLab 是利用 Ruby 一个开源的版本管理系统,实现一个自托管的 Git 项目仓库,可通过 Web 界面操作公开或私有项目。

    46 引用 • 72 回帖 • 2 关注
  • 禅道

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

    5 引用 • 15 回帖 • 221 关注