안드로이드/Android ICS 부터 Broadcast 시 주의해야 할 점. ( Stopped Process.. )
기존에 BroadCastReceiver를 사용할 경우에는, 현재 실행되고 있는 APP 이나 중지되어 있는 APP 이나 모두 intent action의 타겟이 되면 실행 하게 되었는데요. 3.1 이상의 버전 부터는 실행 APP 과 중지 APP 을 나누어서 관리 하게 된다는 의미 입니다.
그렇기 때문에 3.1이상 버전에도 기존처럼 intent를 사용하고 싶으시면, "FLAG_INCLUDE_STOPPED_PACKAGES" 플래그를 사용해 주시면 됩니다. 만약 중지되어 있는 APP의 BraodCastReceiver가 intent를 받고 싶지 않다면, Receiver를 호출하는 intent에 "FLAG_EXCLUDE_STOPPED_PACKAGES" 플래그를 추가해 주시면 됩니다.
사용방법을 보자면, 3.1 이상 버전에서는
Intent.FLAG_INCLUDE_STOPPED_PACKAGES Intent.FLAG_EXCLUDE_STOPPED_PACKAGES |
를 추가해서 사용하시면 되구요,
3.1 아래 버전에서는
|
플래그를 지원하지 않으므로, final int 상수를 만들어서 사용 하시면 되겠습니다. 재가 사용을 해본 결과 플래그를 강제로 추가해서 3.1 아래 버전에서는 죽지 않고, 3.1 이상 버전에서는 동작하게 되네요. 그래도 혹시 모르니 3.1 이상 버전 부터 적용 되도록 하시면 좋습니다.
사용 방법 입니다.
intent = new Intent("arabiannight.tistroy.com.flag"); if(CommonUtil.higherVersion3dot1() == true){ intent.addFlags(FLAG_INCLUDE_STOPPED_PACKAGES); } sendBroadcast(intent);
/** * 현재 버전 반환 * 3.1 이상 버전 체크 */ public static boolean higherVersion3dot1(){ String version = Build.VERSION.RELEASE; Log.d("VERSION", "before version = " + version); Log.d("VERSION", "before version length = " + version.length()); // ex 3.0.1 5자리 버전일 경우 if(version != null && version.length() >= 5){ Log.d("VERSION", "version length = " + version.length()); version = version.substring(0, 3); Log.d("VERSION", "version = " + version); float fversion = Float.parseFloat(version); Log.d("VERSION", "float version = " + fversion); if(fversion >= 3.1f){ return true; }else{ return false; } }else{ // ex 3.1 3자리 버전일 경우 if(version != null && version.length() >= 3){ version = version.substring(0, version.length()); float fversion = Float.parseFloat(version); Log.d("VERSION", "else float version = " + fversion); if(fversion >= 3.1f){ return true; }else{ return false; } }else{ return false; } } }
이런 식으로 사용 하시면 됩니다.^^
'Android > BroadCastReceiver' 카테고리의 다른 글
안드로이드/Android 브로드캐스트리시버(BroadCastReceiver) 에서 Activity 호출시 주의사항! (1) | 2012.07.03 |
---|---|
안드로이드/Android BroadCastReceiver 란? (6) | 2012.05.01 |