我正在想办法实现一个应用程序:
- 打开 x 数量的套接字(用户指定)
- 每个套接字可以在应用程序的生命周期内保持打开状态并继续在后台运行
- 创建相同布局的多个活动,每个活动将用于显示从套接字接收的信息。
目前我有一个从一个套接字发送/接收的实现。服务在后台运行以继续处理来自套接字的信息,然后将其发送到活动。但是,我目前的思路让我相信,我需要为每个打开的套接字提供一项服务才能继续在后台处理它。我对Android相当陌生,所以一些澄清会很棒。
谢谢
我正在想办法实现一个应用程序:
- 打开 x 数量的套接字(用户指定)
- 每个套接字可以在应用程序的生命周期内保持打开状态并继续在后台运行
- 创建相同布局的多个活动,每个活动将用于显示从套接字接收的信息。
目前我有一个从一个套接字发送/接收的实现。服务在后台运行以继续处理来自套接字的信息,然后将其发送到活动。但是,我目前的思路让我相信,我需要为每个打开的套接字提供一项服务才能继续在后台处理它。我对Android相当陌生,所以一些澄清会很棒。
谢谢
我将实现一个管理所有套接字连接的服务。服务是在你的 AndroidManifest 中定义的,因此你不能运行多个相同类型的服务,你不能在运行时创建服务(因为你不能在运行时定义新的服务)。因此,您只能使用单一服务。这并不意味着您不能拥有代表与服务器的每个连接的类的多个实例。事实上,这正是我所推荐的,但这些实例不会是 Android 服务。
对于活动来说,它的东西是一样的。您不能真正同时创建 Activity 的多个实例。Android 使用了很多技巧让它看起来像这样,但实际上它要么总是与上次相同的实例,要么那个实例消失了,而这是一个新实例。但是,一次只有一个 Activity 实例。因此,您将不得不克服这些限制,但它们是为了您自己的利益而存在的,可以防止您使用大量内存。
现在,这意味着显示聊天会话的 Activity 必须灵活,以便可以通过应该显示的会话对其进行参数化。这可以通过 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 向服务注册和注销自身以获取更新。这可以通过使用广播接收器、注册侦听器、消息等来实现。有很多选项。例如:
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 线程。
如果我是你,我会看一下java nio framework,它也可以在 android 中使用。它应该更容易打开/管理许多连接。
关于活动,我只会使用一种活动(我的意思是,一种活动类),根据它所指的连接进行区分。
最后,不要忘记您的手机资源有限。打开多个插座(此外,让它们在后台保持连接)可能会导致电池耗尽。
您应该警告用户您的应用程序将继续在后台运行,例如,每当您的应用程序在后台运行时,使用通知图标通知它。