Android进程间的通信之AIDL
Android服务被设计用来执行很多操作,比如说,可以执行运行时间长的耗时操作,比较耗时的网络操作,甚至是在一个单独进程中的永不会结束的操作。实现这些操作之一是通过Android接口定义语言(AIDL)来完成的。AIDL被设计用来执行进程间通信,另一种实现方式见博文Android进程间的通信之Messenger。本文我们将学习如何创建AIDL文件实现Android进程间通信。在正式学习之前,我们先澄清一些“事实”。
关于Android Service
、Android服务不是后台任务,它们默认只运行在你的app的主线程中
、Android服务可以通过设置来运行在不同进程中
、如果Android服务在不同进程中启动,你将不能使用通常的IBinder接口与其通信
AIDL:Android Interface Definition Language
为了在Android应用中实现进程间通信,我们需要在远端进程中定义一系列可被当前进程访问的方法。通过AIDL我们可以定义这样的一系列方法。AIDL就好像Java中的其它接口一样可以在其中定义一些抽象方法。我们首先需要创建一个以.aidl为后缀的文件并在里面定义所需的抽象方法。
AIDL的一个主要特征是,通过使用AIDL,我们可以在两个不同的应用中进行通信(其实Messenger也可以实现同样的操作,两者区别请见博文Android进程间的通信之Messenger);当然,如果你的应用不需要跟另外一个应用进行通信,那就尽量避免使用AIDL机制吧。aidl文件中定义的抽象方法中,只有一些原始数据类型以及一些基本数据类型如String,lists,maps等可以作为这些方法的参数,如果你想使用一个自定义类作为参数,那么你的自定义类必须实现Parcelable接口,并且该类要被导入AIDL文件中,这一点应该在单独的课程中进行讲解。本文只学习简单的AIDL用法。
AIDL实现思路
AIDL通过定义服务端暴露的接口,以提供给客户端来调用,AIDL使服务端可以并行处理(因此你可能需要考虑多线程并发访问的线程安全性问题)。通过编写aidl文件来设计想要暴露的接口,编译后会自动生成相应的Java文件,服务端将接口的具体实现写入Stub中,通过IBinder对象传递给客户端,客户端bindService时,通过asInterface方法将IBinder还原成接口,供客户端调用其中的方法。
简单示例
AndroidManifest.xml
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name=".BoundService" android:process=":custom_process"/>
</application>
IBoundService.aidl
package yf.exam.service.aidl;
interface IBoundService{
int getResult(int a, int b);
}
BoundService.java
public class BoundService extends Service {
private IBoundService.Stub mBinder = new IBoundService.Stub() {
@Override
public int getResult(int a, int b) throws RemoteException {
return a+b;
}
};
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
}
MainActivity.java
public class MainActivity extends Activity {
private Button btn = null;
private IBoundService mIBoundService;
private boolean mServiceConnected = false;
private ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
mServiceConnected = false;
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mIBoundService = IBoundService.Stub.asInterface(service);
mServiceConnected = true;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn = (Button) findViewById(R.id.button1);
Intent intent = new Intent(this, BoundService.class);
bindService(intent, conn, Context.BIND_AUTO_CREATE);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mServiceConnected) {
try {
int result = mIBoundService.getResult(, );
Toast.makeText(MainActivity.this, "result=" + result,
Toast.LENGTH_SHORT).show();
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mServiceConnected) {
unbindService(conn);
mServiceConnected = false;
}
}
}
Android进程间的通信之AIDL的更多相关文章
- 从AIDL开始谈Android进程间Binder通信机制
转自: http://tech.cnnetsec.com/585.html 本文首先概述了Android的进程间通信的Binder机制,然后结合一个AIDL的例子,对Binder机制进行了解析. 概述 ...
- Android进程间的通信之Messenger
Android进程间的通信方式可以通过以下两种方式完成: Android接口定义语言(AIDL) 使用Messenger绑定服务 本文我们将学习使用Messenger绑定服务的方式进行进程间的通信. ...
- Android进程间的通信
1.概述:由于android系统中应用程序之间不能共享内存.因此,在不同应用程序之间交互数据(跨进程通讯)就稍微麻烦一些.在android SDK中提供了4种用于跨进程通讯的方式.这4种方式正好对应于 ...
- Android 进程间的通信
localsocket: https://blog.csdn.net/azhengye/article/details/73863404 https://www.cnblogs.com/basta ...
- Android 使用AIDL实现进程间的通信
在Android中,如果我们需要在不同进程间实现通信,就需要用到AIDL技术去完成. AIDL(android Interface Definition Language)是一种接口定义语言,编译器通 ...
- Android(java)学习笔记232:Android进程间通讯(IPC)之AIDL
一.IPC inter process communication 进程间通讯 二.AIDL android interface defination language 安卓接口定义语言 满 ...
- android 进程间通信 messenger 是什么 binder 跟 aidl 区别 intent 进程间 通讯? android 消息机制 进程间 android 进程间 可以用 handler么 messenger 与 handler 机制 messenger 机制 是不是 就是 handler 机制 或 , 是不是就是 消息机制 android messenge
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha messenger 是什么 binder 跟 aidl 区别 intent 进程间 通讯 ...
- Android(java)学习笔记175:Android进程间通讯(IPC)之AIDL
一.IPC inter process communication 进程间通讯 二.AIDL android interface defination language 安卓接口定义语言 满 ...
- Android进程间通讯
最近研究了一下Android进程间通讯,原来只是会用,但是只是会用是不行滴,就来研究一下. 刚开始看的时候,我的头是这么大,看了一夜的时候,头就变成这样了,,吓得宝宝赶紧上床休息了,. 先喝喝茶讲个故 ...
随机推荐
- 解决在CentOS6.5下安装OpenStack(Icehouse版本 )出现的glance服务无法正常工作的问题
最近一直在用Juno版本,因为项目需要,今天在虚拟机里安装了Icehouse版,其中glance组件在执行安装的过程后,出现启动失败的现象,幸好以前排查过此类错误,遂记录如下: 在官方文档(Iceho ...
- stimulsoft Report报表使用笔记
1.使用设计器设计mrt报表模板,或者从其他文件复制修改 2.删除business object 数据源 3.使用代码添加数据源 ParcelChangeItem change = new Parce ...
- CMakeLists.txt for nginx
project(nginx) cmake_minimum_required(VERSION 2.8) aux_source_directory(. SRC_LIST) aux_source_direc ...
- TCP/IP之蓟辽督师
真正的知识是深入浅出的,码农翻身" 公共号将苦涩难懂的计算机知识,用形象有趣的生活中实例呈现给我们,让我们更好地理解. 本文源地址:TCP/IP之蓟辽督师 本文续<TCP/IP之大明内 ...
- Value must be an existing directory配置tomcat问题
今天tomcat配置遇到了这么个问题,表示tomcat下少什么文件夹,一般是你的安装目录tomcat文件夹下面少了一个temp文件夹,在tomcat的安装文件夹下建一个temp文件夹再加一次tomca ...
- HTML5 中的新属性autocomplete="off"失效的解决方法(兼容firefox,IE,360)
因为业务需求,在写一个注册页面的时候,发现浏览器会自动填充此域名下已经保存的账号密码,给用户带来不便.加了HTML5 中的新属性autocomplete="off" ,但是并没有产 ...
- uri和url的简单理解
URL:统一资源定位符 也就是网址 例如 http://www.microsoft.com/ URI:通用资源标志符 http://www.acme.com/support/suppliers.htm
- angular表单
angular的表单,点击确定进行创建,支持批量创建,表单验证有样式提醒; <!DOCTYPE html> <html lang="en"> <hea ...
- C++:名字查找先于类型检查
Sub-Title: Name Hiding. "In C++, there is no overloading across scopes - derived class scopes a ...
- Android框架中的广播机制
一.广播通过Intent发送出去 // 定义广播的意图过滤器 private String action = "com.xxx.demo.Broadcast.STATUS_CHANGED&q ...