AIDL Service

来源:互联网 发布:淘宝摄影发展趋势 编辑:程序博客网 时间:2024/05/01 11:39

(以下内容有错误或不足还望大家指正)

AIDL(Android Interface Definition Language)Service可以实现进程之间的通讯。

AIDL定义接口须注意以下几点:

1.AIDL定义接口的源代码必须以.aidl结尾。

2.AIDL接口中用到数据类型,除了基本类型、String、List、Map、CharSequence之外,其他类型全部需要导包,即使它们在同一个包中也需要导包。

下面简单介绍下实现传递简单类型数据的AIDL Service。

服务端:

一、建立一个Android工程:aidlservice

二、AIDL接口定义
在Main类所在的目录中建立一个.aidl文件。文件中是定义的AIDL Service的接口。

package 包名;
interface IMyService
{
String getValue();定义AIDL Service的接口方法,客户端调用AIDL Service时需要调用该方法。
}

定义好后,ADT工具会在gen目录下生成一个IMyService.java接口,该接口中包含一个Stub内部类,该类继承了Binder,实现了IMyService接口。在Stub类中有如下方法:
public static 包名 asInterface(android.os.IBinder obj)
该方法返回值是IBinder对象的代理。在客户端代码中将其引用赋给IMyService myService,然后myService就可以调用继承了Stub的类中的方法了,也就是建立了通讯。

三、建立Service

package 包名;
......
public class MyService extends Service
{
public class MyBinder extends Stub
{
实现IMyService接口中的方法
}
public IBinder onBind(Intent intent)//该方法必须返回MyBinder对象的实例
{
return new MyBinder();
}
public void onCreate(){}
public Boolean onUnbind(){}
public onDestroy(){}
}

四、在AndroidManifest.xml中配置该Service

客户端:

一、建立一个Android工程:aidlclient,然后将aidlservice工程中的.aidl文件连同包结构复制到aidlclient工程中,也可以直接复制aidlservice工程中自动生成的IMyService.java文件。

二、调用AIDL Service
创建ServiceConnection对象,以ServiceConnection对象作为参数调用bindService()方法绑定远程Service

package 包名;
......
public class AidlClient extends Activity
{
private IMyService myService;
private ServiceConnection conn = new ServiceConnection()
{
public void onServiceConnected(ComponentName name, IBinder binder)
{
myService = IMyService.Stub.asInterface(binder);
}
public void onServiceDisconnected(ComponentName name)
{

}
}
public void onCreate(Bundle savedInstanceState)
{
......
Intent intent = new Intent();
intent.setAction("要绑定的Service的action");
bindService(intent,conn,Service.BIND_AUTO_CREATE);
try
{
//在这里可以与Service实现通讯,调用MyService中MyBinder中实现的方法。
myService.getValue();
}
catch(RemoteException e)
{


}
}
}

0 0
原创粉丝点击