AIDL:Android Interface Definition Language,即Android接口定義語言。
爲了使其他的應用程序也可以訪問本應用程序提供的服務,Android系統採用了遠程過程調用(Remote
Procedure Call,RPC)方式來實現。與很多其他的基於RPC的解決方案一樣,Android使用一種接口定義語言(Interface Definition Language,IDL)來公開服務的接口。我們知道4個Android應用程序組件中的3個(Activity、BroadcastReceiver和ContentProvider)都可以進行跨進程訪問,另外一個Android應用程序組件Service同樣可以。因此,可以將這種可以跨進程訪問的服務稱爲AIDL(Android Interface Definition
Language)服務。
那麼該如何實現AIDL通信呢?
首先新建一個.aidl的文件,然後會自動在R文件下生成一個.java的文件,如圖
aidl文件裏面需要定義接口,以供其它進程能夠訪問,
package com.example.animation;
interface service
{
String getBook();
String getBookName();
}
然後就是需要新建一個繼承於Service的類,這裏有郭神的Service詳解,http://blog.csdn.net/guolin_blog/article/details/11952435。
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return mBinder;
}
service.Stub mBinder=new Stub(){
@Override
public String getBook() throws RemoteException {
// TODO Auto-generated method stub
return "wo";
}
@Override
public String getBookName() throws RemoteException {
// TODO Auto-generated method stub
return "ta";
}
};
上面這段代碼就是在Service中需要實現的接口,通過Binder機制來實現數據的傳遞,此處有Binder機制的詳解,http://www.cnblogs.com/innost/archive/2011/01/09/1931456.html
然後就是要在Activity裏面去BindService了,
Button btn;
private service myAIDLService;
private MyService.MyBinder iBinder;
private ServiceConnection connection=new ServiceConnection(){
@Override
public void onServiceConnected(ComponentName arg0, IBinder arg1) {
// TODO Auto-generated method stub
myAIDLService=service.Stub.asInterface(arg1);
try{
String result=myAIDLService.getBook();
String name=myAIDLService.getBookName();
Log.i("myServiceActivity", result);
Log.i("myServiceActivity", name);
}catch(Exception e){
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName arg0) {
// TODO Auto-generated method stub
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn=(Button) findViewById(R.id.menu);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Intent bindIntent=new Intent(MyServiceActivity.this,MyService.class);
bindService(bindIntent, connection, BIND_AUTO_CREATE);
}
});
}
別忘了,還要註冊哦。
如果想要在其他的應用程序中也要用到這個Service怎麼辦呢,so easy~
先把上面.aidl文件生成的R文件的包,拷貝到應用程序的src目錄下
然後,怎麼辦呢,看代碼
Button btn,btn2;
private service myAIDLService;
private ServiceConnection connection=new ServiceConnection(){
@Override
public void onServiceConnected(ComponentName arg0, IBinder arg1) {
// TODO Auto-generated method stub
myAIDLService=service.Stub.asInterface(arg1);
}
@Override
public void onServiceDisconnected(ComponentName arg0) {
// TODO Auto-generated method stub
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.menu_layout2);
btn=(Button) findViewById(R.id.menu2);
btn2=(Button) findViewById(R.id.menu3);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Intent bindIntent=new Intent("com.example.animation.service");
bindIntent.setPackage("com.example.animation");
bindService(bindIntent, connection, BIND_AUTO_CREATE);
}
});
btn2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if(myAIDLService==null){
Log.i("myAIDLService", "null");
return;
}
String result = null;
String name = null;
try {
result=myAIDLService.getBook();
name = myAIDLService.getBookName();
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Log.i("myServiceActivity22", result);
Log.i("myServiceActivity22", name);
}
});
}
好了,基礎的AIDL通信,已經完結了,各位期待,我深入瞭解哦!