Android监听网络变化广播

在Android开发中,监听网络变化是一个常见的需求。当用户切换网络环境时,应用程序需要做出相应的调整。例如,当用户从WiFi切换到移动数据时,应用程序可能会暂停某些数据密集型操作。本文将介绍如何在Android中监听网络变化,并提供代码示例。

网络变化监听原理

在Android系统中,网络变化可以通过广播接收器(BroadcastReceiver)来监听。当网络状态发生变化时,系统会发送一个CONNECTIVITY_ACTION广播。我们可以通过注册一个广播接收器来接收这个广播,并在接收到广播时做出相应的处理。

注册广播接收器

在Android中,可以通过在代码中动态注册广播接收器,或者在AndroidManifest.xml中静态注册。以下是两种注册方式的示例。

动态注册

public class MainActivity extends AppCompatActivity {
    private BroadcastReceiver networkChangeReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) {
                boolean isConnected = isNetworkAvailable(context);
                if (isConnected) {
                    // 网络已连接
                } else {
                    // 网络未连接
                }
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
        registerReceiver(networkChangeReceiver, filter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(networkChangeReceiver);
    }

    private boolean isNetworkAvailable(Context context) {
        ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
        return activeNetworkInfo != null && activeNetworkInfo.isConnected();
    }
}

静态注册

在AndroidManifest.xml中添加以下代码:

<receiver android:name=".NetworkChangeReceiver">
    <intent-filter>
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</receiver>

然后在对应的广播接收器中处理网络变化:

public class NetworkChangeReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) {
            boolean isConnected = isNetworkAvailable(context);
            if (isConnected) {
                // 网络已连接
            } else {
                // 网络未连接
            }
        }
    }

    private boolean isNetworkAvailable(Context context) {
        ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
        return activeNetworkInfo != null && activeNetworkInfo.isConnected();
    }
}

关系图

以下是网络变化监听相关的类和它们之间的关系:

erDiagram
    BroadcastReceiver ||--o| IntentFilter : "注册"
    ConnectivityManager ||--o| NetworkInfo : "获取"
    NetworkChangeReceiver {
        int onReceive(Context context, Intent intent)
        boolean isNetworkAvailable(Context context)
    }
    MainActivity {
        void onCreate(Bundle savedInstanceState)
        void onDestroy()
        BroadcastReceiver networkChangeReceiver
        IntentFilter filter
    }

旅行图

以下是网络变化监听的流程:

journey
    title 网络变化监听流程
    section 应用启动
        MainActivity.onCreate: 开始
        MainActivity.onCreate: 注册广播接收器
    section 网络变化
        NetworkChangeReceiver.onReceive: 接收到网络变化广播
        NetworkChangeReceiver.isNetworkAvailable: 检查网络是否可用
    section 应用响应
        MainActivity: 根据网络状态做出相应处理
    section 应用关闭
        MainActivity.onDestroy: 注销广播接收器
        MainActivity.onDestroy: 结束

结尾

通过本文,我们了解了如何在Android中监听网络变化。无论是动态注册还是静态注册,都可以实现对网络变化的监听。在实际开发中,根据项目需求选择合适的注册方式,并在接收到网络变化广播时做出相应的处理,可以提高应用程序的用户体验。