2015-06-13 140 views
1

我想知道是否有機制,所以每當我嘗試使用互聯網時,不知何故AUTOMATICALLY後面的這個方法(isNetworkAvailable)將被調用。Android自動檢查互聯網連接

的問題不是如何檢查互聯網連接,因爲我已經知道:

public boolean isNetworkAvailable(){ 
    ConnectivityManager cm = 
      (ConnectivityManager)ctx.getSystemService(Context.CONNECTIVITY_SERVICE); 

    NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); 
    boolean isConnected = activeNetwork != null && 
          activeNetwork.isConnectedOrConnecting(); 
    return isConnected; 
} 

爲了澄清自己,我想從調用isNetworkAvailable()每次使用互聯網連接時間,以防止(通過我的課,我稱之爲明示或由第三方類我用打開自己的互聯網連接),所以我的代碼不會被到處充滿:

if(isNetworkAvailable()){ 
    // send message to server or open some other internet connection 
} 

不過這個功能在某種程度上將每次嘗試之前調用連接互聯網。

希望我已經清理了自己。無法在SO上找到解決方案。

P.S.我的應用程序可以在離線模式下運行,所以我不希望有一個簡單的廣播接收器在沒有互聯網連接時阻止應用程序(就像某些應用程序一樣)。

回答

1

我已經使用了BroadCastReceiver,它會自動檢查我的Internet連接。

NetworkUtil.java

public class NetworkUtil { 

    public static final int NOT_CONNECTED = 0; 
    public static final int WIFI = 1; 
    public static final int MOBILE = 2; 
    public static int getConnectionStatus(Context context) { 
     ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); 
     if (activeNetwork != null) { 
      if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) 
       return WIFI; 
      if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) 
       return MOBILE; 
     } 
     return NOT_CONNECTED; 
    } 
} 

NetworkConnectivityCheck.java

public class NetworkConnectivityCheck { 
    public boolean internetAvailable = false; 
    private BroadcastReceiver networkChangeReceiver; 
    public NetworkConnectivityCheck() { 
     this.networkChangeReceiver = new BroadcastReceiver() { 
      @Override 
      public void onReceive(Context context, Intent intent) { 
       int networkState = NetworkUtil.getConnectionStatus(context); 
       if (networkState == NetworkUtil.NOT_CONNECTED) { 
        Log.i("InternetApplication", "Internet is not available."); 
        internetAvailable = false; 
        getInternetStatus(); 
       } else if (networkState == NetworkUtil.MOBILE) { 
        Log.i("InternetApplication", "Internet is available through mobile data."); 
        internetAvailable = true; 
        getInternetStatus(); 
       } else if (networkState == NetworkUtil.WIFI) { 
        Log.i("InternetApplication", "Internet is available through wifi."); 
        internetAvailable = true; 
        getInternetStatus(); 
       } 
      } 
     }; 
    } 
    public boolean getInternetStatus(){ 
     Log.d("InternetApplication", "Value of Internet is " + String.valueOf(internetAvailable)); 
     return this.internetAvailable; 
    } 
    public void register(Context context){ 
     context.registerReceiver(networkChangeReceiver, new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE")); 
    } 
    public void unregister(Context context){ 
     context.unregisterReceiver(networkChangeReceiver); 
    } 
} 

這兩個文件後,只需初始化類之前onCreate方法,它看起來像這樣。

MainActivity.java

//Internet Connectivity Check 
    private NetworkConnectivityCheck status = new NetworkConnectivityCheck(); 
    public void networkStatusCheck(){} 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     networkStatusCheck(); 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_sample); 
} 
+0

是的,但是我沒有問怎麼自動檢查Internet連接,但是如何在訪問網絡之前自動執行。 (例如發送數據包等)。 – Jjang

0

下面的代碼可以幫助你,

public class NetworkChangeReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(final Context context, final Intent intent) { 
     final ConnectivityManager connMgr = (ConnectivityManager) context 
       .getSystemService(Context.CONNECTIVITY_SERVICE); 

     final android.net.NetworkInfo wifi = connMgr 
       .getNetworkInfo(ConnectivityManager.TYPE_WIFI); 

     final android.net.NetworkInfo mobile = connMgr 
       .getNetworkInfo(ConnectivityManager.TYPE_MOBILE); 

     if (wifi.isAvailable() || mobile.isAvailable()) { 
      // Do something 

      Log.d("Netowk Available ", "Flag No 1"); 
     } 
    } 
} 
清單中

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/><receiver android:name=".NetworkChangeReceiver" > 
     <intent-filter> 
      <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> 
      <action android:name="android.net.wifi.WIFI_STATE_CHANGED" /> 
     </intent-filter> 
    </receiver> 
+0

它不回答我的問題。我想在每次訪問網絡之前自動調用isNetworkOn()方法,並且此代碼只是偵聽網絡狀態的變化。 – Jjang