Android AIDL的应用

前不久项目需要用到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文件
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



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值