2011-11-18 31 views
3

我正在開發一個應該可擴展的應用程序 我希望用戶安裝基本應用程序,然後通過安裝擴展包(不同的APK)或插件(如go launcher和主題包或附加組件)擴展我的Android應用程序在不同的APK

我唯一能找到的就是使用庫項目來共享代碼,但這不符合我的需求。有人可以解釋它是如何完成的?

[編輯] 更具體地講,這裏是我想做的事: 我有一組的動畫場景,效果和轉場 動畫場景的代碼和資源 用戶可以選擇第一組合場景,第二場景等。

我希望能夠添加更多場景,但我不想將它們全部包含在一個APK中 我想讓用戶下載他選擇的場景。

+0

如果您希望您的應用程序「可擴展」,您可以多寫幾段關於它的內容。 – CommonsWare

+0

添加了更好的描述 – Nir

回答

4

要建立這種類型的互動,ContentProvider將是你的朋友。根據您希望信息流向的方向,我可以考慮建立這種類型的系統有兩種選擇。

選項1:在主應用程序的ContentProvider單

在主應用程序,它創建用於其它應用到讀/寫數據到一個共同的位置的外部接口定義ContentProvider。此提供程序可以訪問您的應用程序需要的場景數據文件/數據庫。

每個後續的插件應用程序都會訪問主ContentProvider(並且如果用戶運行插件但是尚未安裝主應用程序,還會警告用戶),並通過將其寫入ContentProvider來安裝其特定內容。通過這種方式,每個插件都可以充當「安裝者」,這意味着用戶必須從Market下載並運行插件來安裝場景內容。

選項2:每個「插件」應用程序都有自己的ContentProvider

此選項是上述的相反。在每個插件應用程序中定義一個具有一致接口的ContentProvider,並從主應用程序獲取一個方法,該方法可掃描系統以查找新插件(可通過PackageManager完成),並將每個提供程序的數據讀取到其本地主存儲中。

這裏的區別在於用戶不必運行每個插件包,因爲主應用程序將負責獲取數據。但是,定義多個提供者的複雜性更高。例如,您必須確保即使每個提供程序具有相同的基本接口,也不能擁有一個共同的權限,因此您必須掃描系統以獲取自己的軟件包名稱,並根據該信息解析提供程序。

編輯

說了這麼多,我覺得我應該指出,我不相信這是向用戶提供內容的好方法。我對這個主題的個人感受是這種方法會污染用戶的設備,並且使用應用程序圖標來做它們不好,並且很難在移動設備上隱藏這種東西。更簡單,更簡潔的方法是將服務器上的「附加」內容存儲(像S3和SimpleDB這樣的AWS服務幾乎免費),並使用Google的應用內結算等服務讓用戶購買新的內容,並直接下載到單一的應用程序,而不是讓他們回到市場和購買更多的應用程序。

希望有助於!

+0

我發現問題是,當你定義一個內容提供者時,它必須是一個唯一的名字,所以你的應用程序在其他應用程序中必須是唯一的。使用廣播和意圖過濾器可以達到同樣的效果嗎? – 2011-11-18 14:56:23

+1

感謝您的詳細解釋,內容服務器或應用程序結算是一個好主意。但是,我看到流行的應用程序採用多個APK方法,而沒有多個圖標。比如帶有擴展插件的「elixir」,以及帶有主題/小部件的「go launcher」等產品。我更喜歡最簡單的解決方案。我也認爲,使用市場來託管我的插件是一個很好的方式來推廣最喜歡的插件並獲得免費的統計數據。 – Nir

+0

您可以通過不提供響應清單中的「android.intent.action.MAIN」+「android.intent.category.LAUNCHER」的Activity來安裝沒有Launcher圖標的「插件」應用程序。您仍然必須創建「ContentProvider」方向或另一個方向來傳輸內容數據。 – Devunwired

0

我有一組的動畫場景,效果和轉場動畫場景的代碼和資源的結合,用戶可以選擇第一現場,現場2號等。

如果「動畫場景「是活動。您的附加APK僅會發布自己的一組活動,並且您使用PackageManager來確定您的哪些插件已安裝以及如何使用它們。