Android中的跨进程调用技术AIDL
什么是AIDL
Android系统中的进程之间不能共享内存,因此,需要提供一些机制在不同进程之间进行数据通信。
为了使其他的应用程序也可以访问本应用程序提供的服务,Android系统采用了远程过程调用(Remote Procedure Call,RPC)方式来实现。
与很多其他的基于RPC的解决方案一样,Android使用一种接口定义语言(Interface Definition Language,IDL)来公开服务的接口。
Android的四大组件中的三个(Activity、BroadcastReceiver和ContentProvider)都可以进行跨进程访问,另外一个Android应用程序组件Service同样可以。因此,可以将这种可以跨进程访问的服务称为AIDL(Android Interface Definition Language)服务。
实现AIDL
建立AIDLServer和AIDLClient项目,如下图:
① AIDLServer
新建一个ICalculate接口,并将文件后缀修改为.aidl
- package com.example.calculate;
- interface ICalculate {
- double doCalculate(double a, double b);
- }
.aidl编译后会在“gen/包名/”目录中生成ICalculate.java的接口文件
新建一个CalculateService服务,该服务中的MyBinder 实现了ICalculate接口
- public class CalculateService extends Service {
- private MyBinder mBinder;
- @Override
- public void onCreate() {
- // TODO Auto-generated method stub
- super.onCreate();
- mBinder = new MyBinder();
- }
- @Override
- public void onDestroy() {
- // TODO Auto-generated method stub
- super.onDestroy();
- }
- @Override
- public IBinder onBind(Intent arg0) {
- // TODO Auto-generated method stub
- return mBinder;
- }
- public class MyBinder extends ICalculate.Stub
- {
- @Override
- public double doCalculate(double a, double b) throws RemoteException {
- // TODO Auto-generated method stub
- return a+b;
- }
- }
- }
AndroidManifest.xml中声明Service
- <service
- android:name="com.example.aidlserver.CalculateService"
- android:enabled="true" >
- <intent-filter>
- <action android:name="com.example.calculate.ICalculate" />
- </intent-filter>
- </service>
② AIDLClient
将AIDLServer中的com.example.calculate包拷入AIDLClient(跨进程调用必须包相同)
使用bindService方法来调用CalculateService服务
- ICalculate mBinder;
- ServiceConnection mCon=new ServiceConnection() {
- @Override
- public void onServiceDisconnected(ComponentName arg0) {
- // TODO Auto-generated method stub
- }
- @Override
- public void onServiceConnected(ComponentName arg0, IBinder arg1) {
- mBinder=ICalculate.Stub.asInterface(arg1);
- }
- };
Intent intent=new Intent("com.example.calculate.ICalculate");
bindService(intent, mCon, Context.BIND_AUTO_CREATE);
MainActivity.java代码如下:
- public class MainActivity extends ActionBarActivity {
- Button btnPlus;
- EditText et1;
- EditText et2;
- TextView tvResult;
- ICalculate mBinder;
- ServiceConnection mCon=new ServiceConnection() {
- @Override
- public void onServiceDisconnected(ComponentName arg0) {
- // TODO Auto-generated method stub
- }
- @Override
- public void onServiceConnected(ComponentName arg0, IBinder arg1) {
- mBinder=ICalculate.Stub.asInterface(arg1);
- }
- };
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- btnPlus=(Button) findViewById(R.id.btnPlus);
- et1=(EditText) findViewById(R.id.et1);
- et2=(EditText) findViewById(R.id.et2);
- tvResult=(TextView) findViewById(R.id.tvResult);
- btnPlus.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View arg0) {
- if(mBinder==null)
- {
- return;
- }
- String num1=et1.getText().toString();
- String num2=et2.getText().toString();
- if(TextUtils.isEmpty(num1)||TextUtils.isEmpty(num2))
- {
- return;
- }
- double d1=Double.parseDouble(num1);
- double d2=Double.parseDouble(num2);
- double total=-1;
- Log.i("MainActivity", "onClick() d1="+d1+" d2"+d2);
- try {
- total=mBinder.doCalculate(d1, d2);
- } catch (RemoteException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- tvResult.setText("结果:"+total);
- }
- });
- Intent intent=new Intent("com.example.calculate.ICalculate");
- bindService(intent, mCon, Context.BIND_AUTO_CREATE);
- }
- @Override
- protected void onDestroy() {
- // TODO Auto-generated method stub
- super.onDestroy();
- unbindService(mCon);
- }
- }
注:bindService后记得unbindService
Android中的跨进程调用技术AIDL的更多相关文章
- Android中的跨进程通信方法实例及特点分析(一):AIDL Service
转载请注明出处:http://blog.csdn.net/bettarwang/article/details/40947481 近期有一个需求就是往程序中增加大数据的採集点,可是由于我们的Andro ...
- Android中的跨进程通信方法实例及特点分析(二):ContentProvider
1.ContentProvider简单介绍 在Android中有些数据(如通讯录.音频.视频文件等)是要供非常多应用程序使用的.为了更好地对外提供数据.Android系统给我们提供了Content P ...
- 跨进程调用Service(AIDL Service)
1.什么是aidl:aidl这是 Android Interface definition language的缩写,一看就明确.它是一种android内部进程通信接口的描写叙述语言.通过它我们能够定义 ...
- Android四大组件应用系列5——使用AIDL实现跨进程调用Service
一.问题描述 Android应用程序的四大组件中Activity.BroadcastReceiver.ContentProvider.Service都可以进行跨进程.在上一篇我们通过ContentPr ...
- Android四种跨进程通信
由于android系统中应用程序之间不能共享内存.因此,在不同应用程序之间交互数据(跨进程通讯)就稍微麻烦一些.在android SDK中提供了4种用于跨进程通讯的方式.这4种方式正好对应于andro ...
- Android 进阶9:进程通信之 AIDL 解析
读完本文你将了解: AIDL AIDL 生成文件分析 Stub Proxy AIDL 生成的内容小结 AIDL 的使用回顾 服务端 客户端 小结 手动写个 Binder 首先是定义跨进程接口实现 II ...
- 如何处理Android中的防缓冲区溢出技术
[51CTO专稿]本文将具体介绍Android中的防缓冲区溢出技术的来龙去脉. 1.什么是ASLR? ASLR(Address space layout randomization)是一种针对缓冲区溢 ...
- c#中如何跨线程调用windows窗体控件
c#中如何跨线程调用windows窗体控件? 我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题.然而我们并不能用传统方法来做这个问题,下面我将详细的介绍.首 ...
- Wayland中的跨进程过程调用浅析
原文地址:http://blog.csdn.net/jinzhuojun/article/details/40264449 Wayland协议主要提供了Client端应用与Server端Composi ...
随机推荐
- velocity的一些用法
velocity模板其实就是java不分语法的翻译,用到的属性还是java的方法,get,set,等 1.截取部分字段substring 原始字符串:$!ag.tagValue,也许很长,前端页面展示 ...
- Elasticsearch 数据搜索篇·【入门级干货】
ES即简单又复杂,你可以快速的实现全文检索,又需要了解复杂的REST API.本篇就通过一些简单的搜索命令,帮助你理解ES的相关应用.虽然不能让你理解ES的原理设计,但是可以帮助你理解ES,探寻更多的 ...
- 语义化HTML:ul、ol和dl
一.语义化元素 1. ul标签 W3C草案: The ul element represents an unordered list of items; that is, a list in wh ...
- 大话immutable.js
为啥要用immutable.js呢.毫不夸张的说.有了immutable.js(当然也有其他实现库)..才能将react的性能发挥到极致!要是各位看官用过一段时间的react,而没有用immutabl ...
- 使用CSS3对链接颜色与下划线进行优化
效果: 代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...
- WinForm中DataGridView显示更新数据--人性版
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- c#中高效的excel导入sqlserver的方法
将oledb读取的excel数据快速插入的sqlserver中,很多人通过循环来拼接sql,这样做不但容易出错而且效率低下,最好的办法是使用bcp,也就是System.Data.SqlClient.S ...
- CodeSnippet.info整体技术构架
CodeSnippet.info整体架构 服务器端 Asp.NET MVC5 考察过MVC6,但是现在MVC6还不成熟,技术上不稳定,很多资料也比较少. 所以网站暂时使用MVC5.当然网站的大部分业务 ...
- Android网页浏览器的开发
Android网页浏览器的核心Widget是包含了WebKit的WebView. 首先,布局文件activity_main.xml: <LinearLayout xmlns:android=&q ...
- 第 24 章 CSS3 变形效果[下]
学习要点: 1.3D 变形简介 2.transform-style 3.perspective 4.3D 变形属性 主讲教师:李炎恢 本章主要探讨 HTML5 中 CSS3 的变形效果,主要接着上节课 ...