0

我的应用程序有一个要求,其中我的应用程序应该始终连接到互联网(仅限 2G/3G)。要实现这一点,可以创建一个服务来不断检查设备是否连接到互联网。如果没有,那么我们可以以编程方式连接到互联网(这是因为我的应用程序将在用户交互非常少的环境中运行,所以大多数事情应该自动发生)。“服务”方法很好,但由于不断轮询而消耗大量电池,我想避免这种情况。

我最近读到了一个名为 - 的广播CONNECTIVITY_ACTION,它是系统生成的。根据文档,设备连接的更改可能非常频繁——每次您在移动数据和 Wi-Fi 之间移动时都会触发此广播。.

在我的要求中,设备只能连接到 2G/3G,而永远不会连接到 wifi。那么系统是否有广播,我可以使用它来了解连接(开/关)到 2G/3G 的变化?因为根据上面的引用,我推断只有当状态从移动数据(2g/3g)变为 wifi 时才会触发 CONNECTIVITY_ACTION。是这样吗?(如果我错了,请纠正我)。

另外,请告诉我我应该使用最有效的方法来检查我的设备是否经常连接到互联网(2g / 3g)(基于服务的方法除外),以便我可以采取行动连接到自动上网?提前致谢 !

4

2 回答 2

1

完全断开连接时会发送提到的广播。它甚至在文档中提到

对于断开连接事件,如果根本没有连接的网络,则布尔额外的 EXTRA_NO_CONNECTIVITY 设置为 true。

只需聆听CONNECTIVITY_ACTION并执行重新连接设备所需的任何操作。

完整文档:https ://developer.android.com/reference/android/net/ConnectivityManager.html#CONNECTIVITY_ACTION

于 2013-12-10T04:01:26.133 回答
1

“服务”方法很好,但由于不断轮询而消耗大量电池,我想避免这种情况。

不,服务方法没有。事实上,您需要让您的听众在服务中完成所有这些在后端。

wifi 和数据的连接监听器是唯一的方法。如果您不使用 wifi,测试将是一场噩梦(想象在 2g 网络上进行测试)。在高速公路和糟糕的网络场景中需要测试的数据监听器。侦听器的行为很糟糕,有时会发送多个事件,有时根本不会发送任何事件。因此,在使用数据进行测试之前,请先使用 wifi 进行测试。由于有了数据,您需要走出办公室并在真实的道路和地下、电梯和特殊模式(如 AIRPLANE 模式)下进行测试。仔细想想这个功能值得付出努力吗?有太多的场景(现实世界)可能会失败。影响是巨大的,如果它的电池、功能和你的连接服务器行为不端可能会收到太多的连接请求,将其发送到 DOS 攻击:)。

仔细考虑自动连接。

当我遇到这种情况时,我稍微更改了 UX / UI 以在需要时进行连接,从而为应用程序的性能增加了 2 秒。

编辑:测试噩梦

是的,编码是问题的一部分,测试可能是一场噩梦。想象一下,仅在这个连接问题上每周就会出现 10 个错误。想象一下对服务器的 DOS 攻击,直到你重现它才知道。服务器不记录套接字连接(带有时间戳)。想象一下整整 3 天的努力来修复由您自己的应用程序引起的来自电梯中的一位客户的 DOS 攻击。:) 我最近遇到了这个问题。由于对框架的定制不佳,三星使在 Android 中做某事变得不可能。

于 2013-12-10T04:26:31.730 回答