单例或服务用于套接字连接

时间:2012-03-27 21:09:04

标签: android service websocket

我是Android开发的新手,我正在尝试将IOS应用程序移植到Android。基本上我的应用程序需要使用套接字IO实时与服务器通信。它连接到服务器,然后处理各种消息,直到服务器完成处理请求。

在我的IOS应用程序中,我使用Singleton模式将请求发送到我的websocket服务器,并使用相同的实例来委派服务器响应。 在Android中,我将使用相同的模式,在我的活动中使用回调对象在获得服务器响应后重定向用户。

我需要我的应用程序保持套接字连接打开,直到我们从服务器获得正确的状态,即使应用程序进入后台。

有些人建议使用Service with Broadcast接收器而不是Singleton。在我的情况下,这是最好的事情吗?

2 个答案:

答案 0 :(得分:10)

使用Service正是我为非常相似的目的所做的事情(为蓝牙和TCP / IP应用程序进行套接字通信),并认为如果有Service,你肯定会想要使用Service即使用户关闭了应用程序,通信仍应继续。

Activity本质上是一种在UI线程上运行代码的方法(当然你可以在其中启动其他线程),但没有用户界面,不像.Application有一个与之关联的UI。

如果你试图在静态单例类中尝试这样做,那么我认为问题在于你不能很好地控制它的生命周期。如果用户导航离开应用程序,那么我的理解是,当它选择删除进程和所有静态对象时,它取决于框架。出于这个原因,如果您使用数据填充单例类并退出应用程序然后再返回应用程序,您可能会或可能不会发现“旧”单例实例仍然存在。出于这个原因,在我的应用程序(使用了大量的全局状态)中,我已经在Service类的扩展中使用了我的单例的实际实例,以(希望)更好地控制它们的生命周期。

对于onCreate(),您有一个明确定义的生命周期,其中包含适当的生命周期回调(onDestroy()Activity等),就像使用{{1}}一样。

答案 1 :(得分:2)

是的,绝对使用Service。来自docs

  

服务是一个应用程序组件,表示应用程序希望在不与用户交互的情况下执行较长时间运行的操作

虽然使用单例可能会有一段时间,但是当你的应用程序进入后台时,你的应用程序很容易被操作系统杀死,除非你有Service。如果您对单例模式更加满意,那么可以在单例中实现它,然后将其绑定到Service只是为了维持其生命周期,但这似乎更多一团糟而不是它的价值。请注意,您不应该在UI线程上执行网络操作,默认情况下,服务在UI线程上运行。你需要启动另一个线程来完成你的工作。

我在帖子中看不到需要BroadcastReceiver的任何内容,但也许可能会有一些网络相关的广播意图可能会像android.net.ConnectivityManager.CONNECTIVITY_ACTION一样有用。