본문 바로가기

나의 플랫폼/안드로이드

[Android] android.net.conn.CONNECTIVITY_CHANGE

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

안드로이드에서 네트워크가 끊겼는지 실시간으로 알아보는 방법으로 아래와 같이 사용하시는 분들도 있을 것이다.


// 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)
}
}


이렇게 사용하면 문제 없이 네트워크 관리가 가능할 듯 하네요.


참고하세요.