本文僅用於記錄開發過程中遇到的問題及對應的解決方案,如有侵權可立即刪除,同時歡迎大家批評與指正!!!
AIDL(Android Interface Definition Language,Android接口定義語言):用於某個遠程的Service可以與多個進程進行通信,實現多個進程共享同一個Service的功能。
在多進程進行通信時,存在兩種進程角色,服務器端和客戶端,在本文將AppWidget作爲服務器端,音樂APP、xxAPP等多個進程作爲客戶端進行闡述。
AppWidget(服務器端):
- 新建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);
...
}
- 在定義一個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();
...
}
- 在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(客戶端):
- 將服務器端的AIDL文件拷貝到客戶端的相同目錄下;
- 通過bindService()綁定遠程AppWidget的WidgetService,通過onBind()返回Stub對象實例,就可以用其調用接口裏的方法;
- 綁定成功後根據需要調用服務提供的接口方法,將相應的信息傳給AppWidget;
說明:
- AppWidget通過setPackageName()傳送的包名來判斷如何進行相應的顯示;
- registerCallBack()、unregisterCallBack()用來註冊/解註冊回調的對象;
- 通過ICallBack.play()將相應的操作反饋給對應的APP,對應的APP進行相應操作;