文章不講如何簡單的建立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