Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.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
Android 在wifi断开之前做些什么_Android - Fatal编程技术网

Android 在wifi断开之前做些什么

Android 在wifi断开之前做些什么,android,Android,我知道在wifi网络上会出现突然断开连接的情况,这会阻止我向服务器发送消息 但有时在断开连接之前还有最后一次机会,例如,如果信号很低或用户试图关闭wifi。在这些情况下,我想向我的服务器发送一条注销消息 如何检测像这样的断开连接 我试图通过注册广播侦听器来检索连接的更改: registerReceiver(this,new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); ... public void onReceive(Conte

我知道在wifi网络上会出现突然断开连接的情况,这会阻止我向服务器发送消息

但有时在断开连接之前还有最后一次机会,例如,如果信号很低或用户试图关闭wifi。在这些情况下,我想向我的服务器发送一条注销消息

如何检测像这样的断开连接

我试图通过注册广播侦听器来检索连接的更改:

registerReceiver(this,new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
...
public void onReceive(Context context, Intent intent) {
  NetworkInfo info = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
  if( (info.getState()== State.DISCONNECTING) && (info.getType() == ConnectivityManager.TYPE_WIFI) ) {
    //send logout
  }
但那时候看起来已经太晚了。我的注销消息无法通过

有更好的办法吗

[更新1] 我还尝试:

if( (info.getDetailedState()== DetailedState.DISCONNECTING) && connectionTypeOK ) {
[更新2-解决方案]
如下文所述,解决方案是使用接收RSSI_CHANGED_动作和WIFI_STATE_CHANGED_动作广播的组合来分别监控信号强度和WIFI_STATE_禁用事件。发生这种情况时,我会发送注销请求。这正是我所需要的。谢谢

为什么不让服务器定期以一定的间隔ping客户端,如果没有响应就直接注销呢?试图通过客户端实现这一点会很麻烦。

如果可能的话,更好的方法是根本不使用会话


如果用户不注销,为什么会出现问题?

也许这是一个长期的问题。。但如果wifi开启,为什么不使用谷歌推送通知来启动活动呢。这会告诉服务器手机“在线”。如果这在X秒或1分钟内没有发生,请将其重定向到其他地方。

您可以尝试通过使用检测信号强度的变化来实现可变“心跳”功能。顺便说一句,你可以找到一些相关的代码


现在,一旦您收到RSSI_更改通知,根据相应的信号强度,您将向服务器更新应用程序“心跳”的频率:如果信号很强,您只需不频繁地通知服务器应用程序处于活动状态。然而,一旦信号变为一周,就像肾上腺素开始刺激真实的生命一样,你的应用程序应该更频繁地通知服务器。如果信号强度恢复,您将发送一条特定消息,让服务器知道一切正常;但是,如果服务器在某个时间段内没有收到此消息,并且“心跳”停止-您的应用程序在该时间段内停止通知-则服务器将注销该消息,直到再次收到该消息。

如果您基于TCP连接,服务器应该知道会话何时意外断开-它将获得RST或FIN数据包,具体取决于客户端和服务器之间的路由器配置。
不需要从客户端的角度做任何事情-TCP连接的设计可以让您知道它们何时被中断。

我将在服务器上实现一个处理程序,用于处理客户端无法接收消息的情况。每次发送信息后,手机都会向服务器发回一条信息,表示它已成功接收到该信息。

您是否正在寻找一种让用户在断开连接后发送/接收数据的好方法

HTML5有一个本地存储(也有一个很好的文件大小),所以如果用户正在尝试一个巨大的表单,您首先在本地保存它,然后尝试将它发送到服务器。如果用户再次加载页面时失败,您可以首先检查文件是否有某些内容,如果有,您可以发送该数据,清除内容并相应地继续

也许这对你有帮助

或者查看本地存储教程:

使用此功能,您可以保存频繁的状态数据并动态修改它


Android也应该支持HTML5

我已经在这样做了,但是间隔时间必须足够长,这样我就不会耗尽电池。注销会更好。嗯,这不起作用,因为我需要知道手机是否可以接收信息,或者我是否最好将这些信息发送给其他人。这已经被建议过了。我说过,我已经在做了。但我也想发送一条注销消息。这是“Comet”技术。我不能让TCP连接一直处于打开状态。这是一个设计问题。如果您想知道连接何时被网络级中断,请使用持久TCP会话。您使用的服务器只提供web服务吗?正确,后端不支持此功能。但是如果你读了上面Luviere的回答,这就是我需要的。一种类似的“心跳”技术已经被提出,我已经在使用它了。但是我真的想添加这个注销请求,使它更实时。那么你必须从X时间到X时间互相ping。这将花费更多的电池。。。但要实现实时,你必须做出一些让步。要么是实时的。。。我不同意。有多种方法可以检测wifi信号是否低,并在该点注销。这足够满足我的需要了。阅读卢维耶尔的答案。这是一个非常好的建议。第二,有没有办法检测到用户关闭了wifi并在其发生之前发送我的注销请求?是否可以使用WifiManager的标志继续执行此操作?我尝试了wifi_STATE_禁用,我认为它工作正常。因此,将此和RSS_更改的监控结合起来,将完全满足我的需要。谢谢!!