Android 安卓互联网连接广播接收器

Android 安卓互联网连接广播接收器,android,broadcastreceiver,Android,Broadcastreceiver,我的应用程序作为服务在后台运行,需要始终连接到远程服务器才能接收和发送消息 此服务运行一个线程,该线程使用套接字管理与服务器的连接 我正在尝试编写一个internet连接广播接收器,它将在每次更改internet状态时运行,并检查状态是否已连接或已断开 我的问题如下:当我连接到Wi-Fi网络时,广播接收器的意图被触发几次,在所有这些事件中,互联网连接的状态都是真实的,每次触发之间没有断开连接,这意味着我有几个新线程使用套接字连接服务器 如何确保正确获取internet的状态?我的意思是,如果且仅

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

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

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

我的问题如下:当我连接到Wi-Fi网络时,广播接收器的意图被触发几次,在所有这些事件中,互联网连接的状态都是真实的,每次触发之间没有断开连接,这意味着我有几个新线程使用套接字连接服务器

如何确保正确获取internet的状态?我的意思是,如果且仅当连接已连接时,.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();
        }           
    }       
}

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

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,my NetworkMonitorService向我的应用程序广播连接,我的应用程序注册连接,并根据需要更新UI


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

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

State State=networkInfo.getState


如果state==state.CONNECTED do_something

,但当连接到wifi时,您编写的代码将运行与广播火相同的次数。假设它发射了4次——4个接收器将进行午餐。你如何知道哪一个接收者应该创建到服务器的新连接?顺便问一下,你知道这是什么原因吗?也许这将有助于理解hoodI register矿井下发生的情况,我的注册方式如下:this.registerReceiver this.myWifiReceiver,new IntentFilter ConnectionManager.CONNECTIVITY_ACTION;我很确定,每次wifi状态转换我只会触发一次。刚刚验证-使用我在之前评论中注册的广播接收器,每次wifi转换只触发一次onReceive。Gtab2/7,安卓4.0.3,它离我的笔记本最近。你可能在安卓4.0.3上是对的,但在2.3.3中,当连接到wifi网络时,它会触发3-4次,这是我的问题。再次检查我的2.3.4设备Kindle Fire。只发射一次。您正在使用的操作是什么请告诉我。我也需要用。提前谢谢