監視ネットワークの変更 - 以上7.0アダプタを含みます

私たちは知っている最古のモニタネットワークの変更、ラジオ、放送の静的または動的な登録プロセス「android.net.conn.CONNECTIVITY_CHANGE」それに意図その上にこのアクションによって。

私たちは、このアクションは、@Deprecatedコメントが追加され、「android.net.conn.CONNECTIVITY_CHANGE」を見つけ、それを使用することは推奨されません。注釈によると7.0と静的登録の放送(マニフェスト)の上に、あなたはこの放送を受信することはできませんが、動的登録も放送を受信することができます。 そのため、一般的な考え方は、7.0に増加し、後でそれを動的に登録し、何を決定することです。

より回帰、より機能、詳しく使用する説明とともに{@link #requestNetworkを}、
{}または{@link #registerNetworkCallback @link #registerDefaultNetworkCallback}。

注これらのメソッドがコールバックの道であることを、APPは、その前に実行する必要があります。私たちは、その静的登録放送受信機は、システムの変更と言うことですつまり、受け取ることができるアプリケーションを実行する必要はありません知っている、取得時のネットワークの変更は、アプリケーションで実行することができます。これは、Androidのシステム権限の制限です。
ここに画像を挿入説明同時に、この方法は、5.0以上での要件を推奨していることを指摘しました。
ここに画像を挿入説明
だから、合計するネットワークの変更リスナーの適応の双方向のプロセスである:
1、放送、7.0と7.0が以前静的、後で使用するための動的登録を使用して登録。(フルバージョンまたは直接動的登録を使用して)
2,7.0以前に使用静的放送、7.0以降の使用はregisterNetworkCallbackをコールバックなど。
(5.0以前に使用された無線(動的または静的)、5.0及びコールバックモードを使用して)

新しいコールバックは、より多くの詳細と、より高速なハードウェア機能を提供し、公式の推薦である可能性があるので、それは最初の2つの方法を使用します。

registerNetworkCallback(NetworkRequest要求、NetworkCallback networkCallback)のパラメータについてNetworkCallback説明コールバックメソッド、閲覧することが推奨され、公式文書、ここでは簡単な説明を:

public static class NetworkCallback {
        /**
         *连接网络了,开计算是否满足要求
         */
        public void onPreCheck(Network network) {}

        /**
         * 网络准备可用了
         */
        public void onAvailable(Network network, NetworkCapabilities networkCapabilities,
                LinkProperties linkProperties) {
                
            onAvailable(network);
            if (!networkCapabilities.hasCapability(
                    NetworkCapabilities.NET_CAPABILITY_NOT_SUSPENDED)) {
                onNetworkSuspended(network);
            }
            onCapabilitiesChanged(network, networkCapabilities);
            onLinkPropertiesChanged(network, linkProperties);
        }

        /**
         * 网络准备可用了
         */
        public void onAvailable(Network network) {}

        /**
         * 网络将要断开
         */
        public void onLosing(Network network, int maxMsToLive) {}

        /**
         * 网络断开
         */
        public void onLost(Network network) {}

        /**
         * 网络不可用
         */
        public void onUnavailable() {}

        /**
         * 网络能力变化,还是可用状态,可能多次调用
         */
        public void onCapabilitiesChanged(Network network,
                NetworkCapabilities networkCapabilities) {}

        /**
         * 链接属性改变
         */
        public void onLinkPropertiesChanged(Network network, LinkProperties linkProperties) {}

        /**
         * 网络暂停
         */
        public void onNetworkSuspended(Network network) {}

        /**
         * 网络恢复
         */
        public void onNetworkResumed(Network network) {}

        private NetworkRequest networkRequest;
    }

多くの方法、ネットワークの状態が変化し、さまざまなコールバックは、この機能なしで放送されています。これらのコールバックメソッドのタイミングは、セルフテストすることができ、又はこの監視アンドロイド5.0以上のモニターネットワークの変更を

ここに私の与えているの実装を

/**
 * 网络连接变化 监听帮助类
 *
 * 说明:
 * 1、静态注册广播监听网络变化 的方式,{@link ConnectivityManager#CONNECTIVITY_ACTION}已有说明,
 *      7.0及以后 静态注册的接收器不会收到 CONNECTIVITY_ACTION,只能用动态注册。(这是官方对广播权限的限制)
 * 2、5.0后有新的api{@link ConnectivityManager.NetworkCallback} ,但是只能在app 存活时监听到。和动态注册效果类似,但有更多细节的回调。
 *
 * 综合这两点,本类实现方案:7.0及以后使用新api,只能在app存活时接收到回调;7.0以前使用静态注册广播。
 */
public class NetworkChangeListenHelper {

    /**
     * 网络不可用
     */
    private static final int NETWORK_STATE_UNAVAILABLE = -1;
    
    /**
     * 网络可用
     */
    private static final int NETWORK_STATE_AVAILABLE = 0;

//    /**
//     * 网络可用,且是移动数据
//     */
//    private static final int NETWORK_STATE_AVAILABLE_MOBILE = 1;
//
//    /**
//     * 网络可用,且是wifi
//     */
//    private static final int NETWORK_STATE_AVAILABLE_WIFI = 2;

    private static NetworkChangeListener mNetworkChangeListener;

    public boolean hasRegistNetworkCallback(){
        return mNetworkChangeListener != null;
    }

    public void registerNetworkCallback(NetworkChangeListener networkChangeListener) {
        if (hasRegistNetworkCallback()) {
            XLogUtil.d("hasRegistNetworkCallback");
            return;
        }

        mNetworkChangeListener = networkChangeListener;

        //7.0及以后 使用这个新的api(7.0以前还是用静态注册广播)
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            ConnectivityManager connectivityManager = (ConnectivityManager) MyApplication.getInstance().getSystemService(Context.CONNECTIVITY_SERVICE);
            // 请注意这里会有一个版本适配bug,所以请在这里添加非空判断
            if (connectivityManager != null) {
                NetworkRequest request = new NetworkRequest.Builder().build();
                connectivityManager.registerNetworkCallback(request, new AkuNetworkCallback());
            }

        }
    }

    private void handleOnNetworkChange(int networkState) {
        if (mNetworkChangeListener == null) {
            return;
        }
        switch (networkState){
            case NETWORK_STATE_UNAVAILABLE:
                mNetworkChangeListener.onNetworkChange(false);
                break;
            case NETWORK_STATE_AVAILABLE:
                mNetworkChangeListener.onNetworkChange(true);
                break;
//            case NETWORK_STATE_AVAILABLE_WIFI:
//                mNetworkChangeListener.onNetworkChange(true);
//                break;
            default:
                break;
        }

    }

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    public class AkuNetworkCallback extends ConnectivityManager.NetworkCallback{

        @Override
        public void onAvailable(Network network) {
            super.onAvailable(network);
            XLogUtil.d("网络连接了");
            handleOnNetworkChange(NETWORK_STATE_AVAILABLE);
        }

        @Override
        public void onLost(Network network) {
            super.onLost(network);
            XLogUtil.d("网络断开了");
            handleOnNetworkChange(NETWORK_STATE_UNAVAILABLE);
        }

        @Override
        public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) {
            super.onCapabilitiesChanged(network, networkCapabilities);
            //网络变化时,这个方法会回调多次
            if(networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)){
                if(networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)){
                    XLogUtil.d("wifi网络已连接");
//                    handleOnNetworkChange(NETWORK_STATE_AVAILABLE_WIFI);

                }else {
                    XLogUtil.d("移动网络已连接");
//                    handleOnNetworkChange(NETWORK_STATE_AVAILABLE_MOBILE);
                }
            }
        }

    }

    public static class NetworkChangeBroadcastReceiver extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {
            //7.0以下用静态广播
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){
                return;
            }
            if (intent == null) {
                return;
            }

            if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) {
                return;
            }

            if (mNetworkChangeListener == null) {
                return;
            }

            boolean noConnectivity = intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false);

            mNetworkChangeListener.onNetworkChange(!noConnectivity);
        }
    }

    /**
     * NetworkChangeListener
     */
    public interface NetworkChangeListener {
        void onNetworkChange(boolean isNetworkAvailable);
    }
}

使用することは非常に簡単です

	/**
     * 监听网络变化
     */
    private static void registerNetworkListener() {
        if (mNetworkChangeListenHelper != null && mNetworkChangeListenHelper.hasRegistNetworkCallback()) {
            return;
        }

        mNetworkChangeListenHelper = new NetworkChangeListenHelper();
        mNetworkChangeListenHelper.registerNetworkCallback(new NetworkChangeListenHelper.NetworkChangeListener() {
            @Override
            public void onNetworkChange(boolean isNetworkAvailable) {
                if (!isNetworkAvailable) {
                	//没网啦,do something
                    return;
                }
                
                //有网啦,do something
                
            }
        });
    }

マニフェストに登録され、忘れてはいけません。

<receiver
android:name=".NetworkChangeListenHelper$NetworkChangeBroadcastReceiver"
            android:exported="true">
            <intent-filter >
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
                <action android:name="android.Net.wifi.WIFI_STATE_CHANGED" />
                <action android:name="android.net.wifi.STATE_CHANGE" />
            </intent-filter>
 </receiver>

まあ、終わっ友人〜

公開された53元の記事 ウォンの賞賛9 ビュー10000 +

おすすめ

転載: blog.csdn.net/hfy8971613/article/details/103336951