文章不讲如何简单的建立AIDL,会使用项目中实际的例子来讲如何使用,也方便了解了AIDL的同窗殊不知道在什么状况下使用的。
html
先来了解下AIDL,英文全称叫Android Interface definition language,是Android系统内部进程通讯接口的描述语言,它做为两个进程间通信的接口。 java
下面就来介绍一个项目中实际使用AIDL的例子。 android
客户需求能够在第三方APP里调用系统设置的接口,若是要达到这个目的,因为是第三方APP(即便用Android SDK开发的APP),没法直接调用这些系统接口(包括权限问题,隐藏API问题),只有经过在系统设置里面建立AIDL服务接口,在第三方APP里面调用这些接口,就能实现客户的需求。 app
那么AIDL工做的方式是什么呢?你能够理解为一个服务端,一个客户端,客户端请求服务端调用工做,若是有必要服务端还会调用客户端提供的接口。 ide
首先来看服务端该作什么ui
路径:/packages/apps/Settingsspa
1 建立AIDL文件 code
建立文件/packages/apps/Settings/src/com/xxx/agent/IExperienceAgentService.aidl component
package com.xxx.agent; interface IExperienceAgentService { void setTimeZone(String timeZone); }
2 建立文件 /packages/apps/Settings/src/com/xxx/agent/ExperienceAgentService.java (名字跟AIDL文件名没有直接关系,能够不一样) xml
package com.xxx.agent; public class ExperienceAgentService extends Service { // AIDL文件接口实现 public class ExperienceAgentServiceImpl extends IDoroExperienceAgentService.Stub { @Override public void setTimeZone(String timeZone) throwsRemoteException { Log.d(TAG, "timeZone="+timeZone); try { mAlarmManager.setTimeZone(timeZone); } catch (Exception e) { e.printStackTrace(); } } } @Override public IBinder onBind(Intent intent) { return newExperienceAgentServiceImpl (); } }
好服务端代码基本上就写完了,而后编译,须要修改Android.mk文件
添加
LOCAL_SRC_FILES += \
src/com/xxx/agent/IExperienceAgentService.aidl
还须要在AndroidManifest.xml 里面注册建立的服务
添加
<service android:name="com.xxx.agent.ExperienceAgentService" >
<intent-filter>
<action android:name="com.xxx.agent.IExperienceAgentService" /> // action name 能够自定义
</intent-filter>
</service>
再来看看客户端该作什么,首先确定须要启动绑定服务,而后再调用服务。
客户端包名 com.xxx.client
1 建立AIDL文件
拷贝服务端建立的AIDL文件到客户端目录,路径 com/xxx/agent/IExperienceAgentService.aidl,注意包路径必须同样,文件内容也必须同样。
2 绑定服务
package com.xxx.client; import com/xxx/agent/IExperienceAgentService; public class Client extends Activity { private IExperienceAgentServicemService = null; private ServiceConnection mConnection = new ServiceConnection() { // 链接服务端成功 public void onServiceConnected(ComponentName className, IBinder service) { IExperienceAgentServicemService = IExperienceAgentService.Stub.asInterface(service); } //服务端链接断开 public void onServiceDisconnected(ComponentName className) { IExperienceAgentServicemService = null; } } @Override protected void onStart() { super.onStart(); // 绑定服务,Intent 选择服务端AndroidManifest注册的action bindService(new Intent(”com.xxx.agent.IExperienceAgentService“, mConnection, Context.BIND_AUTO_CREATE); } @Override protected void onStop() { super.onStop(); unbindService(mConnection); } @Override public void onClick(View v) { if (IExperienceAgentServicemService != null) { try { // 调用AIDI接口文件方法 IExperienceAgentServicemService.setTimeZone("shanghai"); } catch (RemoteException e) { e.printStackTrace(); } } } }
至此,客户端代码也就编写完成了
下面在来看看服务端调用客户端提供的接口是怎么工做的呢
服务端须要修改的以下
1 建立AIDL文件
建立文件/packages/apps/Settings/src/com/xxx/agent/ICallback.aidl
package com.xxx.agent; interface ICallback{ void updateTimeZone(String timeZone); }
修改/packages/apps/Settings/src/com/xxx/agent/IExperienceAgentService.aidl
package com.xxx.agent; import com.xxx.agent.ICallback; interface IExperienceAgentService { void setTimeZone(ICallback cb, String timeZone); }
修改/packages/apps/Settings/src/com/xxx/agent/ExperienceAgentService.java
package com.xxx.agent; public class ExperienceAgentService extends Service { // AIDL文件接口实现 public class ExperienceAgentServiceImpl extends IDoroExperienceAgentService.Stub { @Override public void setTimeZone(ICallback cb, String timeZone) throwsRemoteException { Log.d(TAG, "timeZone="+timeZone); try { mAlarmManager.setTimeZone(timeZone); } catch (Exception e) { e.printStackTrace(); } cb.updateTimeZone(timeZone); } } @Override public IBinder onBind(Intent intent) { return newExperienceAgentServiceImpl (); } }
客户端须要修改的以下
1 拷贝服务端建立的ICallback.aidl文件到客户端目录,路径 com/xxx/agent/ICallback.aidl
2 绑定服务
package com.xxx.client; import com/xxx/agent/IExperienceAgentService; import com/xxx/agent/ICallback; public class Client extends Activity { public class Callback extends ICallback.Stub @Override public void updateTimeZone(String timeZone) throwsRemoteException { Message msg = new Message(); msg.obj = timeZone; mHandler.sendMessage(msg); } } @Override public void onClick(View v) { if (IExperienceAgentServicemService != null) { try { // 调用AIDI接口文件方法 IExperienceAgentServicemService.setTimeZone(new Callback(), "shanghai"); } catch (RemoteException e) { e.printStackTrace(); } } } private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { // 进行界面更新 } } }
至此AIDL服务端回调接口也已经完了。
Google官方介绍连接:http://developer.android.com/guide/components/aidl.html