android 通过AIDL实现跨进程访问
Android 进程之间不能共享内存,但是实现进程之间通讯的方法有很多,Activity、Broadcast,ContentProvider,SharedId都可以。作为android四大组件的Service 也有自己的方法实现进程之间的通讯--AIDL
流程:
服务端:
(1)新建扩展名为aidl的文件。内容与java语言类似 但是也有区别
package com.my;
interface IService
{
?String getString();
}
(2)如果aidl文件创建正确,ADT会自动给你生成一个java文件,内容定义的是一个接口。
(3)编写一个继承自android.app.Service 的服务类,并编写类实现第二步的接口
public class MyService extends Service {
?public class ServiceImpl extends IService.Stub
?{
??@Override
??public String getString() throws RemoteException {
???// TODO Auto-generated method stub
???return "哈哈哈";
??}
??
?}
?@Override
?public IBinder onBind(Intent arg0) {
??// TODO Auto-generated method stub
??return new ServiceImpl();
?}
}
(4)在AndroidManifest.xml中配置
?<service android:name=".MyService">
?<intent-filter>
?<action android:name="com.my.IService"></action>
?</intent-filter>
?</service>
调用端:
(1)将服务端第(2)步的java接口文件和包一起服务到调用端
(2)绑定服务,通过bindService(Intent intent,ServiceConnection connection,int flags);
(3)由第二步的方法知道要实现ServiceConnection 接口,并在接口的方法onServiceConnected()中得到第一步接口的实例对象
?class MyServiceConnection implements ServiceConnection
??? {
//服务连接成功调用
??@Override
??public void onServiceConnected(ComponentName arg0, IBinder arg1) {
//得到从服务端复制的java接口的实例对象,service 为接口的实例对象
service = IService.Stub.asInterface(arg1);
??}
//服务连接失败调用
??@Override
??public void onServiceDisconnected(ComponentName arg0) {
???// TODO Auto-generated method stub
???
??}
??? ?
??? }
(4)得到数据:通过调用第(1)步得到的接口方法
service.getString();
?