2013-07-15 79 views
8

我想知道是否可以在多個應用程序上共享應用程序上下文中的單例?每個應用程序都會在自己的APK中,但這可能聽起來像糟糕的架構,但首先聽到我的聲音。多個Android應用程序可以共享單個進程和應用程序上下文嗎?

我想這樣做的原因是因爲我有一個現有的庫,它通過藍牙控制外部設備。這個庫是java的,但是下面有一些本地的(c/C++)所有的java包裝。我曾考慮過把這些全部放入服務中,但IPC(我使用的是aidl)變得非常麻煩。嘗試減少對象到基元是幾乎不可能的(私人領域,jni指針等),並試圖用AIDL包裝一切是非常混亂。

如果每個應用程序都可以在同一個進程中運行,並且具有相同的應用程序上下文,那麼允許我在那裏保留一個單例對象,這會讓事情變得更容易。我的googl-fu在這方面讓我失望。也許它不可能?

回答

8

是的,他們可以。您只需將兩個應用程序中的值分配給android:sharedUserIdandroid:process,並使用相同的證書對其進行簽名。

相關鏈接:

+0

如何指定自定義應用程序上下文以允許單例?我認爲android:name與它有關,但是確保它們實際上是同一個類? – startoftext

+0

@startoftext你知道嗎?我想做同樣的事情。 – Alan

+0

應該足夠設置sharedUserId並用相同的證書對兩個應用程序簽名。 android:進程屬性用於更多額外的東西,如命名或指向正確的進程。 – zgulser

5

它應該是可能的,但你的事實,你還在運行兩個不同碰到的問題APK,每個都有自己的ClassLoader。由於不同類加載器加載的相同類被認爲完全不同,所以您無法從APK A創建類,並期望APK B能夠訪問相同的類。 但是,其中一個漏洞就是同一個進程中的類總是被同一個ClassLoader加載,所以解決的辦法是通過Android 系統類(例如System.set/getProperty)來存儲你的數據。您可以閱讀關於此技術的優秀文章here

由於您希望存儲比Java基元更復雜的數據,並且考慮到上述方法會嚴重限制您可以存儲的數據結構,它可能仍然會導致AIDL成爲您的最佳選擇。但是如果您將兩個APK放在同一個進程中,至少您的數據不需要跨越進程邊界,所以它應該是相當高效的。

相關問題