2017-06-13 16 views
-1

私は、ブロードキャスト受信者のすべてのアクティビティでインターネット接続を継続的にチェックしたいと考えています。私はすでにコードを書いており、完璧に働いています。しかし、私はあらゆる活動でそれを使用したい。このコードを変更するにはどうすればよいですか?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はインターネット接続を同時にチェックします。 wifi/mobileを切断すると、snackbar( "Disconnect")にメッセージが表示されます。 –

+0

これは常にチェックされません。それは何かが変化してそれに応答するときにイベントを取得します。 –

答えて

3

私は、すべての活動でそれを使用したいです。このコードを変更するにはどうすればよいですか?

AppCompatActivityを拡張BaseActivityクラスを作成し、あなたの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

あなたは、それ自身のクラスであなたのBroadcastReceiverを入れ、その後、宣言/あなたのマニフェストに登録することができます。そうすれば、アプリケーションの存続期間が共有されます。

さらに、メモリリークを心配する必要がないように、登録解除を心配する必要はありません。

+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は、明示的に受信機を登録した実行中のアプリに通知するだけです。 –

関連する問題