Android服务被设计用来执行很多操作,比如说,可以执行运行时间长的耗时操作,比较耗时的网络操作,甚至是在一个单独进程中的永不会结束的操作。实现这些操作之一是通过Android接口定义语言(AIDL)来完成的。AIDL被设计用来执行进程间通信,另一种实现方式见博文Android进程间的通信之Messenger。本文我们将学习如何创建AIDL文件实现Android进程间通信。在正式学习之前,我们先澄清一些“事实”。

关于Android Service

  1. Android服务不是后台任务,它们默认只运行在你的app的主线程中
  2. Android服务可以通过设置来运行在不同进程中
  3. 、如果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

  1. <application
  2. android:allowBackup="true"
  3. android:icon="@drawable/ic_launcher"
  4. android:label="@string/app_name"
  5. android:theme="@style/AppTheme" >
  6. <activity
  7. android:name=".MainActivity"
  8. android:label="@string/app_name" >
  9. <intent-filter>
  10. <action android:name="android.intent.action.MAIN" />
  11. <category android:name="android.intent.category.LAUNCHER" />
  12. </intent-filter>
  13. </activity>
  14. <service android:name=".BoundService" android:process=":custom_process"/>
  15. </application>

IBoundService.aidl

  1. package yf.exam.service.aidl;
  2. interface IBoundService{
  3. int getResult(int a, int b);
  4. }

BoundService.java

  1. public class BoundService extends Service {
  2. private IBoundService.Stub mBinder = new IBoundService.Stub() {
  3. @Override
  4. public int getResult(int a, int b) throws RemoteException {
  5. return a+b;
  6. }
  7. };
  8. @Override
  9. public IBinder onBind(Intent intent) {
  10. return mBinder;
  11. }
  12. }

MainActivity.java

  1. public class MainActivity extends Activity {
  2. private Button btn = null;
  3. private IBoundService mIBoundService;
  4. private boolean mServiceConnected = false;
  5. private ServiceConnection conn = new ServiceConnection() {
  6. @Override
  7. public void onServiceDisconnected(ComponentName name) {
  8. mServiceConnected = false;
  9. }
  10. @Override
  11. public void onServiceConnected(ComponentName name, IBinder service) {
  12. mIBoundService = IBoundService.Stub.asInterface(service);
  13. mServiceConnected = true;
  14. }
  15. };
  16.  
  17. @Override
  18. protected void onCreate(Bundle savedInstanceState) {
  19. super.onCreate(savedInstanceState);
  20. setContentView(R.layout.activity_main);
  21. btn = (Button) findViewById(R.id.button1);
  22. Intent intent = new Intent(this, BoundService.class);
  23. bindService(intent, conn, Context.BIND_AUTO_CREATE);
  24. btn.setOnClickListener(new View.OnClickListener() {
  25. @Override
  26. public void onClick(View v) {
  27. if (mServiceConnected) {
  28. try {
  29. int result = mIBoundService.getResult(, );
  30. Toast.makeText(MainActivity.this, "result=" + result,
  31. Toast.LENGTH_SHORT).show();
  32. } catch (RemoteException e) {
  33. e.printStackTrace();
  34. }
  35. }
  36. }
  37. });
  38. }
  39.  
  40. @Override
  41. protected void onDestroy() {
  42. super.onDestroy();
  43. if (mServiceConnected) {
  44. unbindService(conn);
  45. mServiceConnected = false;
  46. }
  47. }
  48. }

