안드로이드에서 네트워크가 끊겼는지 실시간으로 알아보는 방법으로 아래와 같이 사용하시는 분들도 있을 것이다.
// Broadcast Listener 등록 (onCreate나 onResume에 할당)
IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
try{ registerReceiver(mNetworkStateReceiver, filter); }catch (Exception e){ if (RingQConfig.DEBUG) e.printStackTrace();
}
// Broadcast Listener 해제 (onDestroy나 onPause에 할당)
try { if (mNetworkStateReceiver != null) unregisterReceiver(mNetworkStateReceiver); } catch (IllegalArgumentException e) { if (RingQConfig.DEBUG) e.printStackTrace(); }
// 여기에서 네트워크 상태를 체크 하면 된다.
BroadcastReceiver mNetworkStateReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // 네트워크 체크 } };
위와 같은 방법으로 하면 동작이 잘 된다.
하지만!!!!
구글에서 새로운 N버전을 개발 하면서, 몇가지 사용을 중지하기를 권장하는 Action이 있다.
- 브로드캐스트를 수신하도록 매니페스트에 등록되어 있더라도, Preview를 대상으로 하는 앱은
CONNECTIVITY_ACTION
브로드캐스트를 수신하지 않습니다. 포그라운드에서 실행되는 앱은Context.registerReceiver()
로BroadcastReceiver
를 등록하여 여전히 메인 스레드에서CONNECTIVITY_CHANGE
를 수신할 수 있습니다. - 앱은
ACTION_NEW_PICTURE
또는ACTION_NEW_VIDEO
브로드캐스트를 송수신할 수 없습니다. 이 최적화는 Preview를 대상으로 하는 앱 뿐만 아니라 모든 앱에 영향을 미칩니다.
출처 : https://developer.android.com/preview/features/background-optimization.html?hl=ko
딱 보시면 아시겠지만, CONNECTIVITY_CHANGE를 사용하면 되겠네!
라는 해결책이 나옵니다.
그럼, CONNECTIVITY_CHANGE는 어떻게 사용하면 될까요?
// AndroidManifest.xml
<!-- Network -->
<receiver android:name=".receiver.NetworkChangeReceiver" >
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" >
</action>
</intent-filter>
</receiver>
위와 같이 AndroidManifest에 BroadCastReceiver를 등록 시키시구요.
package com.namuon.ringq.receiver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class NetworkChangeReceiver extends BroadcastReceiver {public static final String EVENT_NETWORK_CHAGED = "network_changed";@Override
public void onReceive(final Context context, final Intent intent) {// 여기에서 네트워크 상태를 체크 하시면 됩니다.
// 참고로 아래와 같이 네트워크 상태가 바꼈을 때, 로컬 Brocast를 날려서
// 화면에 알린 후, 화면 별로 알맞게 제어 하는 것도 좋은 방법 인듯 하네요.
Intent mIntent = new Intent(EVENT_NETWORK_CHAGED);
context.sendBroadcast(mIntent)
}
}
이렇게 사용하면 문제 없이 네트워크 관리가 가능할 듯 하네요.
참고하세요.
'나의 플랫폼 > 안드로이드' 카테고리의 다른 글
[Android] Glide 에서 Gif 로드가 너무 느려요. (4) | 2016.06.08 |
---|---|
[Android] RecyclerView를 이용한 ExpandableListView (4) | 2016.05.31 |
[Android] Get RealPath from Uri (13) | 2016.05.20 |
[Android] WebView File Upload (97) | 2016.05.20 |
[Android] 내가 자주 쓰는 adb 명령어 (0) | 2016.05.18 |