AIDL: Android Interface Define Language,Android接口定义语言
主要作用:可以用来定义进程间的通信接口
具体来讲,如果项目 B 想要访问项目 A 中的一些数据
1)在 项目 A 中创建好AIDL文件,在它里面定义好相关的接口:
package com.aidy.a.aidlservice;
interface RemoteService {
String doSomething();
}
2)再定义一个Service,在Service中创建要给内部类继承于RemoteService.Stub
public class AService extends Service {
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return new AIBinder();
}
public class AIBinder extends RemoteService.Stub {
@Override
public String doSomething() throws RemoteException {
// TODO Auto-generated method stub
return "test do something...";
}
}
}
同时在AndroidMenifest.xml中进行声明:
<service android:name="com.aidy.a.AService" >
<intent-filter>
<action android:name="com.aidy.a.aidlservice.RemoteService" />
</intent-filter>
</service>
上述Action: com.aidy.a.aidlservice.RemoteService就是进程之间可以进行通信的一个契约ID那么在 A 项目中我们想要使用该Service可以:
public class AMainActivity extends Activity {
private AIBinder aIBinder = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent("com.aidy.a.aidlservice.RemoteService");
this.bindService(intent, new AServiceConnection(), Service.BIND_AUTO_CREATE);
((Button) findViewById(R.id.button)).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
try {
Toast.makeText(AMainActivity.this, aIBinder.doSomething(), Toast.LENGTH_SHORT).show();
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
private final class AServiceConnection implements ServiceConnection {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
aIBinder = (AIBinder) service;
}
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
aIBinder = null;
}
}
}
工程 A 的目录结构:
现在有一个工程 B 想要与 A 进行通信:
1)将 A 当中的RemoteService.aidl文件拷贝到 B 当中来(保持RemoteService.aidl的包名不变)
调用如下:
public class BMainActivity extends Activity {
private RemoteService remoteService = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent("com.aidy.a.aidlservice.RemoteService");
this.bindService(intent, new BServiceConnection(), Service.BIND_AUTO_CREATE);</span>
((Button) findViewById(R.id.button)).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
try {
Toast.makeText(BMainActivity.this, remoteService.doSomething(), Toast.LENGTH_SHORT).show();
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
private final class BServiceConnection implements ServiceConnection {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
remoteService = RemoteService.Stub.asInterface(service);</span>
}
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
remoteService = null;
}
}
}
在B中点击按钮就会执行对应的doSomething()操作