2014-01-30 64 views
5

我需要注意android系統中的網絡更改並相應地執行特定的活動。檢測WiFi或移動網絡

1)當無線啓用時,執行功能A. 2)當啓用移動網絡,執行功能B. 3)當無線網絡被禁用,並且移動網絡被使能,停止功能A和啓動功能B. 4)當移動網絡被禁用且WiFi被啓用時,停止功能B並啓動功能A. 5)當沒有網絡可用時,不執行功能。

我試過使用CONNECTIVITY_CHANGE。有了這個,我多次獲得了Intent,我也知道它的原因。還有另一個問題。考慮到移動網絡是開啓的。現在,當啓用WiFi時,我啓用了WiFi的2到3次,並且移動網絡禁用也不會被確認。

我也試着用PhoneStateListener.LISTEN_DATA_CONNECTION_STATE註冊。它幾乎可以工作,但是,當WiFi和移動網絡都打開時,我知道WiFi將處於活動狀態,並且當我關閉WiFi時,有時會收到啓用移動網絡的消息,有時候我不會。

我需要解決這個問題。請幫助我的指導。

回答

0

所以實際上你有四個狀態爲(+第五,如果互聯網是有或沒有)

當網絡可用時,你必須通過監控WiFi和移動網絡的狀態來檢查互聯網服務提供商,你的四狀態是

無線上網的變化狀態和

1.移動網絡啓用
2.移動網絡被禁用

移動網絡變化狀態和

1.無線上網啓用
2。禁用了WiFi,

首先你必須監控如果互聯網是否可用,在這之後,你必須添加類似的兩個監聽器(廣播recievers)建立WLAN連接狀態變化和移動狀態的變化和檢查所需的狀態下,我已經添加以下狀態檢查方法,

Reciever實施

檢查在接收器中的變化,然後檢查狀態

public class Internet_State extends BroadcastReceiver { 
//checked with new state changed when event occurs 
public boolean oldInternetState; 

@Override 
public void onReceive(Context context, Intent intent) { 
    ConnectivityManager cm = (ConnectivityManager) context 
      .getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); 
    Bundle b = intent.getExtras(); 
    // if Internet available 
    boolean isConnected = !b 
      .getBoolean(ConnectivityManager.EXTRA_NO_CONNECTIVITY); 
      // ignore if no state change 
    if (oldInternetState == isConnected) 
     return; 
    // set new oldInternetState 
    oldInternetState = isConnected; 
    boolean isMobile = activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE; 
    boolean isWifi = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI) 
      .isAvailable(); 
//you can save these states to be monitored in wifi and mobile change change listners 

    //No internet is 0 state 
    int state = isConnected?1:0; 
      if(state) 
      state = checkState(context) 
    intent.putExtra("state", state); 
      // and then send this intent to your required method which will 
      // check the state and perform function 
} 

@Override 
public void initialize(Context context) { 
    ConnectivityManager cm = (ConnectivityManager) context 
      .getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); 
      //save the current internet state at start of the receiver registration 
    oldInternetState = false; 
    if (activeNetwork != null) 
     oldInternetState = activeNetwork.isConnectedOrConnecting(); 
} 

} 

實現兩個,手機和WiFi狀態變化廣播recievers和更好的增加狀態檢查方法,這樣

檢查國家

監控狀態出的四種狀態

public int checkState(Context context){ 
      ConnectivityManager cm = (ConnectivityManager) context 
      .getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); 
     boolean isMobile = activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE; 
    boolean isWifi = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI) 
      .isAvailable(); 
    //No internet is 0 state 
    int state = isConnected?1:0; 
    if(isWifi && isMobile) 
     state = 1; 
    else if(isWifi && !isMobile) 
     state = 2; 
    if(isMobile && isWifi) 
     state = 3; 
    else if(isMobile && !isWifi) 
     state = 4; 
     return state; 
} 

並從3個Wifi,Internet和Mobile調用此方法數據更改接收者,不要忘記檢查oldState並將其與狀態更改相匹配。建立WLAN連接狀態

移動老態的

NetworkInfo allNetInfo = cm 
      .getNetworkInfo(ConnectivityManager.TYPE_MOBILE); 
    oldDataState = allNetInfo.getState(); 

int state = intent.getExtras().getInt(WifiManager.EXTRA_WIFI_STATE); 
    if (state == WifiManager.WIFI_STATE_ENABLED) 
     state = 1; 
    else if (state == WifiManager.WIFI_STATE_DISABLED) 
     state = 0; 
    else 
     return; 
    if (state == oldWifiState) 
     return; 
    oldWifiState = state; 

問題,我得到的支持WiFi 2〜3倍

WIFI的一個以上的電話改變發生,因爲Wifi改變狀態,如TurningOn和TurningOf由OS觸發,你必須消除他們,就像我上面不喜歡

if (state == WifiManager.WIFI_STATE_ENABLED) 
     state = 1; 
    else if (state == WifiManager.WIFI_STATE_DISABLED) 
     state = 0; 
    else 
     return; 

只有Enabled和Disabled現在被監控。

0

您可以嘗試註冊廣播接收器以注意網絡更改。參見:http://developer.android.com/training/monitoring-device-state/connectivity-monitoring.html

要小心,國家可以改變太多次,每次你的廣播將被觸發。

+0

這就是我的問題。如何用一個觸發器注意到這些變化?此外,該技術同時啓用移動網絡和WiFi,當我們啓用它們時。其實,WiFi將會很活躍。當WiFi開啓時,我們將不得不動態地決定移動網絡已關閉。 – madhu

1
Please find the below code. I suppose it is what you want. In case I misunderstood you, then please let me know: 


    public void checkWifiMobileNetwork(Context context){ 

      ConnectivityManager conMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
      NetworkInfo activeNetwork = conMgr.getActiveNetworkInfo(); 

      if (activeNetwork != null && activeNetwork.isConnected()) { 
       android.net.NetworkInfo connWifiType = conMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI); 
       android.net.NetworkInfo connMobileType = conMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); 

       if(connWifiType.isConnectedOrConnecting()){ 
        Log.d("NETWORK_STATUS","WIFI_IS_THERE"); 
       }else{ 
        Log.d("NETWORK_STATUS","WIFI_IS_NOT_THERE"); 
       } 

       if(connMobileType.isConnectedOrConnecting()){ 
        Log.d("NETWORK_STATUS","MOBILE_NETWORK_IS_THERE"); 
       }else{ 
        Log.d("NETWORK_STATUS","MOBILE_NETWORK_IS_NOT_THERE"); 
       } 

      }else { 
       //notify user you are not online 
       Log.d("NETWORK_STATUS","WIFI_MOBILE_IS_NOT_THERE"); 

      } 
     } 

Set permission at Manifest: 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> 
0

在應用程序中的第一個活動中嘗試此代碼。

public class YourActivity extends Activity { 

    Context mContext; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mContext = this; 
     this.registerReceiver(this.mNetworkConReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); // Here you register your receiver 
    } 

    private BroadcastReceiver mNetworkConReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 

      ConnectivityManager conMngr = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE); 
      NetworkInfo wifi = conMngr.getNetworkInfo(ConnectivityManager.TYPE_WIFI); 
      NetworkInfo mobile = conMngr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); 

      if(wifi.isConnected()){ 
       // Wifi is connected 
      }else if(mobile.isConnected() && wifi.isConnected()){ 
       // Mobile Network and Wifi is connected 
      }// Others conditions here... 

     } 
    }; 

} 

記住:由Android每次網絡狀態變化來觸發你的廣播接收器will'be。