android.net.conn.CONNECTIVITY_CHANGE_IMMEDIATE和android.net.conn.CONNECTIVITY_CHANGE的区别
前言
上班的时候遇到个问题,在android低版本上,我的网络连接成功时会接到两个广播,android.net.conn.CONNECTIVITY_CHANGE_IMMEDIATE
android.net.conn.CONNECTIVITY_CHANGE
那么问题来了,这两个广播的区别是什么呢?我在网上找了半天,都没找到,还是得在代码里翻。
正文
网络连接时
ConnectivityService.java 会调用 handleConnect()方法
该方法里的 sendConnectedBroadcastDelayed(info, getConnectivityChangeDelay());
就是发送这两个广播的地方。
private void sendConnectedBroadcastDelayed(NetworkInfo info, int delayMs) {
Log.v("gaomh","sendConnectedBroadcastDelayed");
sendGeneralBroadcast(info, CONNECTIVITY_ACTION_IMMEDIATE);
sendGeneralBroadcastDelayed(info, CONNECTIVITY_ACTION, delayMs);
}
//delayMs 默认时间是三秒
private int getConnectivityChangeDelay() {
final ContentResolver cr = mContext.getContentResolver();
/** Check system properties for the default value then use secure settings value, if any. */
int defaultDelay = SystemProperties.getInt(
"conn." + Settings.Global.CONNECTIVITY_CHANGE_DELAY,
ConnectivityManager.CONNECTIVITY_CHANGE_DELAY_DEFAULT);
return Settings.Global.getInt(cr, Settings.Global.CONNECTIVITY_CHANGE_DELAY,
defaultDelay);
}
官方对于这个delay时间的解释是:
Default value for {@link Settings.Global#CONNECTIVITY_CHANGE_DELAY} in
* milliseconds. This was introduced because IPv6 routes seem to take a
* moment to settle - trying network activity before the routes are adjusted
* can lead to packets using the wrong interface or having the wrong IP address.
* This delay is a bit crude, but in the future hopefully we will have kernel
* notifications letting us know when it’s safe to use the new network.
{@link settings.global“connectivity”更改“delay”的默认值(毫秒)。这是因为ipv6路由似乎需要花一点时间来解决-在调整路由之前尝试网络活动可能会导致数据包使用错误的接口或具有错误的ip地址。
这个延迟有点粗糙,但希望将来我们会有内核通知让我们知道何时使用新网络是安全的。
结论
功能的角度看:android.net.conn.CONNECTIVITY_CHANGE_IMMEDIATE和
android.net.conn.CONNECTIVITY_CHANGE 没什么区别。