1 关于AIDL
AIDL是android interface definition language,译为android接口定义语言,实为实现android应用程序与应用程序之间通信的,因为android应用程序与应用程序之间不同共享内存,所以要实现应用程序与应用程序之间的数据访问,AIDL尤为重要,因此也称其为跨进程访问服务。
2 Android中AIDL的实现
I. 首先我创建了一个android项目为AIDLTest,在该项目中,我定义了一个ImyService.aidl文件,该文件内容的实现实为android中的接口。代码如下:
package com.example.aidltest;
interface IMyService {
StringgetValue();
}
II. 然后在该项目中创建一个Service,名为MyService.java,继承自android四大组件之一的Service,在该类中定义一个内部类MyServiceImpl继承自先前定义的ImyService.Stub,该文件是在创建了aidl文件后自动生成的。
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
public class MyService extends Service {
@Override
publicIBinder onBind(Intent arg0) {
returnnew MyServiceImpl();
}
publicclass MyServiceImpl extends IMyService.Stub {
@Override
publicString getValue() throws RemoteException {
return"Hello AIDL.";
}
}
}
III. 在AndroidMainfest.xml中配置服务
<serviceandroid:name=".MyService">
<intent-filter>
<actionandroid:name="com.example.aidltest.IMyService"/>
</intent-filter>
</service>
OK,AIDL服务创建成功了!
IV. 创建一个AIDLClientTest项目,用于访问先前AIDLTest中的内容;首先将先前AIDLTest项目中自动生成的IMyService.java连同包一起拷贝到AIDLClientTest项目中;如下图所示:
然后就是在MainActivity.java中实现调用了;代码如下:
package com.example.aidlclienttest;
import com.example.aidltest.IMyService;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
public class MainActivity extends Activity {
privateIMyService myService;
privateButton btnBindService;
privateButton btnStartService;
privateTextView tvContent;
@Override
protectedvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.btnBindService= (Button) findViewById(R.id.bindService);
this.btnStartService= (Button) findViewById(R.id.startService);
this.tvContent= (TextView) findViewById(R.id.tvContent);
this.btnBindService.setOnClickListener(listener);
this.btnStartService.setOnClickListener(listener);
}
OnClickListenerlistener = new OnClickListener() {
@Override
publicvoid onClick(View view) {
switch(view.getId()) {
caseR.id.bindService:
bindService(newIntent("com.example.aidltest.IMyService"), connection,Context.BIND_AUTO_CREATE);
break;
caseR.id.startService:
try{
Log.v("service",myService.getValue());
tvContent.setText(myService.getValue());
}catch (RemoteException e) {
e.printStackTrace();
}
break;
default:
break;
}
}
};
ServiceConnectionconnection = new ServiceConnection() {
@Override
publicvoid onServiceDisconnected(ComponentName arg0) {
}
@Override
publicvoid onServiceConnected(ComponentName arg0, IBinder arg1) {
myService= IMyService.Stub.asInterface(arg1);
}
};
}