在退出应用之前通过套接字发送最后一条消息

时间:2019-06-19 20:52:27

标签: android sockets ondestroy

我有16个客户端通过Android中的套接字连接到服务器(2个不同的应用程序项目)。如果有新客户端连接,服务器将对其进行跟踪。 当客户端关闭应用程序时,应通知服务器1个客户端已断开连接。问题是我有时仅捕获事件,有时应用关闭太快而无法发送消息。

实现类似目标的最佳实践是什么?该应用程序仅用于内部项目,因此只要可行,该解决方案就不必是最漂亮的代码。

这是我的onDestroy()方法:

@Override
protected void onDestroy() {
    super.onDestroy();

    if (isConnected) {
        sendMessageToServer("ByeBye from " + MainActivity.mPreferences.getString("deviceID", "EMPTY_ID"));
    }

    if (localClient.getClientSocket() != null) {
        if (localClient.getClientSocket().isConnected()) {
            try {
                localClient.getClientSocket().close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    localClient.shutdown();

    android.os.Process.killProcess(android.os.Process.myPid());
}

2 个答案:

答案 0 :(得分:1)

当Android需要其他应用程序的某些资源时,活动可能会被破坏。到那时,您的应用可能会被限制使用网络(因为它不在前台)。

最好的地方是当应用程序仍然可以访问网络时在Activity :: OnStop方法中发送再见消息

答案 1 :(得分:1)

不保证会调用“活动和服务”上的OnDestroy(),因此您不能依靠它向服务器发送显式的“再见”,从而发出信号通知服务器关闭该连接。

由于客户端可能会并且会表现出异常(连接丢失,应用程序崩溃等),因此服务器应负责管理和跟踪连接状态。如果您定期发送客户端和服务器之间的某种ping或保持活动状态,则可以依靠它来跟踪连接状态。如果服务器在一定时间内无法将其发送给客户端或未从客户端接收到该消息,则说明该连接可能已死,您可以让服务器将其视为已死。