aidl:英文全称为Android interface definition language,即Android接口定义语言。能够实现两个独立应用程序之间的通信。进行跨进程通信
既然是两个进程间的通信,那就必须要创建两个Android应用程序,一个应用程序A借助service用来实现所定义的aidl接口,另一个应用程序B用来绑定A应用程序中所创建的服务,并调用aidl接口方法。假定,绑定服务的应用程序为客户端Client,定义服务的为服务端Server。
1,新建Android应用程序AIDLServeDemo
2,新建CustomAIDL.aidl,至于新建过程,参考下文客户端的编程。
3,服务端可以不创建用户界面,创建服务:
package com.example.server;
import com.example.aidlService.CustomAIDL;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.widget.Toast;
public class AIDLServer extends Service {
CustomAIDL.Stub stub = new CustomAIDL.Stub() {
@Override
public String sayHello(String string) throws RemoteException {
// TODO Auto-generated method stub
return "sayHello:"+string;
}
};
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return stub;
}
@Override
public boolean onUnbind(Intent intent) {
// TODO Auto-generated method stub
return super.onUnbind(intent);
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
}
}
4,在清单配置文件中配置服务
<service android:name="com.example.server.AIDLServer">
<intent-filter >
<action android:name="action.aidlserver"/>
<category android:name="category.aidlserver"/>
</intent-filter>
</service>
至此,服务端程序编写完毕,目录结构如下:
1,新建Android应用程序AIDLClientDemo
2,在程序src/某包目录下新建文件,New-file,文件名称为CustomAIDL.aidl。注意,连同.aild一同写到文件名处
客户端程序和服务端程序所创建的.aidl文件,必须,包名一致,文件名一致,即文件中的内容必须一致。
3,编辑所创建的CustomAIDL.aidl文件,写法与java相同,指明所在包,以及方法
package com.example.aidlService;
interface CustomAIDL{
String sayHello (String string);
}
4,在aidl文件保存后,Eclipse中的adt插件会帮助你自动的在gen目录下生成对应的java文件,目录结构如下:
5,在activity中使用aidl进行进程间通信
package com.example.aidlclientdemo;
import com.example.aidlService.CustomAIDL;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity implements OnClickListener {
private TextView mBindServiceTv;
private TextView mUnBindServiceTv;
private TextView mSayHelloTv;
private CustomAIDL mAidl;
private ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
mAidl = CustomAIDL.Stub.asInterface(service);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
/**
* 初始化控件
*/
private void initView() {
mBindServiceTv = (TextView) findViewById(R.id.bind_service_tv);
mUnBindServiceTv = (TextView) findViewById(R.id.unbind_service_tv);
mSayHelloTv = (TextView) findViewById(R.id.send_msg);
setViewOnClickListener(mBindServiceTv, mUnBindServiceTv,mSayHelloTv);
setBtnFlags(true, false,false);
}
/**
* 为控件添加点击事件
*
* @param views
*/
private void setViewOnClickListener(View... views) {
for (View view : views) {
if (view != null) {
view.setOnClickListener(this);
}
}
}
/**
* 设置按钮的可点击状态
* @param bindService
* @param unbindService
*/
private void setBtnFlags(boolean bindService,boolean unbindService,boolean sayhello){
mBindServiceTv.setEnabled(bindService);
mUnBindServiceTv.setEnabled(unbindService);
mSayHelloTv.setEnabled(sayhello);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.unbind_service_tv:
//服务解绑
unbindService(conn);
setBtnFlags(true, false,false);
break;
case R.id.bind_service_tv:
//绑定服务
bindService(new Intent("action.aidlserver"), conn, BIND_AUTO_CREATE);
setBtnFlags(false, true,true);
break;
case R.id.send_msg:
//进程间通信
if (mAidl != null) {
try {
String str = mAidl.sayHello("hello,world");
Toast.makeText(getApplicationContext(), str,
Toast.LENGTH_SHORT).show();
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
break;
default:
break;
}
}
}