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