• Processes

    출처: 
    http://namsieon.com/289http://developer.android.com/intl/ko/guide/topics/processes/process-lifecycle.html


    안드로이드 시스템은 메모리가 부족하여 실행되어야 할 프로세스가 실행되지 않는 것을 방지하기 위해 오래된 프로세스를 제거하는 방식을 사용합니다.



    여기에서 어떤 프로세스를 유지하고 어떤 프로세스를 죽일것인지는 무엇을 보고 판단하는 걸까요?

    바로 각각의 프로세스내에서 실행되는 컴포넌트 상태의 '중요성 계층구조(importance hierarchy)' 를 이용합니다.


    가장 낮은 중요성을 가진 프로세스가 가장 먼저 제거되고, 그 다음순으로 진행되지요.

     

    그 계층구조에는 다섯 단계가 존재합니다.



    1. 포그라운드 ( foreground ) 프로세스


    포그라운드 프로세스는 현재 사용자와 커뮤니케이션하는 프로세스 입니다.

    아래와 같은 조건을 가지고 있다면 포그라운드 프로세스로 간주합니다.


    ● 프로세스가 사용자와 상호작용하는 액티비티를 실행중
    ● 사용자와 상호작용하는 액티비티에 연결된 서비스를 포함하고 있음
    ● 생명주기 메소드 ( onCreate(), onStart(), onDestroy() ) 중 하나를 실행중인 서비스 객체를 가지고 있음
    ● onReceive() 메소드를 실행중인 브로드캐스트리시버 객체를 포함하고 있음


    2. 비지블(visible) 프로세스


    비지블 프로세스는 포그라운드 프로세스를 보유하지 않았지만 사용자에게는 보일 수 있는 프로세스 입니다.

    아래와 같은 조건을 가지고 있다면 비지블 프로세스로 간주합니다.


    ● 포그라운드가 아니지만 여전히 보여지는 액티비티를 보유 중
    ● 비지블 액티비티에 연결된 서비스를 포함하고 있음


    ☞  비지블 프로세스는 포그라운드 프로세스가 더 이상 실행 될 수 없을 정도의 상황이 아니라면 강제 종료 되진 않습니다.

    3. 서비스 ( service ) 프로세스


    서비스프로세스는 startService() 메소드를 사용해서 시작된 서비스를 실행중이면서, 포그라운드 프로세스와 비지블 프로세스에 속하지 않는프로세스 입니다.


    서비스 프로세스는 사용자에게 보이진 않지만, 사용자에게 영향을 줄 수 있는 ( mp3 재생 등 ) 작업을 하고 있다고 볼 수 있는데요, 따라서 그라운드 프로세스 및 비지블 프로세스를 유지할 메모리가 없지 않은 이상에는 강제종료 되진 않겠지요.



    4. 백그라운드 ( background ) 프로세스

    백그라운드 프로세스는 사용자의 눈에 보이지 않는 액티비티를 가진 프로세스 입니다. 이것은 사용자에게 직접적인 영향을 주지 않고, 포그라운드 -> 비지블 -> 서비스 프로세스 유지를 위해 언제든지 강제종료 될 수가 있습니다. 

    이런 이유로, 가장 최근에 사용자에게 보여진 액티비티를 가진 프로세스가 가장 나중에 종료될 수 있도록 LRU(Least Recently Used : 가장 최근에 적게 사용되는) 라는 목록으로 관리됩니다.

    이것은 오래된 보여지지 않는 액티비티의 강제종료가 사용자에게 별다른 영향을 주지 않는다고 생각하는 것이지요.


    5. empty 프로세스


    empty 프로세스는 활성화된 것들을 보유하지 않은 프로세스입니다.
    이 프로세스는 캐쉬 역할을 제외하면 하는것이 없기 때문에 강제종료 됩니다. 
    (즉, 중요성이 가장 낮습니다)



    추가적으로, 프로세스의 중요도는 다른 프로레스에 의해 높아질 수 있습니다. 

    다른 프로세스를 지원하는 프로세스는 지원하는 프로세스보다 낮은 중요도를 가지면 안되겠지요.

    예를들어 "A" 프로세스에 있는 서비스가 "B"에 연결되어 있다면 "A"와 "B"는 같은 중요도를 가져야 합니다.


    서비스 프로세스가 백그라운드 프로세스보다 중요도가 높기 때문에 오래걸리는 작업처리는 별도의 스레드에 할당하기 보단 서비스를 이용하여 처리하는것이 좋겠네요. 서비스를 이용하면 액티비티와는 무관하게 최소한 '서비스 프로세스' 우선 순위는 보장된다는 뜻이니까요. 

    때문에 오래걸리는 작업처리 ( 네트워크 다운/업로드 등 ) 는 스레드보다 서비스로 구현해야 하는 이유가 됩니다.

  • Application Life Cycle
    출처: 
    http://starkapin.tistory.com/134

    1. 수명 주기


    메모리를 자동으로 할당해주고 자동으로 비워준다는 것은 가상머신을 사용하는 우리들에게 있어 약일 수도 있지만 오히려 반대로 따지고 보면 당장 반환해야 할 순간에 손만 빨고 있을 지도 모른다는 소리다. 하지만 여지껏 많은 개발자들은 그런 환경에서 완성도 높은 애플리케이션을 개발해 왔으니 이러한 주기를 잘 파악해서 프로그램을 작성해야 한다.

    안드로이드 애플리케이션은 수명 주기를 제어하는 것을 제한 하고 있다. 

    빠른 반응 처리를 위해 달빅 가상 머신은 애플리케이션을 바로 죽이지 않고 가지고 있는다. 종료한 애플리케이션임에도 불구하고 사용자가 다시 누를수 있다는 가정을 하고 있는 것이다. 

    안드로이드는 우선 순위가 높은 것 부터 낮은 순으로 관리해서 높은 순위에 있는 애플리케이션에게 메모리를 우선적으로 할당해준다. 제한된 메모리 관리를 효율적으로 운용하기 위해 낮은 순위에 있는 애플리케이션은 우선 순위가 높은 애플리케이션이 더 많은 메모리가 필요할 때 종료되고 메모리를 반환하게 되어있다.


    2. 프로세스 상태

    안드로이드 애플리케이션은 단일 프로세스로서 하나의 달빅 인스턴스 위에서 베타적으로 실행된다. 

    2-1. 활성 프로세스(Active processes)
    중요한 우선 순위, foreground 상태로 현재 실행중인 애플리케이션을 뜻한다. 

    2-2. 화면에 보이는 프로세스(Visible processes)
    높은 우선 순위, 화면에 보이고는 있으나 비활성화된 프로세스들을 뜻한다.

    2-3. 시작된 서비스 프로세스(Stated Service processes)
    높은 우선 순위, 화면에 보이는 인터페이스 없이도 계속 되어야 하는 지속적인 처리를 지원

    2-4. 백그라운드 프로세스(Background processes)
    낮운 우선 순위, 화면에 보이는 액티비티를 가지고 있지 않으면서, 동시에 실행중인 서비스를 가지고 있지 않는 프로세스

    2-5. 빈 프로세스(Empty processes)
    낮은 우선 순위, 안드로이드 애플리케이션이 다시 띄워질 때 구동 시간을 향상시키기 위하여 이 캐시를 유지.


    3. 애플리케이션 수명 주기 이벤트 

    □ onCreate : 애플리케이션 생성시 호출, 모든 상태 변수와 공유 리소스를 초기화 

    □ onTerminate : 애플리케이션 객체가 종료될 때 호출(항상 호출 된다는 보장을 할 수 없음)
    리소스 회수를 위한 목적으로 커널에 의해 종료되는 경우 이 함수는 호출되지 않는다.

    ★ 애플리케이션 생명주기와 프로세스 생명주기는 일치하지 않는다!

    □ onLowMemory : 시스템 리소스가 부족할 때 애플리케이션이 추가로 메모리를 해제하는 기회를 준다. 모든 백그라운드 프로세스가 종료되었는데도 메모리가 부족하면 호출됨

    □ onConfigurationChanged : 애플리케이션 차원에서 구성 변경을 다룰 필요가 있을 때

    import android.app.Application;
    import android.content.res.Configuration;
    
    public class MyApplication extends Application{
    	
    	private static MyApplication singleton;
    	
    	public static MyApplication getInstance() {
    		return singleton;
    	}
    	
    	@Override
    	public final void onCreate() {
    		super.onCreate();
    		singleton = this;
    	}
    	
    	@Override
    	public final void onTerminate() {
    		super.onTerminate();
    	}
    	
    	@Override
    	public final void onLowMemory() {
    		super.onLowMemory();
    	}
    	
    	@Override
    	public final void onConfigurationChanged(Configuration newConfig) {
    		super.onConfigurationChanged(newConfig);
    	}
    }


'Programing > Android' 카테고리의 다른 글

ANR (Application Not Responding)  (0) 2016.05.06
Process and Thread  (0) 2016.05.04
Google I/O - Memory Management For Android  (0) 2016.05.03
Avoiding Memory Leaks  (0) 2016.05.03
Activity, Fragment Lifecycles  (0) 2016.05.03

+ Recent posts