Android 跨進程通信AIDL

本文僅用於記錄開發過程中遇到的問題及對應的解決方案,如有侵權可立即刪除,同時歡迎大家批評與指正!!!
AIDL(Android Interface Definition Language,Android接口定義語言):用於某個遠程的Service可以與多個進程進行通信,實現多個進程共享同一個Service的功能。

在多進程進行通信時,存在兩種進程角色,服務器端和客戶端,在本文將AppWidget作爲服務器端,音樂APP、xxAPP等多個進程作爲客戶端進行闡述。

AppWidget(服務器端):
  1. 新建AIDL文件夾,定義一個WidgetService.aidl,在文件中聲明該WidgetService向客戶端提供哪些接口;
interface WidgetService {
    /**
     * Demonstrates some basic types that you can use as parameters
     * and return values in AIDL.
     */
    void setPackageName(String packageName);
    void registerCallBack(String packName, ICallBack callBack);
    void unregisterCallBack(String packName, ICallBack callBack);
    ...
    }
  1. 在定義一個ICallBack.aidl,在該文件中聲明用於回調的方法;
interface ICallBack {
    /**
     * Demonstrates some basic types that you can use as parameters
     * and return values in AIDL.
     */
     void Play();
     void Pause();
     void Next();
     ...
     }
  1. 在WidgetService中實現AIDL中定義的所有接口方法;
WidgetService.Stub stub = new WidgetService.Stub() {
        @Override
        public void registerCallBack(String packName, ICallBack callBack) {
            //註冊回調的對象
        }
         @Override
        public void unregisterCallBack(String packName, ICallBack callBack) {
           //註銷回調的對象
        }
        @Override
        public void setPackageName(String packName) {
          //接收客戶端傳送的包名
        }
        ...
音樂APP(客戶端):
  1. 將服務器端的AIDL文件拷貝到客戶端的相同目錄下;
  2. 通過bindService()綁定遠程AppWidget的WidgetService,通過onBind()返回Stub對象實例,就可以用其調用接口裏的方法;
  3. 綁定成功後根據需要調用服務提供的接口方法,將相應的信息傳給AppWidget;
    在這裏插入圖片描述

說明:

  • AppWidget通過setPackageName()傳送的包名來判斷如何進行相應的顯示;
  • registerCallBack()、unregisterCallBack()用來註冊/解註冊回調的對象;
  • 通過ICallBack.play()將相應的操作反饋給對應的APP,對應的APP進行相應操作;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章