Android監聽網絡變化並跳轉到WiFi設置

在打開App進入程序時,一般都會進行網絡請求數據,但如果手機沒有聯網怎麼辦?總不能什麼都不顯示吧,然後用戶又連接上網絡了,這個時候我們應該繼續網絡請求吧,所以我們應該實時的監聽手機的網絡.
先簡單說一下思路:網絡變化時系統會發出廣播。所以我們監聽這個廣播,利用接口回調通知activity做相應的操作就好了。。
步驟:
           1、寫個判斷網絡的工具類.
           2、先寫個類繼承BroadcastReceiver。(不要忘記在清單文件中註冊)需要在清單文件中添加權限<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
           3、寫個回調接口
           4、beasActivity實現這個接口
1.判斷網絡工具類
public class NetUtil {

    /**
     * 沒有連接網絡
     */
    public static final int NETWORK_NONE = -1;
    /**
     * 移動網絡
     */
    public static final int NETWORK_MOBILE = 0;
    /**
     * 無線網絡
     */
    public static final int NETWORK_WIFI = 1;

    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_MOBILE;
            }
        } else {
            return NETWORK_NONE;
        }
        return NETWORK_NONE;
    }
}
2.繼承BroadcastReceiver監聽網絡的廣播
public class NetBroadcastReceiver extends BroadcastReceiver {
    public NetEvevt evevt = BaseActivity.evevt;

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
            int netWorkState = NetUtil.getNetWorkState(context);
            // 接口回調傳過去狀態的類型
            evevt.onNetChange(netWorkState);
        }
    }
    // 自定義接口
    public interface NetEvevt {
        public void onNetChange(int netMobile);
    }
}
3.beasActivity實現這個接口
public class BaseActivity extends Activity implements NetBroadcastReceiver.NetEvevt {

    public static NetBroadcastReceiver.NetEvevt evevt;
    /**
     * 網絡類型
     */
    private int netMobile;

    @Override
    protected void onCreate(Bundle arg0) {
        // TODO Auto-generated method stub
        super.onCreate(arg0);
        evevt = this;
        inspectNet();
    }
    /**
     * 初始化時判斷有沒有網絡
     */
    public boolean inspectNet() {
        this.netMobile = NetUtil.getNetWorkState(BaseActivity.this);
        if (netMobile == NetUtil.NETWORK_WIFI) {
            System.out.println("inspectNet:連接wifi");
        } else if (netMobile == NetUtil.NETWORK_MOBILE) {
            System.out.println("inspectNet:連接移動數據");
        } else if (netMobile == NetUtil.NETWORK_NONE) {
            System.out.println("inspectNet:當前沒有網絡");

        }
        return isNetConnect();


    }

    /**
     * 網絡變化之後的類型
     */
    @Override
    public void onNetChange(int netMobile) {
        // TODO Auto-generated method stub
        this.netMobile = netMobile;
        isNetConnect();

    }

    /**
     * 判斷有無網絡 。
     *
     * @return true 有網, false 沒有網絡.
     */
    public boolean isNetConnect() {
        if (netMobile == NetUtil.NETWORK_WIFI) {
            return true;
        } else if (netMobile == NetUtil.NETWORK_MOBILE) {
            return true;
        } else if (netMobile == NetUtil.NETWORK_NONE) {
            return false;

        }
        return false;
    }
}
4.
public class MainActivity extends BaseActivity {

    private TextView mTv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTv= (TextView) findViewById(R.id.textView);
        //啓動時判斷網絡狀態
        boolean netConnect = this.isNetConnect();
        if (netConnect){
            mTv.setVisibility(View.GONE);
        }else {
            mTv.setVisibility(View.VISIBLE);
        }
 //點擊跳轉到設置wifi
        findViewById(R.id.textView).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
//                 setWifi1();
//                 setWifi2();
//                setWifi3();
                setWifi4();
            }
        });
    }

    private void setWifi4() {
        Intent i = new Intent();
        if (android.os.Build.VERSION.SDK_INT >= 11) {
            //Honeycomb
            i.setClassName("com.android.settings", "com.android.settings.Settings$WifiSettingsActivity");
        } else {
            //other versions
            i.setClassName("com.android.settings"
                    , "com.android.settings.wifi.WifiSettings");
        }
        startActivity(i);
    }

    private void setWifi3() {
        startActivity(new Intent(android.provider.Settings.ACTION_WIFI_SETTINGS));
    }

    private void setWifi2() {
        Intent intent = new Intent();
        intent.setAction("android.net.wifi.PICK_WIFI_NETWORK");
        startActivity(intent);
    }

    private void setWifi1() {
        Intent wifiSettingsIntent = new Intent("android.settings.WIFI_SETTINGS");
        startActivity(wifiSettingsIntent);
    }
@Override  
public void onNetChange(int netMobile) {  
      super.onNetChange(netMobile);        //網絡狀態變化時的操作      
     if (netMobile==NetUtil.NETWORK_NONE){      
      mTv.setVisibility(View.VISIBLE);       
    }else {           
   mTv.setVisibility(View.GONE);     
   }    
 }
 }


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