Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 多套接字设计建议(Android)_Java_Android_Service_Android Activity - Fatal编程技术网

Java 多套接字设计建议(Android)

Java 多套接字设计建议(Android),java,android,service,android-activity,Java,Android,Service,Android Activity,我正试图想出一种方法来实现一个应用程序: -打开x个插槽(用户指定) -每个套接字可以在应用程序的生命周期内保持打开状态,并在后台继续运行 -创建具有相同布局的多个活动,每个活动将用于显示从套接字接收的信息 目前我有一个从一个套接字接收/发送的实现。服务在后台运行,以继续处理来自套接字的信息,然后将其发送给活动。然而,我目前的思路让我相信,我需要为每个打开的套接字提供一个服务,以便在后台继续处理它。我对安卓系统还比较陌生,所以澄清一下就好了 谢谢我将实现一个管理所有套接字连接的单一服务。服务是在

我正试图想出一种方法来实现一个应用程序:

-打开x个插槽(用户指定)
-每个套接字可以在应用程序的生命周期内保持打开状态,并在后台继续运行
-创建具有相同布局的多个活动,每个活动将用于显示从套接字接收的信息

目前我有一个从一个套接字接收/发送的实现。服务在后台运行,以继续处理来自套接字的信息,然后将其发送给活动。然而,我目前的思路让我相信,我需要为每个打开的套接字提供一个服务,以便在后台继续处理它。我对安卓系统还比较陌生,所以澄清一下就好了


谢谢

我将实现一个管理所有套接字连接的单一服务。服务是在您的AndroidManifest中定义的,因此您不能运行相同类型的多个服务,也不能在运行时创建服务(因为您不能在运行时定义新服务)。所以你只能使用单一的服务。这并不意味着一个类不能有多个实例来表示与服务器的每个连接。事实上,这正是我的建议,但这些实例不会是Android服务

活动也是如此。您不能同时创建一个活动的多个实例。安卓玩了很多小把戏来让它看起来像那样,但实际上它要么总是和你上次使用的一样,要么就是那个实例已经不存在了,而这里是一个新实例。但是,一次只有一个活动实例。因此,你必须克服这些限制,但它们是为了你自己的利益而存在的,可以防止你耗尽大量内存

现在,这意味着显示聊天会话的活动必须是灵活的,以便可以通过它应该显示的会话对其进行参数化。这可以通过一个额外的参数轻松完成。例如:

public void openSession( ChatSession session ) {
    Intent intent = new Intent( getContext(), ChatSessionActivity.class )
         .putExtra( ChatSessionActivity.PARAM_CHAT_SESSION_ID, session.getID() );
    startActivity( intent );
}
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 );
}
这就是另一个活动如何将用户导航到聊天会话,比如从聊天会话列表中选择。在您的活动中,您将查看传递给onCreate()的意图,并连接到该服务,然后查询该服务以获取ChatSession。您必须有一种机制,允许ChatSessionActivity向服务注册和注销自己,以获取更新。这可以通过使用广播接收器、注册侦听器、消息等实现。有很多选项。例如:

public void openSession( ChatSession session ) {
    Intent intent = new Intent( getContext(), ChatSessionActivity.class )
         .putExtra( ChatSessionActivity.PARAM_CHAT_SESSION_ID, session.getID() );
    startActivity( intent );
}
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 );
}

无论如何,这些只是一些关于如何构建程序的简单想法。

我只使用一种服务。请记住,即使在服务中运行代码,也需要在单独的线程/异步任务中执行所有与网络相关的操作,否则最终会冻结ui线程

如果我是你,我会看一看,这是在安卓也可用。它应该更容易打开/管理许多连接

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

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


您应该警告用户,您的应用程序将继续在后台运行,例如,当您的应用程序处于后台时,应使用通知图标通知用户。

这是一个非常普遍的问题,因此,如果没有您认为需要多个套接字和多个活动的背景,我们无法真正评估这是否正确。描述您的实际问题,然后我们可以判断这条路径是否合理。我很确定您不需要activity/socket,而且activit可以参数化,以便告诉您应该显示哪个套接字。但我不想太操之过急。用户为什么要指定要打开多少个套接字?它用于连接多个聊天服务器。每个服务器有一个“用户”,所以如果他们想打开两个用户,他们需要两个独立的连接。