我正在尝试一种实现应用程序的方法:
- 填写x个插座(用户指定)
- 每个套接字可以在应用程序的生命周期内保持打开状态并继续在后台运行
- 创建相同布局的多个活动,每个活动将用于显示从套接字接收的信息。
目前我有一个从一个套接字发送/接收的实现。服务在后台运行以继续处理来自套接字的信息,然后将其发送到活动。但是,我目前的思路让我相信我需要为每个插座打开一个服务才能继续在后台处理它。我对Android很新,所以一些澄清会很棒。
由于
答案 0 :(得分:0)
我会实现一个管理所有套接字连接的服务。服务在AndroidManifest中定义,因此您无法运行相同类型的多个服务,并且无法在运行时创建服务(因此您无法在运行时定义新服务)。所以你坚持使用单一服务。这并不意味着您不能拥有代表服务器每个连接的多个Class实例。事实上,这正是我推荐的,但这些实例不是Android服务。
它对活动来说是一回事。您无法同时创建多个Activity实例。 Android有很多技巧可以让它看起来像这样,但实际上它或者总是与你上次使用的实例相同,或者一个已经消失,而这里是一个新实例。但是,曾经只有一个活动的实例。所以你必须要考虑到这些限制,但它们可以帮助你避免使用大量的内存。
现在,这意味着显示聊天会话的活动必须具有灵活性,以便可以通过应显示的会话对其进行参数化。这可以使用intent额外参数轻松完成。例如:
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 );
}
无论如何,这些只是关于如何构建程序的一些简单想法。
答案 1 :(得分:0)
我只使用一项服务。请记住,即使您在服务中运行代码,您也需要在单独的线程/ asynctask中执行所有与网络相关的操作,否则您将最终冻结ui线程。
如果我是你,我会看看java nio framework,它也可以在Android中找到。它应该更容易打开/管理许多连接。
关于活动,我只使用一个活动(我的意思是,一个活动类),根据它所指的连接进行区分。
最后,不要忘记您手机上的资源有限。打开几个插座(此外,保持它们在后台连接)可能导致电池耗尽。
您应该警告用户您的应用将继续在后台运行,例如,只要您的应用在后台运行,就会通过通知图标通知它。