一、IPC进程间通信

IPC是进程间通信方法的统称,Linux IPC包括以下方法,Android的进程间通信主要采用是哪些方法呢?

1. 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信;
   2. 信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数);
   3. 报文(Message)队列(消息队列):消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。
   4. 共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。
   5. 信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。
   6. 套接口(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和System V的变种都支持套接字。

二、AIDL(Android Interface Definition Language)

AIDL - Android Interface Definition Language - Android 接口定义语言。因为在Android中,应用程序运行在各自独立的进程里。应用程序之间是不能访问对方的内存空间的。有时为了实现进程间的通信,要用到PCI机制。Android支持PCI机制,但是需要Android能读懂的序列化数据(marshaling/un marshaling of data).    AIDL就是为了描述这样的数据产生的,它是一种接口定义语言。语法类似JAVA,.aidl文件里面写的是公布给客户端接口声明。

本文中,为了吸取客户端,服务器端两个android 项目的经验,将两段整合到一个android项目里,这样可能会比较清晰。下面就看看实例解析吧。

三、AIDL介绍及解析

1.AIDL介绍

在Android中,每个应用(Application)执行在它自己的进程中,无法直接调用到其他应用的资源,这也符合“沙箱”的理念。所谓沙箱原理,一般来说用在移动电话业务中,简单地说旨在部分地或全部地隔离应用程序。关于沙箱技术我们这里就不多做介绍了。因此,在Android中,当一个应用被执行时,一些操作是被限制的,比如访问内存,访问传感器,等等。这样做可以最大化地保护系统,免得应用程序“为所欲为”。那我们有时需要在应用间交互,怎么办呢?于是,Android需要实现IPC协议。然而,这个协议还是有点复杂,主要因为需要实现数据管理系统(在进程或线程间传递数据)。Android为我们实现了自己的IPC,也就是AIDL。

2.定义AIDL接口

AIDL是IPC的一个轻量级实现,用了对于Java开发者来说很熟悉的语法。Android也提供了一个工具,可以自动创建Stub(类构架,类骨架)。当我们需要在应用间通信时,我们需要按以下几步走:

a. 定义一个AIDL接口

b. 为远程服务(Service)实现对应Stub

c. 将服务“暴露”给客户程序使用

3.实例解析

AIDL的语法很类似Java的接口(Interface),只需要定义方法的签名。

AIDL支持的数据类型与Java接口支持的数据类型有些不同

a. 所有基础类型(int, char, 等)

b. String,List,Map,CharSequence等类

c. 其他AIDL接口类型

d. 所有Parcelable的类

下面以一个加法器为例来做解析。

(1)创建工程,创建AIDL接口:新建一个文件,命名为IAdditionService.aidl 即可

package com.czm.hellosumaidl;interface IAdditionService{int add(int value1,int value2);
}

一旦文件被保存,Android的AIDL工具会在 gen/com/android/hellosumaidl 这个文件夹里自动生成对应的 IAdditionService.java 这个文件。因为是自动生成的,所以无需改动。这个文件里就包含了 Stub ,我们接下来要为我们的远程服务实现这个Stub。

(2)实现远程服务

首先我们新建一个类,取名叫AdditionService.java 。为了 实现我们 的服务,我们需要让 这个 类中的 onBind方法返回一个 IBinder 类的对象。这个 IBinder 类的对象就代表了远程服务的实现。为了实现这个服务,我们要用到自动生成的子类 IAdditionService.Stub 。在其中,我们也必须实现我们之前在AIDL文件中定义的 add() 函 数。下面是我们远程服务的代码:

public class AdditionService extends Service{@Override  public void onCreate() {  super.onCreate();  } @Overridepublic IBinder onBind(Intent intent) {// TODO Auto-generated method stubreturn new IAdditionService.Stub() {@Overridepublic int add(int value1, int value2) throws RemoteException {// TODO Auto-generated method stubreturn value1 + value2;}};}@Override  public void onDestroy() {  super.onDestroy();  } }

(3)提供服务(“暴露”服务给使用者)

一旦实现了服务中的onBind方法 ,我们就可以把客户程序(在这里是MainActivity.java )与服务连接起来了。为了建立这样的一个链接 ,我们需要实现 ServiceConnection 类。我们在 MainActivity.java 创建一个内部类 AdditionServiceConnection ,这个类继承 ServiceConnection 类,并且重写了它的两个方法: onServiceConnected 和 onServiceDisconnected。下面给出 内部类的代码:

class AdditionServiceConnection implements ServiceConnection {@Overridepublic void onServiceConnected(ComponentName name, IBinder boundService) {// TODO Auto-generated method stubservice = IAdditionService.Stub.asInterface((IBinder) boundService);Toast.makeText(MainActivity.this, "Service connected",Toast.LENGTH_SHORT).show();}@Overridepublic void onServiceDisconnected(ComponentName name) {// TODO Auto-generated method stubservice = null;Toast.makeText(MainActivity.this, "Service disconnected",Toast.LENGTH_SHORT).show();}}

(4)相关代码及效果截图

MainActivity.java的全部代码如下:

package com.czm.hellosumaidl;import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;public class MainActivity extends Activity {IAdditionService service;AdditionServiceConnection connection;EditText value1;EditText value2;TextView result;Button buttonCalc;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);initService();buttonCalc = (Button) findViewById(R.id.buttonCalc);value1 = (EditText) findViewById(R.id.value1);value1.setText("23");value2 = (EditText) findViewById(R.id.value2);value2.setText("24");result = (TextView) findViewById(R.id.result);buttonCalc.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {int v1, v2, res = -1;v1 = Integer.parseInt(value1.getText().toString());v2 = Integer.parseInt(value2.getText().toString());try {res = service.add(v1, v2);} catch (RemoteException e) {e.printStackTrace();}result.setText(Integer.valueOf(res).toString());}});}@Overrideprotected void onDestroy() {super.onDestroy();releaseService();}/** This function connects the Activity to the service*/private void initService() {connection = new AdditionServiceConnection();Intent i = new Intent();i.setClassName("com.czm.hellosumaidl",com.czm.hellosumaidl.AdditionService.class.getName());boolean ret = this.bindService(i, connection, Context.BIND_AUTO_CREATE);}/** This function disconnects the Activity from the service*/private void releaseService() {unbindService(connection);connection = null;}class AdditionServiceConnection implements ServiceConnection {@Overridepublic void onServiceConnected(ComponentName name, IBinder boundService) {// TODO Auto-generated method stubservice = IAdditionService.Stub.asInterface((IBinder) boundService);Toast.makeText(MainActivity.this, "Service connected",Toast.LENGTH_SHORT).show();}@Overridepublic void onServiceDisconnected(ComponentName name) {// TODO Auto-generated method stubservice = null;Toast.makeText(MainActivity.this, "Service disconnected",Toast.LENGTH_SHORT).show();}}}

效果截图如下:

          

执行AIDL接口之前                                                                                                     执行AIDL接口之后

转载于:https://www.cnblogs.com/JczmDeveloper/p/3861237.html

Android开发之IPC进程间通信-AIDL介绍及实例解析相关推荐

  1. Android开发之TextView高级应用

    Android开发之TextView高级应用 我们平时使用TextView往往让它作为一个显示文字的容器,但TextView的功能并不局限于此.以下就和大家分享一下TextView的一些使用技巧. A ...

  2. android之json解析优化,Android开发之json解析

    目前正在尝试着写app,发现看懂代码和能写出来差距很大,最关键的是java基础比较的差,因为只会python,java基础只学习了一个礼拜就过了.感觉java写出来的代码不如python简单明了. 上 ...

  3. Android开发之旅:组件生命周期(二)

    引言 应用程序组件有一个生命周期--一开始Android实例化他们响应意图,直到结束实例被销毁.在这期间,他们有时候处于激活状态,有时候处于非激活状态:对于活动,对用户有时候可见,有时候不可见.组件生 ...

  4. Android 开发之Windows环境下Android Studio安装和使用教程(图文详细步骤)

    鉴于谷歌最新推出的Android Studio备受开发者的推崇,所以也跟着体验一下. 一.介绍Android Studio  Android Studio 是一个Android开发环境,基于Intel ...

  5. Android开发之旅:应用程序基础及组件

    --成功属于耐得住寂寞的人,接下来几篇将讲述Android应用程序的原理及术语,可能会比较枯燥.如果能够静下心来看,相信成功将属于你. 引言 为了后面的例子做准备,本篇及接下来几篇将介绍Android ...

  6. Android开发之旅:android架构

    引言 通过前面两篇: Android 开发之旅:环境搭建及HelloWorld Android 开发之旅:HelloWorld项目的目录结构 我 们对android有了个大致的了解,知道如何搭建and ...

  7. Android开发之旅:HelloWorld项目的目录结构

    引言 前面Android开发之旅:环境搭建及HelloWorld,我们介绍了如何搭建Android开发环境及简单地建立一个HelloWorld项目,本篇将通过HelloWorld项目来介绍Androi ...

  8. Android studio实现底部导航,Android 开发之BottomBar+ViewPager+Fragment实现炫酷的底部导航效果...

    BottomBar BottomBar是Github上的一个开源框架,因为从1.3.3开始不支持fragments了,要自己配置,弄了很久,不管是app的fragment还是V4 的程序总是总是闪退. ...

  9. android图标随着进度条动画,Android开发之ProgressBar字体随着进度条的加载而滚动...

    在网上翻阅了很多关于ProgressBar滚动效果,但是始终没有找到适合项目中的这种效果,故自己写这篇文章,记录一下写作过程,给大家做一个参考.先看下最终效果效果图 我这里用的是LICEcap软件录制 ...

最新文章

  1. SQL Server procedure
  2. 高德机器人的名字是怎么呼叫的_“一键呼叫”上门办服务!龙岗这个“智慧社区”很贴心~...
  3. 解决crontab 定时任务加载失败
  4. ×××S 2012 交互式报表 -- 同步交互式排序
  5. mysql 建立索引的例子_mysql建立合适的索引的例子
  6. CoffeeScript 学习笔记
  7. 身高回归现象是否真的存在?
  8. php有序数组合并,使用Python怎么合并两个有序数组
  9. 基于微流域划分的洪水淹没分析
  10. 程序员微信名昵称_推荐几个高逼格的微信昵称?
  11. modern ui html,非常漂亮的WPF界面框架(Modern UI for WPF)
  12. java smtp.126.com_Java采用SMTP协议发送邮件 | 学步园
  13. 被“中年危机”榨干的年轻人:如何尽早实现财务自由?
  14. 双十一峰值流量_“双十一”的九个底层逻辑:流量补刀、透支消费等
  15. 计算机域名的解释,通俗易懂:域名与IP的关系讲解
  16. 刚买的新树莓派怎样用(树莓派新手入门)
  17. 【MySQL】索引常见面试题
  18. 对百万级txt文件的数据,进行查重处理
  19. 宝塔免费ssl证书是什么
  20. Dreamweaver CC 2018使用(个人使用总结)

热门文章

  1. MyEclipse中消除frame引起的“the file XXX can not be found.Please check the location and try again.”的错误...
  2. step5 . day2 网络编程 基于TPC协议的网络编程流程及API
  3. 【UESTC 594】我要长高
  4. (错误记录)git push 报错 403
  5. 互联网汽车迎新成员 Alibaba YunOS Auto冠名2016世俱杯
  6. zk reconnect
  7. Cosmos OpenSSD--greedy_ftl1.2.0(一)
  8. userdel account is currently in use
  9. iOS与Opencv的探秘之Opencv认识,适配Xcode
  10. 有趣的css图形实现