참고
- 참고 글이 원본 입니다.
- 공부하기 위해서 재 작성한 내용입니다. 원본을 확인해 주세요.
- 안드로이드의 멀티태스킹 (Multitasking the Android Way)
메모리는 부족하지만 모든 어플리케이션은 항상 실행 중 인것처럼
- 우리는 사용자에게 특정 어플리케이션 사용을 끝마쳤을 때, 명시적으로 어플리케이션을 종료하지 않아도 되기를 원했다. 사용자들은 다양한 종류의 어플리케이션을 아주 짧게 그리고 반복적으로 사용하기 때문이다.
- 휴대용 장치들은 풍족한 스왑 메모리 공간을 갖고 있지 못하며, 메모리 사용에 빡빡한 제한을 갖고 있다. (첨:아주 짧게 여러개를 사용하면 부족해 질 수 있다.)
- 모바일 디바이스에서 어플리케이션 스위칭은 중요하다. 우리는 새로운 어플리케이션이 1초 이내에 시작될 수 있도록 굉장한 노력을 기울였다. 비디오를 보다가 새로 도착한 SMS 문자를 확인하고 다시 비디오 플레이 어플리케이션으로 돌아가는 등의 사용자 시나리오를 생각해 본다면, 몇몇 어플리케이션간의 빠른 스위칭은 특히 더 중요한 문제이다.
- 사용할 수 있는 API 는 안드로이드에 기본 내장된 구글 어플리케이션을 만들 수 있을 만큼 충분히 강력해야 한다. 이것은 우리의 ‘모든 어플리케이션은 동등하다,’ 라는 철학의 문제이다. 즉, 백그라운드 음악 재생, 데이타 동기화, GPS 네비게이션, 어플리케이션 다운로드등의 기능은 서드 파티 어플리케이션 개발자들이 사용가능한 API 와 동일한 API 를 이용해서 작성되어야 한다.
안드로이드에서 프로세스 와 어플리케이션
- 안드로이드에서 프로세스와 어플리케이션은 밀접하게 연결(tightly coupled)되어 있는 요소가 아니며, 어플리케이션은 해당 어플리케이션을 작동시키고 있는 프로세스가 없음에도 사용자에게 현재 작동하고 있는 것 처럼 보일 수도 있고, 또, 여러 어플리케이션이 프로세스를 공유 할 수도 있습니다. 혹은 필요에 따라 하나의 어플리케이션이 여러개의 프로세스를 사용할 수도 있고, 실재로 어플리케이션이 작동 중이 아님에도, 어플리케이션을 구동했던 프로세스들은 종료되지 않고 안드로이드 시스템에 의해 유지될 수 있습니다.
- 어플리케이션의 프로세스는 단순히 안드로이드 시스템이 해당 프로세스가 필요 했었고, 이 후에 해당 프로세스가 다시 사용될 경우에 대비해서 프로세스를 유지하기로 결정했기 때문에 살아있는 것 뿐입니다.
- 안드로이드가 어플리케이션을 관리하는 핵심은 프로세스를 깔끔하게 종료시키지 않는 것입니다.
Explicitly running in the background : 명시적으로 백그라운드 작업
- 어플리케이션은 안드로이드 시스템에게 명시적으로 백그라운드 상에서 작업이 수행되어야 함을 알릴 필요가 있습니다. 어플리케이션은 메니페스트 상에 ‘Broadcast Receiver’ 혹은 ‘Service’ 요소를 선언할 수 있으며, 이 두가지 요소를 통해 명시적으로 백그라운드 작업을 수행 할 수 있습니다.
- Broadcast Receiver
- Broadcast Receiver 는 어플리케이션이 특정한 이벤트가 발생하는 경우에, 아주 짧은 시간동안 백그라운드에서 작업 가능
- Service
- 어플리케이션이 안드로이드 시스템에게 “헤이~ 나는 내가 종료되었다고 하기 전까지 백그라운드에서 계속해서 작동했으면 좋겠어!” 라고 알려주는 것입니다. 어플리케이션은 명시적으로 Service 를 시작 하거나 종료 시킬 수 있습니다.
- 메모리가 부족해 진다면, Service 가 작동중인 프로세스 또한 강제로 종료
- Service 는 안드로이드 시스템에 미리 자신을 ‘Foreground’ 상태로 간주해 달라고 이야기할 수도 있습니다. 이것은, “나를 죽이지 마세요” 라는 뜻인데, 이 경우 해당 Service 는 사용자에게 자신이 현재 작동중임을 Notification (안드로이드 화면 상단의 상태바) 을 통해 표시해 주어야 합니다