ブロードキャストリスニングに基づくAndroidネットワークステータスリスニングフレームワーク


最近仕事が少なく、時間に余裕があるので、Androidのネット傍受のベースクラスを自分で研究しています.ネット傍受については、実はこの機能も重要です.このブロックの内容はネット上にもたくさんありますが、正直に言うと、ネット上のこの資料は雑多で、基礎的なネット構築のツールクラスを紹介しているだけで、勉強としか言えません.プロジェクトで役立つ処理案をシステム的に与えていません.たくさん見てもあまり満足していません.車輪がなければ自分で作ると言われています.そこでネット上の資料に基づいて、自分で簡単なネット傍受の枠組みを書いて、みんなを助けることができることを望んで、同時にみんなが指摘することができることを望みます.
実は最初にネットの傍受を実現する構想は2つ考えました.応用の使用過程で、ネットはいつでも変化する可能性があるので、すべてリアルタイムで傍受しなければなりません.そこで、私は1つのserverサービスを通じてバックグラウンドでずっとネットの状況を傍受したいと思っています.ネットが変化するとトースト(Toast)のヒントを弾いて、それから傍受してから自分の論理処理をします.しかし、考えてみると、サービスがバックグラウンドでずっと稼働しているとリソースの消費が大きく最適化に不利になる可能性がありますが、他に良い方法はありませんか.実はリスニングネットワークの仕事を1つのベースクラスに置くことができ、インタフェースのコールバックでリスニング後の論理を処理することができます.サブクラスはこのベースクラスを継承するだけでいいです.これは確かに良い案です.では、この考え方でこの機能を完成させましょう.
実際には、上記の2つのリスニングスキームは、ネットワークの状態が変化すると、システムが送信するので、ブロードキャストによって実現される原理です.
android.net.conn.CONNECTIVITY_CHANGE
の放送、それでは私达は放送の傍受が2つの方式があることを知っていて、1つはダイナミックな傍受で、1つは静的な傍受で、それでは私达はあのような傍受方式を使うべきで、もちろんダイナミックな傍受で、ダイナミックな傍受の利点は私达がactivityのライフサイクルの中で自分の需要によって抹消することができて、これはユーザーにとても良いインタラクティブ感をあげて、もし静的な方式を使うならば、考えてみて、ユーザーがアプリケーションをバックグラウンドに退くと、ネットワークが変化します.私たちのバックグラウンドで実行しているので、ネットワークの変化の論理を処理します.例えば、ネットワークが変化したというヒントボックスをポップアップします.これはユーザーに悪いユーザー体験を与えます.よし、くだらないことをたくさん言ったから、コードをつけましょう.
まず、ネットワークにかかわるため、すべての対応する権限はmanifestで開かれるに違いない.xmlでは、次の権限を追加します.

    
その後、ネットワークの状態をリスニングするには、次のようなコードでブロードキャストをリスニングする必要があります.
public class NetworkChangeReceiver extends BroadcastReceiver {
    public static String TAG = "NetworkChangeReceiver";
    public NetEvevt evevt = BaseActivity.evevt;
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d("Hxh","MainActivity:"+intent.getAction());
        
        if (intent.getAction().equals("android.net.conn.CONNECTIVITY_CHANGE")) {
            //Toast.makeText(context, "network change", Toast.LENGTH_SHORT).show();
            evevt.onNetChange(NetUtil.getNetWorkState(context));
        }

    }
    public interface NetEvevt {
        public void onNetChange(int netModel);    //          
    }

}
ブロードキャストでは、ブロードキャストを傍受した論理を処理するためのインタフェースが実現され、ベースクラスではこのインタフェースが実現される.もちろん、ネットワークツールクラスNetUtilも使用され、getNetWorkState()メソッドでネットワークステータスを取得します.コードは次のとおりです.
public class NetUtil {
    /**
     *      
     */
    private static final int NETWORK_NONET = -1;
    /**
     *       
     */
    private static final int NETWORK_DATA = 0;
    /**
     * WIFI    
     */
    private static final int NETWORK_WIFI = 1;
    /**
     *        
     */
    private static final int NETWORK_NO_WORK = 100;
    /**
     * wifi    ,     
     */
    public static final int WIFI_NET_WORKED =201;
    /**
     * WiFi     
     */
    public static final int WIFI_NET_USELESS = 200;
    /**
     * wifi     (        )
     */
    public static final int WIFI_STATU_DISABLE = 300;
    /**
     * WiFi     (        )
     */
    public static final int WIFI_STATU_ENABLE =301;
    /**
     * WiFi     
     */
    public static final int WIFI_STATU_DISABLING = 302;
    /**
     * WiFi     (        )
     */
    public static final int WIFI_STATU_ENABLING = 303;
    /**
     * WiFi    
     */
    public static final int WIFI_STATU_UNKNOW = 305;

    public static int getNetWorkState(Context context){

        ConnectivityManager connectivityManager = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetWorkInfo = connectivityManager.getActiveNetworkInfo();
        if (activeNetWorkInfo!=null && activeNetWorkInfo.isConnected()){
            if (activeNetWorkInfo.getType() == ConnectivityManager.TYPE_WIFI) {
                return NETWORK_WIFI;
            }else if (activeNetWorkInfo.getType() == ConnectivityManager.TYPE_MOBILE){
                return NETWORK_DATA;
            }else {
                return NETWORK_NONET;
            }
        }else {
            return NETWORK_NONET;
        }
    }

}

このベースクラスを実装しましょう
public class BaseActivity extends FragmentActivity implements NetworkChangeReceiver.NetEvevt{

    public static NetworkChangeReceiver.NetEvevt evevt ;
    private IntentFilter intentFilter;
    private NetworkChangeReceiver networkChangeReceiver;
    /**
     *     
     * @param savedInstanceState
     */
    private int netModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        evevt=this;
        intentFilter = new IntentFilter();
        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
        networkChangeReceiver = new NetworkChangeReceiver();
        registerReceiver(networkChangeReceiver,intentFilter);
        inspectNet();

    }

    public boolean inspectNet(){
        this.netModel = NetUtil.getNetWorkState(BaseActivity.this);
        return isNetConnect();
    }

    /**
     *         
     * @return
     */
    public boolean isNetConnect(){
        if (netModel == 1){
            return true;
        }else if (netModel == 0){
            return true;
        }else if (netModel == -1){
            return false;
        }
        return false;
    }

    @Override
    public void onNetChange(int netModel) {
        Toast.makeText(BaseActivity.this, "network model:"+netModel, Toast.LENGTH_SHORT).show();
    }
}

このクラスでは、onCreat()(onStart()、onResume()などの他の方法でロードする方法で、ブロードキャストを動的に登録することでネットワーク状態をリスニングし、ベースクラスがNetChangeReceiverを実現することが見られる.NetEvevtインタフェースは、onNetChange()の方法でネットワークを傍受したロジックを処理します(もちろん、ここでは簡単にヒントを印刷しただけです).ここまで、単純なネットワーク傍受フレームワークが実現され、あるアクティビティがネットワーク傍受を必要とする場合、このベースクラスを継承して再傍受した論理だけでいいのではないでしょうか.
ソースコードの接続を添付して、足りないところを教え忘れます.クリックしてリンクを開く