Multitasking
Design
- 사용자가 APP 사용을 마쳤을 때, 종료하지 않도록
- 다양한 종류의 APP을 짧고 반복적으로 사용
- 부족한 메모리를 사용
- 새로운 APP이 1초 내에 시작될 수 있도록
- 강력한 기능을 가지고 사용 가능한 API 제공
1번과 2번은 모순됨 - 부족한 메모리에 APP을 종료하지 않음
Application ? Process
- 안드로이드에서 Application과 Process은 연결되지 않음
- 프로세스가 없는 Application
- 여러 Application이 프로세스 공유
- 하나의 Application이 여러 프로세스 사용
- 즉, 프로세스가 Running 상태라고 해서 Application이 작동하고 있지는 않음
각각의 프로세스들은 정해진 규칙에 따라 중요도가 결정되고 가장 중요하지 않은 프로세스가 종료.
프로세스 생명주기
중요도 요소
1. 현재 사용자에게 얼마나 큰 영향을 미치는지
2. LRU
프로세스가 종료하면서 커널이 사용 중이었던 자원을 반환하는지 상관 없이,
커널이 직접 프로세스가 사용 중이던 리소스를 제어하여 메모리 부족 문제를 처리함.
"모든 Application은 항상 작동하고 있다"
Activity의 상태 정보는 어플리케이션 종료 시점이 아니라, 사용자가 Applicatrion을 떠날 때 마다 생성되므로
커널은 사용자의 Application 사용이 끝나더라도 자유롭게 종료 가능하다.
메모리가 부족할 경우에 몇몇 프로세스들은 강제로 종료되고 다시 해당 프로세스가 필요할 경우 마지막 상태 정보를 기반으로 다시 시작됨
하지만 종료되지 말아야할 음악 재생, 데이터 동기화, 알람 등은 Background에서 수행되어야 함
이를 위해서 Manifest에 "Broadcast Receiver" 또는 "Service" 요소를 선언 가능
BroadCast Receiver
Application이 특정 이벤트가 발생한 경우, 짧은 시간동안 Background 작업을 가능하게 함.
Broadcast를 처리하기 위해 Application은 최대 10초의 시간만 사용 가능.
해당 시간 내에 작업을 완료하지 못하면 어플리케이션의 오작동으로 판단하고, Background state(가장 낮은 중요도)의 우선 순위로 변경
Service
긴 시간의 Background 작업을 가능하게 해줌.
Application은 명시적으로 Service를 시작하거나 종료 가능함.
안드로이드 시스템은 단순히 Context를 갖는 Application 요소 하나를 생성- 어떻게 사용되는지는 Application이 결정
작업 시간에 한계가 없으므로, 메모리 부족이 발생하여 모든 Service들이 항상 작동한다는 것을 확실히 보장할 수 없음
만일 메모리가 부족하여 강제 종료된 Service가 있다면 메모리 여유가 생길 때 종료된 프로세스를 다시 시작하여 Servie를 재실행해 줌
Service는 Notification(상태바)에 표시함으로 Foreground 상태로 간주해 달라고 시스템에 요청 가능
추가 내용.
Input Method, TTS 등의 접근성 기능, Live Wallpaper -> Service
Application Widget -> BroadCast Receiver
하나의 Application 내의 모든 Activity와 Service는 하나의 Process에서 동작, 하지만 Manifest의 android:process 속성을 설정 시 다르게 설정 가능
프로세스를 죽이는 법
System.exit(), Process.killProcess() 를 호출하면 프로세스가 강제 종료되지만 안드로이드 플랫폼에서는 예기치 않게 죽었다고 판단하여 해당 프로세스가 하던 일이 있다면 다시 살림
START_NOT_STICKY 모드가 아닌 Service가 작동인 경우
Activity Task 상에 현재 화면에 보이는 Activity Stack 내용이 있을 때, 현재 화면 아래에 있는 Activity를 다시 시작하려고 함
따라서
Manifest 안에 <uses-permission android:name="android.permission.RESTART_PACKAGES"/>
그리고
ActivityManager am = (ActivityManager)getSystemService(ACTIVITY_SERVICE);
am.restartPackage(getPackageName());
하면 가능하다
이는 단지 Process를 종료하는 것이 아니라, 안드로이드 플랫폼에게 특정 Application Package가 종료됨을 알리고 실행되고 있는 Service와 Activity를 모두 제거함
'Android > Theory' 카테고리의 다른 글
Task (0) | 2013.04.16 |
---|---|
Activity 상태에 대한 고찰 (0) | 2013.04.16 |
주의할 부분들 (0) | 2013.04.16 |
Java VM vs Dalvik VM (0) | 2013.04.15 |
Media Scanning (0) | 2013.02.21 |
댓글