前不久项目需要用到aidl技术,所以花了一天的时间去研究了哈,所以现在记录下来,怕自己忘记,网上关于aidl的demo也没看见几个,所以写个demo供大家参考参考,一起学习学习。
分几个部分讲吧
1.什么是aidl?
aidl英文全称Android interface definition language,通过英文名可知道是Android内部通信描述语言,通过它我们可以定义进程间的通信接口 IPC(interprocess communication)内部进程通信
2.aidl做了什么事情?
我是这样认为的,可能描述会有点错误,aidl会涉及到客户端和服务端,在服务端定义好aidl文件,在客户端绑定服务端的service,客户端就可以获取服务端的数据了!
3.aidl用在什么场景?
就拿我的需求说的:在Android手机中有两个应用程序分别为A,B,应用A想从应用B中获取数据(应用B中的数据可能从网络或者缓存中去取),当应用A开启时,向应用B取数据,此时应用B没有启动,但是应用A不想在那里等待应用B启动完成后,应用B去网络或者缓存中去数据返回个应用A,这个过程需要时间,可能会导致应用A出现ANR。所以就运用到了aidl技术,运用aidl技术后这两个应用程序的流程为:
启动应用A,此时应用A充当客户端,应用A绑定服务端B,但是应用B没有数据,返回null或者其它代表无数据的标示,应用A收到消息,就不管应用B了。此时应用B自己到网络或者缓存中去取数据,当数据取完后,此时角色发生了变化,应用B变成了客户端,应用A编程了服务器,应用B绑定应用A的service,告诉应用A说:我数据准备好了,你来取数据吧,应用A收到通知后就知道了应用B数据准备好了,然后重复开始的步骤,去取应用B中数据。(应用B通知应用A过来取数据的过程可以通过广播实现)
4.现在跟代码结合一起讲
定义服务器IAIDLStudent.aidl文件
aidl支持Java的基本数据类型int,string,CharSequence,不用导包 List,Map泛型类型必须实现Parcelable。
定义Student.aidl文件
实现IAIDLStudent.aidl的接口
此时服务器写完了,不要忘记了给注册service,并同时给予service属性:android:process=":romote",
开始写客户端,客户端把服务器的三个aidl文件拷贝过去,包名一样存放,在编写MainActivity
到这里就讲完了。客户端第一次取数据,服务器返回一个null,服务器三秒后修改数据,再通知客户端拿数据,客户端就拿到数据了。这个是aidl server回到client
分几个部分讲吧
1.什么是aidl?
aidl英文全称Android interface definition language,通过英文名可知道是Android内部通信描述语言,通过它我们可以定义进程间的通信接口 IPC(interprocess communication)内部进程通信
2.aidl做了什么事情?
我是这样认为的,可能描述会有点错误,aidl会涉及到客户端和服务端,在服务端定义好aidl文件,在客户端绑定服务端的service,客户端就可以获取服务端的数据了!
3.aidl用在什么场景?
就拿我的需求说的:在Android手机中有两个应用程序分别为A,B,应用A想从应用B中获取数据(应用B中的数据可能从网络或者缓存中去取),当应用A开启时,向应用B取数据,此时应用B没有启动,但是应用A不想在那里等待应用B启动完成后,应用B去网络或者缓存中去数据返回个应用A,这个过程需要时间,可能会导致应用A出现ANR。所以就运用到了aidl技术,运用aidl技术后这两个应用程序的流程为:
启动应用A,此时应用A充当客户端,应用A绑定服务端B,但是应用B没有数据,返回null或者其它代表无数据的标示,应用A收到消息,就不管应用B了。此时应用B自己到网络或者缓存中去取数据,当数据取完后,此时角色发生了变化,应用B变成了客户端,应用A编程了服务器,应用B绑定应用A的service,告诉应用A说:我数据准备好了,你来取数据吧,应用A收到通知后就知道了应用B数据准备好了,然后重复开始的步骤,去取应用B中数据。(应用B通知应用A过来取数据的过程可以通过广播实现)
4.现在跟代码结合一起讲
定义服务器IAIDLStudent.aidl文件
package com.suncome.service.aidl;
import com.suncome.service.aidl.ICallBack;
import com.suncome.service.aidl.Student;
interface IAIDLStudent{
int getState();
Student getStudent(in ICallBack cb);
}
aidl支持Java的基本数据类型int,string,CharSequence,不用导包 List,Map泛型类型必须实现Parcelable。
定义Student.aidl文件
package com.suncome.service.aidl;
parcelable Student;//parcelable必须小写,表示Student可以被序列化
实现IAIDLStudent.aidl的接口
public class StudentService extends Service {
private Student stu = null;
private ICallBack mCallback;
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
@Override
public boolean onUnbind(Intent intent) {
mCallback = null;
return super.onUnbind(intent);
}
IAIDLStudent.Stub mBinder = new IAIDLStudent.Stub(){
@Override
public int getState() throws RemoteException {
return 0;
}
@Override
public Student getStudent(ICallBack cb) throws RemoteException {
mCallback = cb;
//定时器充当从网络或者缓存取数据
new Timer().schedule(new TimerTask() {
@Override
public void run() {
try {//修改数据stu的数据,
mCallback.notfiyClient();//通知拿数据
} catch (RemoteException e) {
e.printStackTrace();
}
}
}, 3000);
return stu;
}
};
}
此时服务器写完了,不要忘记了给注册service,并同时给予service属性:android:process=":romote",
开始写客户端,客户端把服务器的三个aidl文件拷贝过去,包名一样存放,在编写MainActivity
public class MainActivity extends Activity {
private Button getData;
private IAIDLStudent mAidlStu;
private Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
switch(msg.what){
case 1:
setData();
break;
default:
break;
}
};
};
ServiceConnection service = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
mAidlStu = null;
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mAidlStu = IAIDLStudent.Stub.asInterface(service);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bindService(new Intent("com.suncomm.service.StudentService"), service, BIND_AUTO_CREATE);//bind服务器Service
initView();//初始化控件
getData.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
setData();
}
});
}
//获取service的数据
protected void setData() {
try {
Student stu = mAidlStu.getStudent(mCallback);
if(stu!=null){//表示有数据
name.setText("name:"+stu.getName());
age.setText("age:"+stu.getAge()+"");
address.setText("address:"+stu.getAddress());
}else{//表示没有数据,
name.setText("name:null");
age.setText("age:null");
address.setText("address:null");
}
} catch (RemoteException e) {
e.printStackTrace();
}
}
ICallBack.Stub mCallback = new ICallBack.Stub() {
@Override
public void notfiyClient() throws RemoteException {
handler.obtainMessage(1).sendToTarget();
//收到通知,可以直接调用mAidlStu.getStudent(mCallback);获取数据
}
};
到这里就讲完了。客户端第一次取数据,服务器返回一个null,服务器三秒后修改数据,再通知客户端拿数据,客户端就拿到数据了。这个是aidl server回到client
demo仅供参考:http://download.csdn.net/detail/u010289775/8339043