Android Service 之 AIDL

AIDL(Android Interface  Definition  Language) 是Service 一个重点内容,它广泛应用于实际项目中,可以进行跨进程访问. 在前面 Android 4大应用程序组件 之服务 (Service)博客已经提到了。

一、创建AIDL 服务端步骤如下:

1  在工程的包目录中建立一个.aidl 文件,该文件的语法类似于Java,如果aidl 文件的内容是正确的,ADT 会自动生成一个Java 接口文件(.java)

例如:

 package net.blogjava.mobile.aidl;

interface  IMyService

{      String  getValue(); }

2  建立一个服务类, 也就是Service 的子类

3  实现由aidl 文件生成的 Java 接口

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

例如:  <service  android:name=".MyService"><intent-filter><action  android:name="net.blogjava.mobile.aidl.IMyService"  /></intent-filter></service>

以下工程是一个简单的AIDL示例, 这个AIDL 服务只有一个getValue()方法,该方法返回一个String 类型的值,在安装完服务后,会在客户端调用这个getValue(),并将返回值在TextView 组件中输出.

注意:  创建aidl 文件与Java 代码非常用相似,但不能加修饰符(如private ,public)、AIDL 服务不支持的数据类型(如 InputStream,OutputStream)

二、客户端实现步骤:

 1. 新建一个aidlclient 工程,并将自动生成的IMyService文件连同包目录一起复制到aidlclient 工程的src目录下,

  2. 要调用AIDL 服务首先要绑定服务,然后才能获得服务对象

   主要代码如下:

public class Main extends Activity implements OnClickListener  {
 private IMyService myService = null;
 private Button btnInvokeAIDLService;
 private Button btnBindAIDLService;
 private TextView textView;
 @Override
 public void onCreate(Bundle savedInstanceState)  {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.main);
       btnInvokeAIDLService = (Button) findViewById(R.id.btnInvokeAIDLService);
       btnBindAIDLService = (Button) findViewById(R.id.btnBindAIDLService);
       btnInvokeAIDLService.setEnabled(false);
       textView = (TextView) findViewById(R.id.textview);
       btnInvokeAIDLService.setOnClickListener(this);
       btnBindAIDLService.setOnClickListener(this);
 }
 private ServiceConnection serviceConnection = new ServiceConnection()   {
     @Override
     public void onServiceConnected(ComponentName name, IBinder service)      {
        //获得服务对象
       myService = IMyService.Stub.asInterface(service);
       btnInvokeAIDLService.setEnabled(true);
    }

    @Override
    public void onServiceDisconnected(ComponentName name){}
};

 @Override
 public void onClick(View view)  {
  switch (view.getId())   {
   case R.id.btnBindAIDLService:
    //绑定AIDL服务
    bindService(new Intent("net.blogjava.mobile.aidl.IMyService"),
      serviceConnection, Context.BIND_AUTO_CREATE);
    break;
   case R.id.btnInvokeAIDLService:
    try   {     textView.setText(myService.getValue());  }
    catch (Exception e)   {     e.printStackTrace();  }
    break;
  }
 }
}

在绑定时需要一个ServiceConnection对象,创建ServiceConnection对象的过程中如果绑定成功,系统会调用onServiceConnected 方法,通过该方法的service 参数值可获得AIDL服务对象.

如图

 

在运行本示例时,必须首先运行AIDL服务端,再运行客户端

具体代码请参见 ch08_aidl,ch08_aidlclient工程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值