Android进程间的通信之AIDL的更多相关文章

  1. 从AIDL开始谈Android进程间Binder通信机制

    转自: http://tech.cnnetsec.com/585.html 本文首先概述了Android的进程间通信的Binder机制,然后结合一个AIDL的例子,对Binder机制进行了解析. 概述 ...

  2. Android进程间的通信之Messenger

    Android进程间的通信方式可以通过以下两种方式完成: Android接口定义语言(AIDL) 使用Messenger绑定服务 本文我们将学习使用Messenger绑定服务的方式进行进程间的通信. ...

  3. Android进程间的通信

    1.概述:由于android系统中应用程序之间不能共享内存.因此,在不同应用程序之间交互数据(跨进程通讯)就稍微麻烦一些.在android SDK中提供了4种用于跨进程通讯的方式.这4种方式正好对应于 ...

  4. Android 进程间的通信

    localsocket:   https://blog.csdn.net/azhengye/article/details/73863404 https://www.cnblogs.com/basta ...

  5. Android 使用AIDL实现进程间的通信

    在Android中,如果我们需要在不同进程间实现通信,就需要用到AIDL技术去完成. AIDL(android Interface Definition Language)是一种接口定义语言,编译器通 ...

  6. Android(java)学习笔记232:Android进程间通讯(IPC)之AIDL

    一.IPC inter process communication  进程间通讯 二.AIDL android  interface  defination  language  安卓接口定义语言 满 ...

  7. 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 进程间 通讯 ...

  8. Android(java)学习笔记175:Android进程间通讯(IPC)之AIDL

    一.IPC inter process communication  进程间通讯 二.AIDL android  interface  defination  language  安卓接口定义语言 满 ...

  9. Android进程间通讯

    最近研究了一下Android进程间通讯,原来只是会用,但是只是会用是不行滴,就来研究一下. 刚开始看的时候,我的头是这么大,看了一夜的时候,头就变成这样了,,吓得宝宝赶紧上床休息了,. 先喝喝茶讲个故 ...

随机推荐

  1. 如何在tpl模版的div块中加ztree

    ld-ztree.tpl <div class="ld-ztree-container"> <div class="ld-ztree-header te ...

  2. Unity3D 学习——入门资料整理

    感觉可以写3D游戏,还是用C#,很好玩的样子.整理最近学习资料 介绍:游戏引擎,可以用C#配置的游戏引擎.嗯,就这样.其余度娘. 安装:官网,因为现在个人版是免费的.直接官网下.干净利落. 调试插件: ...

  3. 关于移动端常用的盒模型与flex布局

    在移动端选择布局的方式中常用盒模型display:-webkit-box达到自适应,然而display:-webkit-flex也同样能达到效果,因自在己移动端用-webkit-box比felx方式熟 ...

  4. linux网络学习

    ipv4报文处理流程 1.物理层网卡收到报文,产生中断进入中断处理程序:net_interrupt,判断中断是由接收到分组引发后,控制权转移到net_rx: 2.net_rx函数分配一个新的sk_bu ...

  5. WPF的二维绘图(二)——几何图形Geometry

    在WPF的DrawingContext对象中,提供了基本的绘制椭圆和矩形的API:DrawEllipse和DrawRectangle.但是,这些是远远不够用的,我们在日常应用中,更多的是使用DrawG ...

  6. 关于SQL预编译问题。

    标准都是sql.add('insert a (b,c,d)values(:a,:b,:c)');params.parambyname('a').asstring:='';...

  7. tomcat日志文件定时清理备份

    以下脚本主要备份的日志文件为tomcat的catalina.out.localhost_access_log.yyyy-mm-dd.log日志和项目的日志文件,其中项目的日志文件格式为"pr ...

  8. [转载]jquery中attr和prop的区别

    在高版本的jquery引入prop方法后,什么时候该用prop?什么时候用attr?它们两个之间有什么区别?这些问题就出现了. 关于它们两个的区别,网上的答案很多.这里谈谈我的心得,我的心得很简单: ...

  9. linux系统PXE+Kickstart自动安装系统

    一.PXEPXE(Pre-boot Execution Environment,预启动执行环境)是由Intel公司开发的最新技术,工作于Client/Server的网络模式,支持工作站通过网络从远端服 ...

  10. Weka使用常见问题

    1.中文乱码 办法:找到RunWeka.ini文件,将Cp1252替换成数据对应的字符集编码,比如utf-8,cp936(简体中文),cp950(繁体中文).