2012-11-09 150 views
1

我想跨進程提供某些信息(比方說狀態變量 - 布爾值)。該變量的狀態由服務維護,其他應用程序只能讀取它(不修改它)。跨進程共享狀態變量

我的第一個想法是SharedPreferences,但是有文檔說明說明SharedPreferences的使用在多個進程中不受支持。這給我留下了服務消息,AIDL,意圖和ContentProvider。

服務消息或AIDL不存在問題,因爲它始終有一個異步部分(以及Intents)。我也想到了ContentProvider,但爲了這個,它似乎有點誇張/臃腫。寫入外部存儲將允許其他進程修改數據。

所以,我錯過了什麼或者我想要完成的事情是不可能的? (或爲此推薦)

在此先感謝。

回答

1

服務消息傳遞或AIDL不存在問題,因爲它始終有一個異步部分(以及Intents)。

綁定到基於AIDL的服務是異步的,但是一次預先完成。調用AIDL定義的方法是同步的。

我也想到ContentProvider,但它似乎有點誇張/臃腫只是爲了這一點。

你的大部分選擇都會被類似地「誇大/臃腫」。

我失去了什麼

你可以使用廣播Intents推動改變的價值,特別是如果該值不經常改變。這裏面臨的挑戰是引導初始值(例如,應用程序B已安裝並需要來自應用程序A的值,但必須等到值改變並且應用程序A發送廣播)。然而,如果你會讀取很多值,這可能是值得考慮的,因爲每次讀取IPC可能會增加更多的開銷。

另外,您可能希望重新考慮是否有這種依賴性是一個好主意。使用我前一段的命名法,如果App A需要App A維護的某些值,App B或許不能在App A中存在,因爲用戶可以隨時卸載App A,這可能會導致問題。此外,如果此標誌是指某種控制機制(例如,請勿在其他應用程序執行Y時執行X操作),那麼您將遇到問題,特別是在兩個進程可能真正同時運行的多核設備上。

+0

我正在使用AIDL,但綁定是異步的正是我的問題,因爲我需要從綁定到它的服務權限後讀取值。 關於應用程序A和B;應用B依賴應用A的情況正是我的情況。應用程序A管理服務使用的數據。應用程序B登錄到服務中。狀態變量(或標誌)會像'isSessionActive'布爾類型。 – takecare

+0

@takecare:「我需要在綁定後從服務中讀取值」 - 然後使用「ContentProvider」,或將這些應用組合到一個應用中。 「應用程序A管理服務使用的數據。應用程序B登錄到服務「 - 因爲聽起來沒有其他應用程序是有用的,爲什麼他們分開的應用程序? – CommonsWare

+0

我必須有單獨的應用程序,因爲這個想法是提供服務(它有點像客戶端 - 服務器模型,作爲服務器的服務器,在這種情況下,應用程序B是客戶端)。應用程序B是一個示例應用程序,但可能還有更多。 – takecare