2011-04-21 101 views
4

我正在研究需要維護與聊天服務器的網絡連接的Android應用程序。我知道我可以創建一個服務來啓動與服務器的連接,但服務如何通知Android Activity有新的傳入消息?該活動需要更新視圖以顯示新消息。我對Android非常陌生,所以任何幫助表示讚賞。謝謝!使用Android服務處理網絡連接

回答

0

你檢查了服務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

8

你可以通過一個處理程序,你的服務?

首先,將您的處理程序定義爲接口。這是一個例子,所以你可能會更復雜。

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 threadsHow to start service in new thread in android

0

一種常見的和有用的方法是在你的活動註冊一個廣播接收器,並具備服務發送通知當它有有用的數據時。我發現這比通過回調實現一個處理程序更容易管理,主要是因爲它使配置更改時更容易和更安全。如果您將一個直接的Activity引用傳遞給Service,那麼當Activity被銷燬時(旋轉或背景中),您必須非常小心地清除它,否則會發生泄漏。

與廣播接收器,你仍然有活動被銷燬時註銷,但是服務永遠不會有直接的參照活動,所以如果你忘記了活動不被泄漏。活動註冊在創建時可以更容易地聽到主題,因爲它從來不需要獲得對該服務的直接引用...

Lars Vogel的文章討論了這種方法,它絕對值得閱讀! http://www.vogella.com/tutorials/AndroidServices/article.html#using-receiver