【问题标题】:Pausing service until internet connection can be established暂停服务,直到可以建立互联网连接
【发布时间】:2012-02-12 16:01:33
【问题描述】:

我有一个在启动完成时运行的服务。此服务需要互联网连接。等待设备连接到互联网的最佳做法是什么? wifi的手机真的不重要。

我当前的解决方案涉及一个 while 循环,它只检查 ConnectivityManager,直到其中一个网络可用,但这感觉很粗俗。

有没有更好的方法来做到这一点?

【问题讨论】:

    标签: android service boot connectivity


    【解决方案1】:

    但这感觉很粗俗

    确实:D

    1. 您的接收器唤醒您的唤醒意图服务(可能是一个简单的意图服务,因为手机在启动 AFAIK 时不会休眠)
    2. 服务为连接注册接收器
    3. 服务等待 CountDownLatch
    4. wifi 连接时接收器唤醒服务

    骨架代码:https://stackoverflow.com/a/19968708/281545 - 你的情况更简单,因为你不必唤醒 wifi,保持 wifi 锁等。否则(包括这种情况需要很长时间和无线电/CPU 睡眠 - 在这种情况下,一个简单的意图服务不会)在 2 到 3 之间,您需要:

    2a。服务获取 wifi 锁
    2b。服务调用reconnect()reassociate() 以及所需的任何内容(这可能是特定于设备的)

    【讨论】:

      【解决方案2】:

      您可以使用广播接收器:

      private class ConnectionMonitor extends BroadcastReceiver {
      
          @Override
          public void onReceive(Context context, Intent intent) {
              String action = intent.getAction();
              if (!action.equals(ConnectivityManager.CONNECTIVITY_ACTION))
                  return;
              boolean noConnectivity = intent.getBooleanExtra(
                  ConnectivityManager.EXTRA_NO_CONNECTIVITY, false);
              NetworkInfo aNetworkInfo = (NetworkInfo) intent
                  .getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
              if (!noConnectivity) {
                  if ((aNetworkInfo.getType() == ConnectivityManager.TYPE_MOBILE)
                      || (aNetworkInfo.getType() == ConnectivityManager.TYPE_WIFI)) {
                      // start your service stuff here
                  }
              } else {
                  if ((aNetworkInfo.getType() == ConnectivityManager.TYPE_MOBILE)
                      || (aNetworkInfo.getType() == ConnectivityManager.TYPE_WIFI)) {
                      // stop your service stuff here
                  }
              }
          }
      }
      

      然后,您在代码中的某处实例化:

      ConnectionMonitor connectionMonitor = new ConnectionMonitor();
      registerReceiver(connectionMonitor, intentFilter);
      

      注意:此代码来自Detect 3G or Wifi Network restoration

      【讨论】:

      • 不是每次建立连接时都会运行服务吗?我只需要在启动时运行一次服务,并且需要等到连接可用。它已经在侦听android.intent.action.BOOT_COMPLETED 的BroadcastReceiver 中。
      • 请确认我的理解:您需要在检测到连接后立即启动您的服务吗?如果是,那么您可以将此类公开(在它自己的文件中),在正确的位置放置一个 startService(需要传递一些上下文)方法,并在您的启动活动中实例化和注册 BR。 (不要忘记在您的服务启动时取消注册)
      • @Lunchbox:您表示您正在从您的BOOT_COMPLETED 接收器启动服务。如果您确定还没有 Internet 连接,则此答案中的代码将进入该服务。您还需要某种超时机制,以防用户根本无法访问 Internet,或者您在 Android 4.0+ 上超出了带宽配额。
      猜你喜欢
      • 1970-01-01
      • 2011-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-12
      • 1970-01-01
      相关资源
      最近更新 更多