我正在研究需要維護與聊天服務器的網絡連接的Android應用程序。我知道我可以創建一個服務來啓動與服務器的連接,但服務如何通知Android Activity有新的傳入消息?該活動需要更新視圖以顯示新消息。我對Android非常陌生,所以任何幫助表示讚賞。謝謝!使用Android服務處理網絡連接
回答
你檢查了服務API頁面:http://developer.android.com/reference/android/app/Service.html?
它有幾個關於如何與服務交互的例子。
該服務在與活動相同的線程和相同的上下文上運行。檢查也在這裏:http://developer.android.com/reference/android/content/Context.html#bindService%28android.content.Intent,%20android.content.ServiceConnection,%20int%29
最後,看看也是在拉斯·沃格爾的文章:http://www.vogella.de/articles/AndroidServices/article.html
你可以通過一個處理程序,你的服務?
首先,將您的處理程序定義爲接口。這是一個例子,所以你可能會更復雜。
public interface ServerResponseHandler {
public void success(Message[] msgs); // msgs may be null if no new messages
public void error();
}
在您的活動定義你的處理程序的實例。由於它是一個接口,因此您將在活動中提供實現,以便您可以在處理程序中引用封閉活動的字段和方法。
public class YourActivity extends Activity {
// ... class implementation here ...
updateUI() {
// TODO: UI update work here
}
ServerResponseHandler callback = new ServerResponseHandler() {
@Override
public void success(Message[] msgs) {
// TODO: update UI with messages from msgs[]
YourActivity.this.updateUI();
}
@Override
public void error() {
// TODO: show error dialog here? (or handle error differently)
}
}
void onCheckForMessages() {
networkService.checkForMessages(callback);
}
和網絡服務將包含這樣的內容:
void checkForMessages(ServerResponseHandler callback) {
// TODO: contact server, check for new messages here
// call back to UI
if (successful) {
callback.success(msgs);
} else {
callback.error();
}
}
而且,Aleadam說,你也應該走一個服務默認情況下,同一個線程上運行。對於像網絡這樣的東西,這通常不是首選的行爲。該Android Fundamentals Page on Services明確警告說,不要網絡無單獨的線程:
注意:一種服務,它的宿主進程,服務的主線程中運行不 創建自己的線程,並在一個單獨的進程不運行(除非你否則指定 )。這意味着,如果您的服務將執行任何CPU密集型工作或阻止操作(如MP3播放或網絡連接),則應在服務內創建一個新線程 以完成此項工作。通過使用單獨的線程,您將減少應用程序無響應(ANR)錯誤的風險,並且應用程序的主線程可以專用於用戶與您的活動進行交互。
有關在服務中使用線程的詳細信息,請參閱SO文章Application threads vs Service threads和How to start service in new thread in android
一種常見的和有用的方法是在你的活動註冊一個廣播接收器,並具備服務發送通知當它有有用的數據時。我發現這比通過回調實現一個處理程序更容易管理,主要是因爲它使配置更改時更容易和更安全。如果您將一個直接的Activity引用傳遞給Service,那麼當Activity被銷燬時(旋轉或背景中),您必須非常小心地清除它,否則會發生泄漏。
與廣播接收器,你仍然有活動被銷燬時註銷,但是服務永遠不會有直接的參照活動,所以如果你忘記了活動不被泄漏。活動註冊在創建時可以更容易地聽到主題,因爲它從來不需要獲得對該服務的直接引用...
Lars Vogel的文章討論了這種方法,它絕對值得閱讀! http://www.vogella.com/tutorials/AndroidServices/article.html#using-receiver
- 1. Android網絡服務器連接?
- 2. Android無法連接網絡服務器
- 3. Sharepoint網絡服務連接
- 4. 連接到網絡服務
- 5. Android:使用網絡服務
- 6. 使用ReactiveCocoa處理網絡和套接字連接
- 7. android網絡連接
- 8. 網絡服務和cookie處理
- 9. 錯誤處理網絡服務
- 10. 使用網絡服務器之間的鏈接/連接
- 11. Android網絡服務
- 12. 使用批處理文件禁用網絡連接
- 13. Mercurial連接到網絡服務器
- 14. 連接到SWIFT網絡服務
- 15. 如何連接網絡服務器
- 16. AngularJS - 「服務連接」與網絡開銷
- 17. C#健壯的網絡連接處理Flask網絡
- 18. 使用Android連接到網絡共享
- 19. Android:在服務中使用網絡
- 20. 安全網絡連接(例如SSL)是否由Web服務器正確處理?
- 21. oracle服務器在網絡連接丟失時如何處理實例
- 22. 使用Sinatra網絡服務處理客戶端超時
- 23. 如何安裝網絡服務器連接到Android客戶端
- 24. 如何建立一個連接到Android的網絡服務器?
- 25. 在Android服務中的持久網絡連接
- 26. 在Android中連接到服務器時切換網絡
- 27. 連接到Ms動態導航網絡服務從android
- 28. 在Mac OS X中斷開連接時使用網絡服務
- 29. Android連接/網絡配置
- 30. iOS 4.3 - 嘗試連接Web服務時網絡連接丟失?