[Android] 实时动态监测网络变化

来源:互联网 发布:php 商城怎么删除订单 编辑:程序博客网 时间:2024/06/12 11:38

【需求分析】

  当前的App一般都需要与网络进行通信,而这其中一个重要的方面就是能够及时监测处网络状态的变化,因此也就也有本次的需求:动态监测当前手机网络状态的变化,包括以下几个方面:1. 手机无网络到有网络 2. 手机有网络到无网络 3. 手机网络Wifi-> 手机移动网络(2/3/4 G)4.手机移动网络(2/3/4 G)-> 手机网络Wifi

【动画效果】

通过Toast展示各种状态的变化

动态监听网络变化

【实现方案】

  核心方案:1. 动态注册广播监听网络状态的变化 2. 根据系统API得到当前的网络类型
  注意:由于需要判断网络类型,需要在Manifest.xml中添加网络访问权限

【代码展示】

package com.test.networkchangetest;import android.content.IntentFilter;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;public class MainActivity extends AppCompatActivity {    private NetworkChangeBroadcast networkChangeBroadcast = null;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        networkChangeBroadcast = new NetworkChangeBroadcast();        IntentFilter intentFilter = new IntentFilter();        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");        registerReceiver(networkChangeBroadcast, intentFilter);    }    @Override    protected void onDestroy() {        super.onDestroy();        unregisterReceiver(networkChangeBroadcast);    }}
package com.test.networkchangetest;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.net.ConnectivityManager;import android.net.NetworkInfo;import android.util.Log;import android.widget.Toast;public class NetworkChangeBroadcast extends BroadcastReceiver {    @Override    public void onReceive(Context context, Intent intent) {        Log.d("NetworkChangeBroadcast", "network changed!");        boolean isNetworkAvailable = false, isWifiAvailable = false, isMobileAvailable = false;        ConnectivityManager connectivityManager = (ConnectivityManager)                context.getSystemService(Context.CONNECTIVITY_SERVICE);        NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();        if (networkInfo != null) {            isNetworkAvailable = networkInfo.isAvailable();            isWifiAvailable = networkInfo.isAvailable() && (networkInfo.getType() == ConnectivityManager.TYPE_WIFI);            isMobileAvailable = networkInfo.isAvailable() && (networkInfo.getType() == ConnectivityManager.TYPE_MOBILE);        }        if (isNetworkAvailable) {            if (isWifiAvailable) {                Toast.makeText(context, "当前网络状态:Wifi 可用", Toast.LENGTH_SHORT).show();            } else if (isMobileAvailable) {                Toast.makeText(context, "当前网络状态:移动网络可用", Toast.LENGTH_SHORT).show();            }        } else {            Toast.makeText(context, "当前网络状态:网络不可用", Toast.LENGTH_SHORT).show();        }    }}
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

【个人总结】

  1. 动态注册广播监听网络的变化,在onCreate中注册,onDestroy中反注册
  2. 判断当前网络状态,通过getSystemService得到ConnectivityManager来得到NetworkInfo,从而拿到当前的网络链接状态
  3. 访问网络状态需要在Manifest中添加网络访问权限android.permission.ACCESS_NETWORK_STATE
0 0
原创粉丝点击