1. 程式人生 > >Android監聽網路變化並跳轉到WiFi設定

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);
}    
 }
 }