2012-06-04 47 views
0

我試圖想辦法來實現一個應用程序:建議多插槽設計(安卓)

- 打開了套接字(用戶指定)的X量
- 每個插座可以保持打開狀態在應用程序的整個生命週期中,並繼續在後臺運行
- 創建同一佈局的多個活動,每個活動都將用於顯示從套接字接收的信息。

目前我有一個實現從一個套接字發送/接收。服務在後臺運行以繼續處理來自套接字的信息,然後將其發送到活動。但是,我目前的思路讓我相信,每個打開的套接字都需要一個服務才能在後臺繼續處理它。我對Android相當陌生,所以一些澄清會很棒。

感謝

+2

這是一個非常普遍的問題,所以如果沒有爲什麼你認爲你需要多個套接字和多個活動的情況下,我們無法真正評估這是否是正確的事情。描述你的實際問題,然後我們可以判斷這條道路是否有意義。我很肯定你不需要一個活動/套接字,並且可以通過參數化activit()來告訴他們應該顯示哪個套接字。但是不想過多地跳槍。爲什麼用戶需要指定打開多少個套接字? – chubbsondubs

+0

它用於連接到多個聊天服務器。每個服務器一個「用戶」,所以如果他們想要打開2個用戶,他們需要兩個單獨的連接。 –

回答

0

我會實現一個管理所有套接字連接的單一服務。服務在您的AndroidManifest中定義,因此您無法運行同一類型的多個服務,並且您無法在運行時創建服務(因此無法在運行時定義新服務)。所以你堅持使用單一服務。這並不意味着您不能擁有多個表示與服務器的每個連接的Class實例。事實上,這正是我所推薦的,但這些實例不會是Android服務。

它的活動是一樣的東西。您無法同時創建多個活動實例。 Android玩弄了很多技巧,使它看起來像這樣,但實際上它要麼總是和上次一樣,要麼就是這樣,這裏是一個新的例子。但是,有一次只有一個活動的實例。所以你必須要處理這些限制,但是爲了你自己的利益,這些限制是爲了防止你使用大量的內存。

現在,這意味着您顯示聊天會話的活動必須是靈活的,以便它可以通過它應該顯示的會話進行參數化。這可以通過一個額外的參數輕鬆完成。例如:

public void openSession(ChatSession session) { 
    Intent intent = new Intent(getContext(), ChatSessionActivity.class) 
     .putExtra(ChatSessionActivity.PARAM_CHAT_SESSION_ID, session.getID()); 
    startActivity(intent); 
} 

而這就是另一個Activity如何將用戶導航到ChatSession,就像從聊天會話列表中選擇說話一樣。在你的活動中,你會看到傳遞給onCreate()的意圖,並連接到服務,然後查詢ChatSession的服務。你必須有一個機制來允許ChatSessionActivity註冊和取消註冊自己以獲得更新。這可以通過使用BroadcastReceivers,註冊監聽器,消息等。有很多選項。例如:

public void onServiceConnected() { 
    ChatSession session = service.getSession(sessionId); 
    session.setChatListener(this); 
} 

public void onStart() { 
    if(service.isConnected()) session.setChatListener(this); 
} 

public void onStop() { 
    session.setChatListener(null); 
} 

無論如何,這些只是關於如何構造您的程序的一些簡單的想法。

0

我只使用一項服務。請記住,即使您在服務中運行代碼,您也需要在單獨的線程/ asynctask中執行所有與網絡相關的操作,否則最終會凍結ui線程。

如果我是你,我會看看java nio framework,它也可以在android中使用。它應該更容易打開/管理許多連接。

關於活動,我只是使用一個活動(我的意思是一個活動類)根據它所指的連接來區分。

最後,不要忘記你的手機資源有限。打開幾個插座(並且保持連接在後臺)可能會導致電池電量耗盡。

您應該警告用戶,您的應用將繼續在後臺運行,例如,每當您的應用停止後臺時,都會通知它並附帶通知圖標。