AIDL实例

 这篇文章给出一个小例子,实现一个应用程序调用另一个应用程序中的service。两个应用程序的进程通过AIDL(Android Interface Definition Language)通信。这个小例子主要分为两部分:

          1 - 实现service端应用。

          2 - 实现client端应用。

实现service端应用

1. 建立一个空的Android工程aidlservice。在src目录下建立一个扩展名为aidl的文件(IMyService.aidl)。

  1. package com.yubing;   
  2. interface IMyService   
  3. {   
  4.      String getValue();  //   为AIDL服务的接口方法,调用AIDL服务的程序需要调用该方法   
  5. }  

2. 在保存IMyService.aidl文件后,ODT会在gen目录下产生一个IMyService.java文件。

       读者可以不必管这个文件中的内容,也不需要修改该文件的内容。这个文件是由Eclipse插件ODT自动维护的,只要修改了IMyService.aidl文件的内容,IMyService.java文件的内容就会随之改变。

3. 建立一个服务类(Service的子类),实现由aidl文件生成的Java接口。

  1. package com.yubing;   
  2. ... ...   
  3. public class MyService extends Service   
  4. {   
  5.     //   IMyService.Stub类是根据IMyService.aidl文件生成的类,该类中包含了接口方法(getValue)   
  6.     public class MyServiceImpl extends IMyService.Stub   
  7.      {   
  8.         @Override  
  9.         public String getValue() throws RemoteException   
  10.          {   
  11.             return "从AIDL服务获得的值:OK.";   
  12.          }   
  13.      }   
  14.     @Override  
  15.     public IBinder onBind(Intent intent)   
  16. {           
  17. //   该方法必须返回MyServiceImpl类的对象实例   
  18.         return new MyServiceImpl();   
  19.      }   
  20. }  

4. 在AndroidManifest.xml文件中配置AIDL服务,尤其要注意的是,<action>标签的android:name属性值就是客户端要引用该服务的ID,也就是Intent类构造方法的参数值。

  1. <!--   注册服务 -->   
  2. <service android:name=".MyService">   
  3.      <intent-filter>   
  4.          <!--   指定调用AIDL服务的ID   -->   
  5.          <action android:name="com.yu.IMyService" />   
  6.      </intent-filter>   
  7. </service>  

实现client端应用

       下面来看看如何调用这个AIDL服务。首先建立一个Android工程:aidlclient。然后将aidlservice工程中自动生成的IMyService.java文件复制到aidlclient工程中。在调用AIDL服务之前需要先使用bindService方法绑定AIDL服务。bindService方法需要一个ServiceConnection对象。ServiceConnection有一个onServiceConnected方法,当成功绑定AIDL服务且,该方法被调用。并通过service参数返回AIDL服务对象。下面是调用AIDL服务的完成代码。

  1. package com.yu;   
  2. ... ...   
  3. public class Main extends Activity implements OnClickListener   
  4. {   
  5. private IMyService myService = null;   
  6. //   创建ServiceConnection对象   
  7.     private ServiceConnection serviceConnection = new ServiceConnection()   
  8.      {   
  9.         @Override  
  10.         public void onServiceConnected(ComponentName name, IBinder service)   
  11.          {   
  12.             // 获得AIDL服务对象   
  13.              myService = IMyService.Stub.asInterface(service);   
  14.             try  
  15.              {   
  16.                 //   调用AIDL服务对象中的getValue方法,并以对话框中显示该方法的返回值   
  17.                 new AlertDialog.Builder(Main.this).setMessage(   
  18.                          myService.getValue()).setPositiveButton("确定", null)   
  19.                          .show();   
  20.              }   
  21.             catch (Exception e)   
  22.              {   
  23.              }   
  24.          }   
  25.         @Override  
  26.         public void onServiceDisconnected(ComponentName name)   
  27.          {   
  28.          }   
  29.      };   
  30.     @Override  
  31.     public void onClick(View view)   
  32. {   
  33.     //   绑定AIDL服务   
  34.          bindService(new Intent("com.yu.IMyService"),   
  35.                  serviceConnection, Context.BIND_AUTO_CREATE);   
  36.      }   
  37.      ... ...   
  38. }  


       在编写AIDL服务和客户端时要注意如下两点:

1. AIDL服务中的onBind方法必须返回AIDL接口对象(MyServiceImpl对象)。该对象也是onServiceConnected事件方法的第2个参数值。
2. bindService方法的第1个参数是Intent对象,该对象构造方法的参数需要指定AIDL服务的ID,也就是在AndroidManifest.xml文件中<service>标签的<action>子标签的android:name属性的值。

现在先运行aidlservice程序,以便安装AIDL服务,然后运行aidlclient程序,并单击按钮,会显示如图所示的对话框。对话框中的信息就是AIDL服务接口中getValue方法的返回值。



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值