2012년 6월 6일 수요일

안드로이드 프로세스 수명 주기


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 : 애플리케이션 차원에서 구성 변경을 다룰 필요가 있을 때

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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);
    }
}

댓글 없음:

댓글 쓰기