2017-06-13 227 views
-1

我想用broadcastreceiver連續檢查每個活動的互聯網連接。我已經寫了代碼,它完美的工作。但我想在每個活動中使用它。我如何修改此代碼?Android連續檢查互聯網連接

public class MainActivity extends Activity { 



private static final String LOG_TAG = "CheckNetworkStatus"; 
private NetworkChangeReceiver receiver; 
private boolean isConnected = false; 
private TextView networkStatus; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION); 
    receiver = new NetworkChangeReceiver(); 
    registerReceiver(receiver, filter); 

    networkStatus = (TextView) findViewById(R.id.networkStatus); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.activity_main, menu); 
    return true; 
} 

@Override 
protected void onDestroy() { 
    Log.v(LOG_TAG, "onDestory"); 
    super.onDestroy(); 

    unregisterReceiver(receiver); 

} 


public class NetworkChangeReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(final Context context, final Intent intent) { 

    Log.v(LOG_TAG, "Receieved notification about network status"); 
    isNetworkAvailable(context); 

    } 


    private boolean isNetworkAvailable(Context context) { 
    ConnectivityManager connectivity = (ConnectivityManager) 
    context.getSystemService(Context.CONNECTIVITY_SERVICE); 
    if (connectivity != null) { 
    NetworkInfo[] info = connectivity.getAllNetworkInfo(); 
    if (info != null) { 
    for (int i = 0; i < info.length; i++) { 
     if (info[i].getState() == NetworkInfo.State.CONNECTED) { 
     if(!isConnected){ 
     Log.v(LOG_TAG, "Now you are connected to Internet!"); 
     networkStatus.setText("Now you are connected to Internet!"); 
     isConnected = true; 
     //do your processing here --- 
     //if you need to post any data to the server or get status 
     //update from the server 
     } 
     return true; 
     } 
    } 
    } 
    } 
    Log.v(LOG_TAG, "You are not connected to Internet!"); 
    networkStatus.setText("You are not connected to Internet!"); 
    isConnected = false; 
    return false; 
    } 
} 


} 
+0

你是什麼意思的「連續」? –

+0

就像Facebook一樣,它可以同時檢查互聯網連接。當我斷開無線網絡/移動設備時,它會在零食欄中顯示一條消息(「斷開」)。 –

+0

這不會經常檢查。當事情發生變化並對此做出迴應時,它會得到一個事件。 –

回答

3

我想在每一個活動中使用它。我如何修改此代碼?

創建BaseActivity類延伸AppCompatActivity,然後讓所有的Activity類擴展這個BaseActivity類。把你的代碼在BaseActivity類中檢查互聯網連接。歡呼:)

+0

我想在每個打開的活動中連續檢查互聯網連接。我不這麼認爲,這無濟於事。 –

+0

@JewelMahmudNimulShamim你需要把你正在使用的代碼檢查BaseActivity內部的連通性,這樣每個擴展BaseActivity的活動都將擁有該代碼。這是一個很好的解決你的問題的方法 – lelloman

+0

你能否給我一個演示。我試過5次不知道我犯了什麼錯誤。 –

0

創建一項服務。在啓動器活動中啓動服務並將網絡檢查代碼放入該服務中。

公共類NetworkServiceextends服務{

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 

    //register receiver here 
    // connection check code 
    return START_STICKY; 
} 

@Override 
public void onStart(Intent intent, int startId) { 
    super.onStart(intent, startId); 
} 

@Override 
public IBinder onBind(Intent intent) { 
    // TODO: Return the communication channel to the service. 
    throw new UnsupportedOperationException("Not yet implemented"); 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    // unregister receiver 

} 

}

0

你可以把你的廣播接收器在它自己的類,然後聲明/註冊在你的清單。這樣它將分享你的應用程序的生命週期。

另一個好處是你不必擔心註銷它,所以你不必擔心內存泄漏。

+0

如果您的應用的目標是Android 7(API 24)或更高版本,則這不起作用。如果您的API> = 24,獲取這些事件的唯一可靠方法是以編程方式註冊接收器。 –

+0

你能解釋爲什麼嗎?或者提供一些資源? –

+0

https://developer.android.com/reference/android/net/ConnectivityManager.html#CONNECTIVITY_ACTION從Android 7開始,CONNECTIVITY_ACTION不再傳遞給具有清單條目的接收者。這是因爲所有應用程序都在註冊此事件,並且在連接更改時通知所有應用程序的成本太高。從API 24開始,Android只會通知正在運行顯式註冊接收器的應用程序。 –