1

我的应用程序在后台运行(作为服务),需要一直连接到远程服务器才能接收和发送消息。

该服务运行一个管理与服务器的连接的线程(使用套接字)

我正在尝试编写一个互联网连接广播接收器,它将在每次互联网状态更改时运行,并检查状态是否已连接或断开连接。

我的问题如下:当我连接到 Wi-Fi 网络时,广播接收器意图被触发了几次,在所有这些中,互联网连接的状态都是真实的(每次火灾之间没有断开连接,这意味着我很少new Threads 使用 Socket 连接服务器。

我如何确保我获得了正确的互联网状态,并且正确的意思是当且仅当连接已连接时,.isConnected() 方法才会返回?

这是我的代码:

public void onReceive(Context context, Intent intent) 
{       
    action = intent.getAction();
    app = (AppVariables) context.getApplicationContext();       
    if (app.isApplicationInitilized())
    {   
        if (action.equals(action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)))
        {
            networkInfo = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
            if (networkInfo.isConnected())
                app.getServerConnectionManager().startServer();
        }
        else if(action.equals(ConnectivityManager.CONNECTIVITY_ACTION))
        {
            networkInfo = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);                
            if(networkInfo.getType() == ConnectivityManager.TYPE_WIFI && !networkInfo.isConnected())
                app.getServerConnectionManager().stopServer(false);
            else if (networkInfo.getType() == ConnectivityManager.TYPE_MOBILE && !networkInfo.isConnected())
                app.getServerConnectionManager().stopServer(false);
            else
                app.getServerConnectionManager().startServer();
        }           
    }       
}
4

2 回答 2

0

我的一个应用程序也遇到了同样的问题,我们部署(成功)的模式如下:

onReceive():
   if( networkInfo.isConnected() ) 
       fireTimerForSecondaryCheck();
   else
       not connected;

SecondaryCheck:
     if( loadKnownUrl() )
          is connected.
          fire long timer for secondary check
     else
          fire short timer for secondary check

基本上,一旦网络管理员报告 wifi 已启动,它就会尝试访问互联网。如果它接收到预期的内容,则网络连接已启动并正常工作,我将在两分钟后再次检查。如果我没有收到预期的内容,这意味着网络连接未完全建立,无法连接到互联网,或者 wifi 可能有 TOS 或类似的登录页面。在这种情况下,我会在 10 秒后再次检查。

FWIW,我的 NetworkMonitorService 广播与我的应用程序的连接,该应用程序为其注册,并根据需要更新 UI。

这是在 2.3.3 中开发的,我相信较新的 Android 版本(4+)在网络状态上具有更精细的粒度,但我还没有看到在生产中需要调整此代码。它从 2.2 设备一直到 4.2 都运行良好。

于 2012-11-26T16:10:55.543 回答
0

如果我理解正确,您需要知道连接状态。您可以通过使用 networkInfo 状态来获取它:

状态状态 = networkInfo.getState();

if (state == State.CONNECTED) do_something

于 2012-11-26T16:15:20.060 回答