본문 바로가기

Android/BroadCastReceiver

안드로이드/Android ICS 부터 Broadcast 시 주의해야 할 점. ( Stopped Process.. )

안드로이드/Android ICS 부터 Broadcast 시 주의해야 할 점. ( Stopped Process.. )




Android 3.1 부터 system 의 package manager 는 application 의 stop 상태를 유지관리하며, background process 나 다른 app 에서 launch 할 수 있는 것을 control 합니다. Activity 의 stopped state 와 application 의 stopped state 는 다릅니다. platform 에서는 2개의 새로운 intent 를 제공해서 stopped application component 관련한 launch 를 control 할 수 있습니다. 
 

FLAG_INCLUDE_STOPPED_PACKAGES  : stopped 된 application 도 target 이 됩니다. 
FLAG_EXCLUDE_STOPPED_PACKAGES : stopped 된 application 은 target 이 되지 않습니다.
 

이 intent flag 가 아무것도 설정되지 않는다면 기본값은 FLAG_INCLUDE_STOPPED_PACKAGES 입니다. 
 
주의할 것은 system 이 broadcast intent 에 대해서는 기본값으로 FLAG_EXCLUDE_STOPPED_PACKAGES 를 더합니다. 이렇게 함으로서 background service 가 stopped application 을 쓸데 없이 launch 하는 것을 막아줍니다.
 
어플리케이션은 설치된 후 한번도 실행되지 않거나, Manage Application 등을 통해 강제종료되었을 경우 stopped state 입니다.




 





기존에 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 아래 버전에서는

 
 public static final int FLAG_INCLUDE_STOPPED_PACKAGES = 32;
 public static final int FLAG_EXCLUDE_STOPPED_PACKAGES = 16;

플래그를 지원하지 않으므로, 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 이상 버전 체크 하는 메서드 입니다.
/**
	 * 현재 버전 반환
	 * 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;
			}
		}
	}


이런 식으로 사용 하시면 됩니다.^^