2012-02-29 49 views
3

我正在創建一個聊天應用程序,我想知道是否應該使用服務以及它將如何影響我的應用程序的生命週期。我知道如果沒有足夠的內存,Android操作系統可能會摧毀我的應用程序。我的問題:只有使用活動和接收器的應用程序重新啓動,如果Android銷燬它們,或者我需要一個STICKY服務嗎?我已經創建了兩個應用程序,所以我有點想法,但我只想確保。Android生命週期 - 我應該使用服務嗎?

二,http://developer.android.com/reference/android/app/Service.html說:

需要注意的是服務,像其他應用程序對象,在主線程 其宿主進程的運行。這意味着,如果你的服務是 打算做任何CPU密集型(如MP3播放)或阻塞(如 如網絡)業務,它應該釀出自己的線程在其中 做這項工作。

我的應用程序有一個長時間運行的線程(AsyncTask),它執行從服務器讀取(並不斷阻塞)。離開我的應用程序是否是一個好主意,沒有服務,而是使用AsyncTask代替?如果Android選擇關閉我的應用程序,這將如何影響應用程序的生命週期?如果不需要像在我應該做一個STICKY服務那樣,有一個長期運行的服務是好的做法嗎?我注意到很多聊天和txt msg應用程序使用粘性服務。我只是想想如果我的應用程序會需要一個。

再次提前致謝!

回答

5

基本上,服務允許運行未綁定到一個單一的活動週期的任務。

例如,您可以使用普通物體在單個活動中播放音樂。但是,如果您希望自己的應用播放音樂並允許用戶進出所有活動,那麼您需要一項服務。

如果您的應用程序有多個活性及你希望你的聊天客戶端仍然聽插座(和我打賭你想要的),那麼你應該寫一個服務。

如果希望用戶知道一個服務正在運行,那麼你的服務你的服務應該去foreground和允許通過通知欄互動。

如果你想讓你的活動與你的服務進行溝通,那麼你應該bind your service from within your activities

最後,您應該爲用戶提供一個明確的方法來訪問stop your service,因爲此過程將不再與您的應用生命週期相關聯,並且您必須顯式調用其停止方法或調用stopService或使服務調用stopSelf本身。然後爲用戶提供一種簡單的方法來停止服務。

你還需要得到一個powerlock和最可能的wifi lock爲您的服務,以便它不會停止設備進入睡眠狀態,並保持連接到您的服務,當您的應用程序由android清理。

+0

developer.android.com上的[** RandomMusicPlayer **](http://developer.android.com/resources/samples/RandomMusicPlayer/index.html)示例是實現音樂(或聊天)的一個很好的起點,需要訪問互聯網並在前臺運行的服務。 – Jens 2012-02-29 08:12:57

+0

我現在可以運行不同的應用程序,並且在不使用服務的情況下收到新消息時仍會收到通知(AsyncTask始終處於後臺運行狀態)。如果我想在活動之間訪問資源,我在Application類中使用單例和靜態引用,所以這也沒有問題(每個活動都不需要綁定服務)。至於發送通知,任何活動都可以通過獲取NotificationManager來發送通知。據我所知,即使在服務中,我也需要創建一個AsyncTask。我不確定我是否看到差異。 – ComputerEngineer88 2012-03-01 05:51:35

0

我認爲你最好使用服務。 AsyncTask基本上是相同的,因爲它運行在與主線程不同的線程中。我在某些情況下看到了一些示例,AsyncTask在離開主UI線程時暫停了。我相信,當內存不足時,服務將會重新啓動,而不僅僅是被殺死,但我不是100%確定的。長時間運行的後臺任務是服務的目的。

0

這不是一個直接的答案,但你可能要考慮使用XMPP

Android可以隨時銷燬任何活動。

我肯定會使用一項服務。你已經使用了一個AsyncTask,所以你很好線程。如果你想在你的應用程序不在前臺時回覆你的聊天記錄,那麼服務將是必要的。然後

您的服務可能會發送通知時,收到新信息或任何需要。

+0

我已經嘗試過XMPP。它有很多我正在尋找的東西,但我想要更多地控制數據庫中的內容等。構建我自己的服務器對於我期待的控件來說似乎是理想的,而且我的能力更強。 – ComputerEngineer88 2012-03-01 05:54:54