2012-01-19 58 views
2

我正在考慮在我的應用程序中使用遠程服務,但我在CommonsWare的this thread(以及其他線程)的答案中看到,看起來遠程服務存在諸如浪費CPU,內存和電池壽命等許多缺點/顧慮。這讓我猶豫不決。所以,我想通過專家在這裏第一次運行我的想法:遠程服務有多糟?

問題1:鑑於我的應用程序的應用程序(如下圖),你認爲這是一個使用遠程服務的一個壞主意?或者,這是正確的路要走嗎?

我的應用程序有兩部分,Wi-Fi客戶端在PC上運行,Wi-Fi服務器在Android上運行。他們通過Socket來回傳輸位於SD存儲卡中的應用程序數據文件。 Android應用程序擁有超過48,000行代碼,相當大,我會說。當它啓動時,它會自動啓動服務。該服務然後創建一個單獨的線程,呼叫ServerSocket.accept()在線聽。即使Android應用程序未運行,用戶也可以按PC上的按鈕啓動文件傳輸。

我明白服務的生命週期與活動無關;我不介意用戶是否可以通過設置殺死應用程序和服務 - 他殺了它,他必須重新啓動應用程序才能啓動服務器。他選擇殺死它,他會自己開始。

但是如果Android系統在沒有用戶的知識的情況下殺死了進程呢?在這種情況下,用戶不知道Wi-Fi服務器已經死機,當他點擊PC上的按鈕時他會收到錯誤。因此,即使進程被系統中止,我也希望服務器保持運行。因此,我認爲遠程服務就是答案。或者,是嗎?

問題2:如何在應用程序和遠程服務之間建立一個簡單的單向通信?

兩者之間的唯一溝通是應用程序需要知道服務的狀態,比如它是在Socket上偵聽,還是在運行等等。如果死了,用戶可以從應用程序的用戶界面重新啓動它。

我不想使用AIDL,它似乎是一種矯枉過正;全局變量不起作用,因爲它們不在同一個進程空間中;即使是Application單身人士似乎也沒有工作。所以現在我正在考慮使用共享首選項,或者在內部存儲中創建一個文件。我還沒有試驗這些想法,但他們會工作嗎?如果沒有,更好的想法?

感謝您閱讀本文!

回答

3
  1. 遠程服務類似於普通服務。唯一的區別(我猜)它可以從其他應用程序和服務中訪問(這是一個導出的服務)。因此,如果您希望多個應用程序能夠訪問您的服務,那麼您可以將其設置爲遠程。但就你而言,我認爲你可以爲你的應用程序提供一個服務。爲了讓您的服務保持運行,您應該查看前臺服務。他們是正常的服務,他們只是用命令startForeground開始這些服務的android系統會盡量保持運行。

  2. 其實在你的情況下,它不是單向的。你問你的服務有關的狀態,服務應該問。如果您選擇的不是遠程服務,那麼在您的應用程序中,您可以調用服務方法(extending Binder class)。對於遠程服務,我認爲你可以使用兩個信使或AIDL。

+0

謝謝你的提示。是的,前臺服務似乎是一個更好的解決方案。它不佔用額外的內存空間,據說可以活得很長,應該足夠滿足我的目的。非常感謝。 – wwyt

+0

@Yury我只是想在後臺發送圖像,並顯示在listview行中特定上傳的用戶狀態,我的意思是說使用服務的http通信,並通知UI上的用戶,然後我應該使用前臺服務權限?遠程服務不是必需的。我對嗎? – Ankit

+0

我也有與Ankit相同的問題。我也想確保這一點。 – thekevshow