【问题标题】:Android Internet Connection Broadcast RecevierAndroid Internet 连接广播接收器
【发布时间】:2012-11-26 15:59:02
【问题描述】:

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

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

我正在尝试编写一个互联网连接广播接收器,它会在每次互联网状态发生变化时运行,并检查状态是连接还是断开。

我的问题如下:当我连接到 Wi-Fi 网络时,Broadcast Receiver Intent 会被触发几次,在所有这些情况下,互联网连接的状态都是正确的(每次火灾之间没有断开连接,这意味着我使用 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();
        }           
    }       
}

【问题讨论】:

  • 您正在使用的操作是什么,请告诉我。我也需要用。提前致谢

标签: android broadcastreceiver


【解决方案1】:

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

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 都运行良好。

【讨论】:

  • 但是当连接到 wifi 到您编写的代码时,运行次数将与广播火灾一样多。假设它开火 4 次 - 4 个接收器将吃午饭。你怎么知道哪一个接收者应该创建一个到服务器的新连接?顺便说一句,你知道是什么原因造成的吗?也许这将有助于了解幕后发生的事情
  • 我的注册方式如下:this.registerReceiver( this.myWifiReceiver, new IntentFilter( ConnectivityManager.CONNECTIVITY_ACTION ) );,而且我很确定每次 wifi 状态转换只会发生一次火灾。
  • 刚刚验证过——使用我之前评论中注册的广播接收器会在每次 wifi 转换时仅触发一次 onReceive。 (Gtab2/7",Android 4.0.3,它离我的笔记本电脑最近)。
  • 您在 Android 4.0.3 上可能是对的,但在 2.3.3 中,它在连接到 wifi 网络时会触发 3-4 次 - 这正是我的问题..
  • 再次检查了我的 2.3.4 设备(Kindle Fire)。只触发一次。
【解决方案2】:

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

状态状态 = networkInfo.getState();

if (state == State.CONNECTED) do_something

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-11
    • 2017-06-05
    • 1970-01-01
    • 2011-05-06
    相关资源
    最近更新 更多