2015-08-15 107 views
0

我目前在我的android應用程序中有兩項服務,爲簡單起見,我將撥打DataServiceCommunicationServiceDataService從內容提供者檢索數據,然後將其序列化並傳遞到CommunicationService。然後CommunicationService將序列化的數據分成數據包,並一次發送給第三方設備一個數據包。 CommunicationService知道發送下一個數據包的方式是通過BroadcastReceiver從廣播接收器發送未綁定服務消息

CommunicationServiceDataService開始,但是未結合的,並且具有比DataService更長的壽命(其一旦其已經開始CommunicationService結束時)。 BroadcastReceiver調用CommunicationService的方法讓它知道現在是發送下一個數據包的時間的最佳方法是什麼?我見過的兩個想法是:

  • 在BroadcastReceiver中綁定服務,調用方法並解除綁定。這似乎是最好的情況下非常糟糕的做法,最壞的情況是不可行的。
  • peekService,儘管看起來這隻適用於已經綁定了至少一次的服務,該服務將其排除。

我知道這個架構看起來有點混亂,但CommunicationService的目標是能夠在與第三方設備通信的多個應用中重複使用它;因此,它不能太緊密地綁定到特定的實現。

+0

你不能從'BroadcastReceiver'調用'context.bindService()'。你能解釋一下爲什麼你不能只從接收器調用'startService()'?即使服務已經運行,它也會收到一個'onStartCommand()' – Karakuri

+0

的調用。我的印象是,startService()會啓動一個服務的新實例 - 沒有意識到它只是表示現有的服務。這似乎是最簡單的解決方案,所以我最終可能會用它!謝謝! – Aaron

回答

1

BroadcastReceiver可能會超時,所以不如把它叫IntentService

因爲你的目標是讓該服務爲多個應用程序提供更新,每個應用程序應與服務(通知的潛力它註冊更新),然後服務應該爲每個註冊的應用程序提供回調。

回調可以由CommunicationService指定,並按照您似乎知道的跨進程通信的標準序列化限制執行您喜歡的任何功能。

所以基本的「流」會是這樣的:

註冊 - >有回調 BroadcastReceiver迴應 - >IntentService' -> execute callback -> CommunicationService」

直接從BroadcastReceiver調用什麼主要的問題是,你的CommunicationService可能已經死亡,可能導致暫停或NPE。通過回調,它可以檢查服務是否存活,如果沒有,則創建它。 IntentReceiver應該是清醒的。並且提供回調對象允許您在多個同時調用和/或數據排隊的情況下更好地控制線程安全代碼。

+0

只是爲了確保我正確理解這一點: 'CommunicationService'應該擴展'IntentService'。它提供了回調的定義(通過接口或服務的客戶端必須實現的內部類)。它提供了一種註冊回調的機制(可能是一個靜態公共函數,如果服務不存在就啓動該服務)以及觸發下一個數據包的機制(可能通過Intent?)。 (我在'IntentReceiver'上找不到任何暗示它已被棄用的帖子) – Aaron

+0

是的 - 我的意思是'IntentService' - 我編輯了我的帖子,我犯了這個錯誤。您應該小心,通過接口定義回調,因爲並非所有客戶端都會正確實現序列化,這是必需的。但是,您可能能夠定義靈活的回調對象API,這些API可以正確序列化,具體取決於您的使用情況。 – Jim

+0

真棒,我認爲那是有道理的!謝謝您的幫助。 – Aaron