Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 高級開發 >> 如何實現Android接口問題

如何實現Android接口問題

編輯:高級開發

在不同的進程中, 如何實現傳遞對象呢? 顯然, Java中不允許跨進程內存共享, 因此傳遞對象, 只能把對象拆分成操作系統能理解的簡單形式,有關android接口的問題下文進行詳細說明。

以達到跨界對象訪問的目的. 在J2EE中,采用RMI的方式, 可以通過序列化傳遞對象. 在android中, 則采用AIDL的方式. 理論上AIDL可以傳遞Bundle,實際上做起來卻比較麻煩.AIDL(android接口描述語言)是一種接口描述語言;

編譯器可以通過aidl文件生成一段代碼,通過預先定義的接口達到兩個進程內部通信進程的目的. 如果需要在一個Activity中, 訪問另一個Service中的某個對象, 需要先將對象轉化成AIDL可識別的參數(可能是多個參數), 然後使用AIDL來傳遞這些參數, 在消息的接收端, 使用這些參數組裝成自己需要的對象.

android接口的IPC的機制和COM或CORBA類似, 是基於接口的,但它是輕量級的。它使用代理類在客戶端和實現層間傳遞值. 如果要使用AIDL, 需要完成2件事情: 1. 引入AIDL的相關類.; 2. 調用aidl產生的class.

具體實現步驟如下:

1、創建AIDL文件, 在這個文件裡面定義接口, 該接口定義了可供客戶端訪問的方法和屬性。 如: ITaskBinder.adil

注意: 理論上, 參數可以傳遞基本數據類型和String, 還有就是Bundle的派生類, 不過在Eclipse中,目前的ADT不支持Bundle做為參數, 據說用Ant編譯可以, 我沒做嘗試.

2、編譯AIDL文件, 用Ant的話, 可能需要手動, 使用Eclipse plugin的話,可以根據adil文件自動生產Java文件並編譯, 不需要人為介入.

3、在Java文件中, 實現AIDL中定義的接口. 編譯器會根據AIDL接口, 產生一個Java接口。這個接口有一個名為Stub的內部抽象類。它繼承擴展了接口並實現了遠程調用需要的幾個方法。接下來就需要自己去實現自定義的幾個接口了。

  1. package com.cmcc.demo;
  2. import com.cmcc.demo.ITaskCallback;
  3. interface ITaskBinder {
  4. boolean isTaskRunning();
  5. void stopRunningTask();
  6. void registerCallback(ITaskCallback cb);
  7. void unregisterCallback(ITaskCallback cb);
  8. }
  9. 其中: ITaskCallback在文件ITaskCallback.aidl中定義:
  10. package com.cmcc.demo;
  11. interface ITaskCallback {
  12. void actionPerformed(int actionId);
  13. }
  14. 注意: 理論上, 參數可以傳遞基本數據類型和String, 還有就是Bundle的派生類, 不過在Eclipse中,目前的ADT不支持Bundle做為參數, 據說用Ant編譯可以, 我沒做嘗試.
  15. 2、編譯AIDL文件, 用Ant的話, 可能需要手動, 使用Eclipse plugin的話,可以根據adil文件自動生產Java文件並編譯, 不需要人為介入.
  16. 3、在Java文件中, 實現AIDL中定義的接口. 編譯器會根據AIDL接口, 產生一個Java接口。這個接口有一個名為Stub的內部抽象類,它繼承擴展了接口並實現了遠程調用需要的幾個方法。接下來就需要自己去實現自定義的幾個接口了.
  17. ITaskBinder.aidl中接口的實現, 在MyService.Java中接口以內嵌類的方式實現:
  18. private final ITaskBinder.Stub mBinder = new ITaskBinder.Stub() {
  19. public void stopRunningTask() {
  20. //@TODO
  21. }
  22. public boolean isTaskRunning() {
  23. //@TODO
  24. return false;
  25. }
  26. public void registerCallback(ITaskCallback cb) {
  27. if (cb != null) mCallbacks.register(cb);
  28. }
  29. public void unregisterCallback(ITaskCallback cb) {
  30. if (cb != null) mCallbacks.unregister(cb);
  31. }
  32. };
  33. 在MyActivity.Java中ITaskCallback.aidl接口實現:
  34. private ITaskCallback mCallback = new ITaskCallback.Stub() {
  35. public void actionPerformed(int id) {
  36. //TODO
  37. printf("callback id=" + id);
  38. }
  39. };

4、向客戶端提供android接口ITaskBinder, 如果寫的是service,擴展該Service並重載onBind ()方法來返回一個實現上述接口的類的實例。這個地方返回的mBinder,就是上面通過內嵌了定義的那個. (MyService.Java)

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved