当前位置: 首页 > 知识库问答 >
问题:

如何处理wifi和移动数据之间的网络更改?

乐正洲
2023-03-14
ConnectivityManager connectivity_mgr = ((ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE));
NetworkInfo net_info = connectivity_mgr.getActiveNetworkInfo();

if (net_info != null && net_info.isConnectedOrConnecting() && !conn_name.equalsIgnoreCase("")) {
    new_con = net_info.getExtraInfo();
    if (new_con != null && !new_con.equalsIgnoreCase(conn_name))
        network_changed = true;
    conn_name = (new_con == null) ? "" : new_con;
    connectionStatus ="connected";
} else {
    if (net_info != null && conn_name.equalsIgnoreCase("")) {
        conn_name = net_info.getExtraInfo();
        connectionStatus ="connected";
        network_changed = true;
    } else if(!new_con.equals(conn_name)) {
        conn_name = "";
        connectionStatus ="disconnected";
        network_changed = true;
    }
}

所以问题是当用户关闭WiFi按钮时,移动数据仍然连接,但我仍然收到WiFi关闭的通知。它指示我网络断开,即使我的手机仍然连接到移动数据。

但一秒钟后,我收到移动数据连接的通知。但是一旦我收到网络断开,我已经关闭了我的VoIP呼叫。因此,当我收到WiFi关闭的通知时,我如何确定移动数据是否仍然连接。

我尝试了getActiveNetworkInfo(),但当我收到WiFi关闭的通知时,它碰巧为null。

共有1个答案

范稳
2023-03-14

您可以利用ConnectivityManagerAPI:特别是在您的用例中,您对RegisterDefaultNetworkCallback():


    public class TestActivity extends AppCompatActivity {

        private ConnectivityManager manager;
        private final ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() {
            @Override
            public void onAvailable(Network network) {
                super.onAvailable(network);
                // this ternary operation is not quite true, because non-metered doesn't yet mean, that it's wifi
                // nevertheless, for simplicity let's assume that's true
                Log.i("vvv", "connected to " + (manager.isActiveNetworkMetered() ? "LTE" : "WIFI"));
            }

            @Override
            public void onLost(Network network) {
                super.onLost(network);
                Log.i("vvv", "losing active connection");
            }
        };

        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            manager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
            manager.registerDefaultNetworkCallback(networkCallback);
        }

        @Override
        protected void onDestroy() {
            super.onDestroy();
            manager.unregisterNetworkCallback(networkCallback);
        }
    }

我的设备在大约半秒内连接到LTE。

这意味着,你无法事先知道,当WIFI断开时,设备最终是否会连接到LTE。因此,您可以采用以下方法:在处理程序上发布一个操作,在该操作中取消调用。如果连接出现任何时间很快-取消计划以前发布的行动。如果您最终处于runnable代码中,那么连接没有快速建立,这意味着您应该结束调用。


    public class TestActivity extends AppCompatActivity {

        private ConnectivityManager manager;

        private final Handler handler = new Handler();
        private final ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() {
            @Override
            public void onAvailable(Network network) {
                super.onAvailable(network);
                Log.i("vvv", "connected to " + (manager.isActiveNetworkMetered() ? "LTE" : "WIFI"));

                // we've got a connection, remove callbacks (if we have posted any)
                handler.removeCallbacks(endCall);
            }

            @Override
            public void onLost(Network network) {
                super.onLost(network);
                Log.i("vvv", "losing active connection");

                // Schedule an event to take place in a second
                handler.postDelayed(endCall, 1000);
            }
        };

        private final Runnable endCall = new Runnable() {
            @Override
            public void run() {
                // if execution has reached here - feel free to cancel the call
                // because no connection was established in a second
            }
        };

        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            manager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
            manager.registerDefaultNetworkCallback(networkCallback);
        }

        @Override
        protected void onDestroy() {
            super.onDestroy();
            manager.unregisterNetworkCallback(networkCallback);
            handler.removeCallbacks(endCall);
        }
    }

 类似资料:
  • 我需要解决这个问题。请帮我指导一下。

  • 本文向大家介绍WiFi和以太网之间的区别,包括了WiFi和以太网之间的区别的使用技巧和注意事项,需要的朋友参考一下 无线上网 WiFi,无线保真是一个小型网络,智能手机,计算机或其他可联网设备在小范围内无线连接并使用热点共享Internet。WiFi使用射频波进行无线高速互联网和网络连接。WiFi天线的尺寸非常小,可以放在小型路由器上。Wifi可用于连接打印机,计算机,游戏机,移动设备等。 以太网

  • 全部的 我是骆驼的开胃菜。我有一些问题。这里有一个场景。 文件正文中有2个字段。(seq, date, OR no.)所以,我为这个数据格式生成了pojo类。 我申请了骆驼队。几天后,关于添加名称字段,dataformat发生了更改。 所以,我们需要修改pojo类并再次重建应用程序。但我们不想再次构建应用程序并为dataformat生成pojo类。 如果我们可以在运行时使用xsd动态生成Pojo类

  • 我目前正在研究Flyway作为Liquibase的替代方案,但在文档中无法找到以下问题的答案: 假设在生产环境中部署后发现迁移包含错误。回想起来,不应该按原样执行,但已经太晚了。但是,我们想用固定版本的替换迁移,这样从头开始填充的数据库就不会遭受相同的错误。 在 Liquibase 中,您将修复原始变更集并使用

  • 我使用文档中的一次单击digital ocean部署来创建一个Hasura实例。然后我配置了Hasura,创建了表,添加了行等等,并为我的应用程序建立了数据模型。 我现在需要将所有这些数据移动到一个单独的数字海洋卷,这样我就可以随着数据库的增长而增加存储空间。我在同一个小滴上创建了一个新的Hasura实例,从新卷的内部,我可以在不同的端口上访问它。如何将所有数据和配置从一个Hasura实例传输到另