【Android进阶】-AIDL使用解析

Android系统中,各应用程序都运行在自己的进程中,通常情况下,各进程之间无法直接进行数据交换。为了实现这种跨进程通信(InterProcess communication,简称IPC),Android提供了AIDL Service。

 

一、AIDL Service简介

 

  1. Android的远程Service调用与Java的远程方法调用(RMI)基本相似,都是先定义一个远程调用接口,然后为该接口提供一个实现类。
  2. 本地Service的onBind方法会将Service的代理对象(IBinder对象)传递给客户端,远程Service的onBind方法会将IBinder对象的代理对象(Stub对象)传递给Service。

 

二、创建AIDL文件

以下代码定义了一个aidl文件,其中定义了一个供客户端调用的方法getCount()。

 
  1. package org.iti.tailyou.aidlservice;

  2. interface ICount{

  3. int getCount();

  4. }

  • AIDL定义的接口文件必须以.aidl结尾;
  • AIDL接口中用到的数据类型,除了基本类型、String、List、Map、CharSequence外,其他类型都需要导包。
  • 定义好aidl接口后,ADT工具会自动生成一个ICount.java接口,该接口中包含一个Stub内部类,该内部类实现了IBinder、ICount两个接口。

 

 

三、定义Service实现类,将接口暴露给客户端

该Service实现类的onBind()方法所返回的IBinder对象是ADT所生成的ICount.Stub的子类。

 
  1. package org.iti.tailyou.aidlservice;

  2.  
  3. import java.util.Timer;

  4. import java.util.TimerTask;

  5.  
  6. import org.iti.tailyou.aidlservice.ICount.Stub;

  7.  
  8. import android.app.Service;

  9. import android.content.Intent;

  10. import android.os.IBinder;

  11. import android.os.RemoteException;

  12.  
  13. public class AIDLService extends Service {

  14. private int count = 0;

  15.  
  16. public class CountBinder extends Stub {

  17.  
  18. @Override

  19. public int getCount() throws RemoteException {

  20. return count;

  21. }

  22. }

  23.  
  24. @Override

  25. public IBinder onBind(Intent arg0) {

  26. new Timer().schedule(new TimerTask() {

  27.  
  28. @Override

  29. public void run() {

  30. count++;

  31. }

  32. }, 1000l,1000l);

  33. return new CountBinder();

  34. }

  35. }


 

四、客户端调用远程Service

必须将服务端定义的aidl文件拷贝到客户端。

 

客户端调用代码:

 
  1. package org.iti.tailyou.aidlclient;

  2.  
  3. import org.iti.tailyou.aidlservice.ICount;

  4.  
  5. import android.app.Service;

  6. import android.content.ComponentName;

  7. import android.content.Intent;

  8. import android.content.ServiceConnection;

  9. import android.os.Bundle;

  10. import android.os.IBinder;

  11. import android.os.RemoteException;

  12. import android.support.v7.app.ActionBarActivity;

  13. import android.util.Log;

  14. import android.view.View;

  15. import android.view.View.OnClickListener;

  16.  
  17. public class MainActivity extends ActionBarActivity implements OnClickListener {

  18. private ICount countService;

  19. private ServiceConnection sc = new ServiceConnection() {

  20.  
  21. @Override

  22. public void onServiceDisconnected(ComponentName name) {

  23. }

  24.  
  25. @Override

  26. public void onServiceConnected(ComponentName name, IBinder service) {

  27. countService = ICount.Stub.asInterface(service);

  28. try {

  29. Log.i("",

  30. "------------------------count "

  31. + countService.getCount());

  32. } catch (RemoteException e) {

  33. e.printStackTrace();

  34. }

  35. }

  36. };

  37.  
  38. @Override

  39. protected void onCreate(Bundle savedInstanceState) {

  40. super.onCreate(savedInstanceState);

  41. setContentView(R.layout.activity_main);

  42. findViewById(R.id.btnBind).setOnClickListener(this);

  43. findViewById(R.id.btnUnbind).setOnClickListener(this);

  44. findViewById(R.id.btnGetCount).setOnClickListener(this);

  45.  
  46. }

  47.  
  48. @Override

  49. public void onClick(View arg0) {

  50. switch (arg0.getId()) {

  51. case R.id.btnBind:

  52. bindService(new Intent("org.iti.tailyou.aidlservice.AIDLService"),

  53. sc, Service.BIND_AUTO_CREATE);

  54. break;

  55. case R.id.btnUnbind:

  56. unbindService(sc);

  57. break;

  58. case R.id.btnGetCount:

  59. try {

  60. Log.i("",

  61. "------------------------count "

  62. + countService.getCount());

  63. } catch (RemoteException e) {

  64. e.printStackTrace();

  65. }

  66. break;

  67.  
  68. default:

  69. break;

  70. }

  71. }

  72. }

 

Demo下载地址: http://download.csdn.net/detail/tailyou/9074391 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值