1

好吧,等等,我會說我是Android的新手。我做了幾個小項目,玩了幾件事,做了大量的閱讀。所以這裏是我想要完成的任務:Broadcasts,ContentProviders和ContentRecievers的最佳做法

我有一個遠程服務,運行在我的手機的前臺,可以通過wifi網絡與其他Android設備發送和接收信息。手機上使用此服務的APK包含多個SQLite數據庫。我希望這些APK向服務註冊內容提供商,因此服務始終知道將接收的數據放在哪裏(我已完成此任務)。當數據進入時,我會識別它所屬的位置並將其放置在正確的數據庫中(這裏沒有問題)。那麼通知正確的活動接收新數據的最佳方式是什麼?我是否需要爲我的服務註冊廣播接收器才能撥打電話?如果APK已被操作系統殺死,廣播接收器會工作嗎?一旦正確的活動加載,我會使用內容觀察員來顯示新的數據?爲什麼我會使用IntentServices?

我很抱歉有這麼多問題。就像我說的,我學得很快,但Android的SKD非常龐大,而且有很多很酷的東西。我想確保我通過最佳實踐正確地思考問題,並使其易於維護和擴展。感謝您提供任何幫助或建議。

回答

4

如果您詢問當前Activity的最佳方式是如何知道ContentProvider中的數據已更改,則它正在讀取,而答案是ContentObserver。

可以說,例如,你有一組Activities和ContentProviders。活動A是來自內容提供者A的項目的列表視圖,並且該列表視圖通過某種類型的CursorAdapter來填充。無論何時您對ContentProviders CONTENT_URI進行查詢,光標都應該自動監視CONTENT_URI以通過ContentObserver進行更改。

這部作品的原因是因爲在ContentProvider:

  1. 您所查詢的方法對你的光標移動到被查詢的URI調用setNotificationUri。
  2. 無論何時在插入/更新/刪除方法中發生變化,您都在調用URI的notifyChange。

如果您的服務中還有其他可以更改的數據與ContentProvider無關,那麼您在傳輸數據方面有幾個選擇。如果活動與您的服務位於相同的APK中,則可以使用某種靜態變量或應用程序上下文或其他自定義通信形式。這裏的方法比較自由,因爲你在同一個虛擬機上運行,​​所以你有很多東西可用。

在你的情況下,這聽起來像大多數活動將在單獨的APK中。如果是這樣的話,你可能需要發送廣播意圖,讓整個系統瞭解這些變化。如果這些更改僅在活動正在運行時發生,則可以在關注更改的活動的整個生命週期內註冊BroadcastReceiver。或者,您可以將BroadcastReceiver放入應用程序清單中,並始終接收該更改。

這將我們帶入IntentServices。 IntentServices是處理Android中長時間運行任務的「最簡單」方式。他們所做的就是創建一個後臺線程,用於處理髮送到服務中的意圖。一個常見的使用情況如下:

  1. 您收到你需要反應(這將需要一段時間)廣播意圖
  2. 發送定向意圖(意圖用一組組件名)到IntentService與廣播意圖中的一些信息。
  3. IntentService要麼產生一個新BG線程,或增加意圖處理隊列中現有的BG螺紋
  4. 的onHandleIntent函數被調用的IntentService上,以便您可以立即處理使用盡可能多的處理時間,因爲你是改變想。
+0

謝謝。我與CP和CO達成了一致。對BR和CI沒有把握。因此,在APK的Manifest文件中定義的廣播接收器將允許APK接收廣播,即使它不是正在運行的APK(這可以幫助我很多)。不僅僅是我想出一個設計,讓它能夠很好地發揮作用,並且能夠滿足我的需求。 – jjNford

+0

不要害怕提問...這種設計與我正在研究的一個重大項目非常相似。 –

+0

謝謝你,真棒。我正在設計一個「內部應用程序」。現在我正在嘗試創建一個類似於應用程序的框架,我爲它提供了一個jar接口文件(它處理所有IPC到運行的遠程服務)。 APK將使用我的界面來註冊他們的ContentProvider和Message ID。我希望在電話上收到新消息時將其添加到正確的ContentProvider中,並通知使用該消息類型的活動(所以我需要製作註冊BroadcastReceivers並動態創建廣播的方法)。任何建議幫助!謝謝! – jjNford