2012-06-04 46 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中使用。它应该更容易打开/管理许多连接。

关于活动,我只是使用一个活动(我的意思是一个活动类)根据它所指的连接来区分。

最后,不要忘记你的手机资源有限。打开几个插座(并且保持连接在后台)可能会导致电池电量耗尽。

您应该警告用户,您的应用将继续在后台运行,例如,每当您的应用停止后台时,都会通知它并附带通知图标。