android 第二更(後臺判斷網絡狀態,反饋到頁面)

每日一更之第一天(判斷網絡狀態)
模仿扣扣的頁面,後臺判斷網絡狀態 當網絡狀態改變的時候,能通知前臺頁面做出相應的操作。(頁面很醜)

廣播代碼

public class NetWorkBroadcast extends BroadcastReceiver {
    public static NetWorkListener netWorkListener;
    @Override
    public void onReceive(Context context, Intent intent) {
        //如果無網絡連接activeInfo爲null
        ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo mobileInfo = manager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
        NetworkInfo wifiInfo = manager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
        NetworkInfo activeInfo = manager.getActiveNetworkInfo();
        if(activeInfo == null||!activeInfo.isAvailable()){
            netWorkListener.OnReceived("無網");
        }else{
            if(wifiInfo == null||!wifiInfo.isAvailable()){
                netWorkListener.OnReceived("GPRS");
            }else{
                netWorkListener.OnReceived("wifi");
            }
        }


    } 
   public interface NetWorkListener{
         public void OnReceived(String net);
   }
    public void setOnReceivedMessageListener(NetWorkListener netWorkListener) {
        this.netWorkListener=netWorkListener;
    }

MainActivity 代碼

public class NetworkActivity extends Activity {
    Button btn;
    TextView tv;
    public static ConnectivityManager connectivityManager;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        btn = (Button) findViewById(R.id.btn);
        tv = (TextView) findViewById(R.id.tv);
        /**
         * 測試ConnectivityManager
         * ConnectivityManager主要管理和網絡連接相關的操作
         * 相關的TelephonyManager則管理和手機、運營商等的相關信息;WifiManager則管理和wifi相關的信息。
         * 想訪問網絡狀態,首先得添加權限<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
         * NetworkInfo類包含了對wifi和mobile兩種網絡模式連接的詳細描述,通過其getState()方法獲取的State對象則代表着
         * 連接成功與否等狀態。
         *
         */
        connectivityManager = (ConnectivityManager) this
                .getSystemService(Context.CONNECTIVITY_SERVICE);

        NetWorkBroadcast netWorkBroadcast = new NetWorkBroadcast();
        //廣播監聽
        netWorkBroadcast.setOnReceivedMessageListener(new NetWorkBroadcast.NetWorkListener() {
            @Override
            public void OnReceived(String net) {
                if("無網".equals(net)){
                    btn.setVisibility(View.VISIBLE);
                }else{
                    btn.setVisibility(View.INVISIBLE);
                    isNetworkAvailable();
                }
            }
        });

        if(checkNetworkState()){
             btn.setVisibility(View.VISIBLE);
        }else{
            btn.setVisibility(View.INVISIBLE);
            isNetworkAvailable();
        }
        //點擊進入設置網絡
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = null;
                /**
                 * 判斷手機系統的版本!如果API大於10 就是3.0+ 因爲3.0以上的版本的設置和3.0以下的設置不一樣,調用的方法不同
                 */
                if (android.os.Build.VERSION.SDK_INT > 10) {
                    intent = new Intent(
                            android.provider.Settings.ACTION_WIFI_SETTINGS);
                } else {
                    intent = new Intent();
                    ComponentName component = new ComponentName(
                            "com.android.settings",
                            "com.android.settings.WirelessSettings");
                    intent.setComponent(component);
                    intent.setAction("android.intent.action.VIEW");
                }
                startActivity(intent);
            }
        });

    }
    //檢查是否有網
    private static boolean checkNetworkState() {
        NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo();
        if (activeNetInfo == null||!activeNetInfo.isAvailable()) {
            return true;
        }
        return false;
    }
    /**
     * 網絡已經連接,然後去判斷是wifi連接還是GPRS連接 設置一些自己的邏輯調用
     */
    private void isNetworkAvailable() {

        NetworkInfo.State gprs = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE)
                .getState();
        NetworkInfo.State wifi = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI)
                .getState();
        if (gprs == NetworkInfo.State.CONNECTED || gprs == NetworkInfo.State.CONNECTING) {
            Toast.makeText(this, "wifi is open! gprs", Toast.LENGTH_SHORT)
                    .show();
        }
        // 判斷爲wifi狀態下才加載廣告,如果是GPRS手機網絡則不加載!
        if (wifi == NetworkInfo.State.CONNECTED || wifi == NetworkInfo.State.CONNECTING) {
            Toast.makeText(this, "wifi is open! wifi", Toast.LENGTH_SHORT)
                    .show();
        }
    }
    //設置完成後返回到本頁面要進行再次判斷網絡狀態
    @Override
    protected void onRestart() {
        super.onRestart();
        checkNetworkState();
    }

main.xml 代碼

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
<Button
    android:id="@+id/btn"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:visibility="invisible"
    android:background="@null"
    android:text="設置網絡連接"/>
    <TextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="網絡連接狀態:"/>
</LinearLayout>

這樣做的好處可以使你自己的程序時刻監聽手機的網絡狀態 使頁面做出相應的判斷
最後徐還要添加權限和廣播註冊(靜態註冊和動態註冊都可以建議是動態註冊這樣每個頁面都可以使用此廣播)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章