To be an Android Expert 문양세강원대학교 IT 대학컴퓨터학부
애플리케이션기초 Part 1 애플리케이션컴포넌트 액티비티와태스크 프로세스와쓰레드 컴포넌트생명주기 Part 2 2
태스크는명시적으로정의 / 선언하는것이아니라, 주어진목적을위해 현재수행되고있는액티비티들의스택이다. 예를들어, 어떤액티비티가특정위치상의시가지지도를보여주고자한다하자. 해당액티비티는안드로이드에이미존재하는맵뷰어액티비티를실행 ( 인텐트를사용하여 start 시킴 ) 하게된다. 이경우, 이전액티비티위에맵뷰어액티비티가수행되며, BACK 키에의해이전 액티비디로돌아갈수있다. 이들관련액티비티들은스택에관리되며, 이들액티비티를하나의태스크라한다. 처음태스크를시작한액티비티를루트액티비티라한다. 새로운액티비티가시작될때, 새로운태스크로수행될수도있으며 ( 새로운스택을 사용하여시작할수있으며 ), ( 동일한스택을사용하여 ) 이전액티비티가속한태스크내에수행될수도있다. 3
그림 : from kandroid.org 4
그림 : from kandroid.org 5
인텐트 (Intent) 를사용하여하나의액티비티에서다른액티 비티를시작시킬수있다. 시작할액티비티의인텐트필터카테고리값에따라, 새로 운태스크혹은기존태스크에서해당액티비티가수행된다. ( 일반적으로, AndroidManifest.xml 에서지정한다.) android.intent.category.launcher: 새로운태스크시작 android.intent.category.browsableintent 등 : 기존태스크에서동작 6
새로운액티비티를시작하려면, 1. 액티비티를시작을유도할 View 를결정 / 생성 2. 새로운액티비티를생성 Java class 를생성 Layout 을위한 XML 파일을생성 관련하여, string XML 파일을수정 3. AndroidManifest.xml 에해당액티비티를등록 4. 기존액티비티에서새로운액티비티를시작 (start) t) 7
액티비티를시작을유도할 View 를결정 / 생성 main.xml button04 추가 string.xml 8
새로운액티비티를생성 (1/4) UiPracticeFirstAct1.java 생성 9
새로운액티비티를생성 (2/4) 10
새로운액티비티를생성 (3/4) act1.xml strings.xml 11
새로운액티비티를생성 (4/4) 12
AndroidManifest.xml 에액티비티등록 (1/2) 기존 activity 추가된새로운 activity 13
AndroidManifest.xml 에액티비티등록 (2/2) AndroidManifest.xml string.xml 14
기존액티비티에서새로운액티비티시작 UiPracticeFirst.java 추가된부분 버튼이클릭되면, 인텐트를이용하여새로운액티비티시작 15
오류가있는경우 ( 특히, Manifest 에등록되지않은경우 ) 16
정상적으로수행된경우 17
홈화면을봅시다. 두개의애플리케이션이있는것으로보인다. 실은새로운태스크가생성되었기때문이다. 왜이런현상이나타났는가? android.intent.category.launcher 로 설정했기때문이다. 18
새로운태스크가아닌액티비티만시작 (1/2) AndroidManifest.xml LAUNCHER 대신에 BROWSABLE 사용 19
새로운태스크가아닌액티비티만시작 (2/2) UiPrac1stAct1이보이지않는다. 하나의태스크에서액티비티들이수행된다. 20
애플리케이션기초 Part 1 애플리케이션컴포넌트 액티비티와태스크 프로세스와쓰레드 컴포넌트생명주기 21
애플리케이션의첫번째컴포넌트가실행되어야할때, 안드로이드는 이의실행을위해하나의실행 (execution) 쓰레드를갖는리눅스프로세스를시작한다. 디폴트로모든애플리케이션의컴포넌트는하나의프로세스내의메인쓰레드에 서동작한다. 그러나, 컴포넌트는메인이아닌다른쓰레드에서동작할수도있으며, 다른프로 세스의쓰레드에서수행될수도있다. 22
애플리케이션의각컴포넌트는자신이실행될프로세스를지정 할수있다. Manifest 파일에서 process 애트리뷰트로지정한다. 모든컴포넌트는지정된프로세스의메인쓰레드에서인스턴스화되며, 그컴포넌트에대한시스템호출은메인쓰레드로부터디스패치 (dispatch) 된다. 23
메인쓰레드이외에, 백그라운드작업을위해쓰레드를생성할 수있다. 특히, 빨리응답할수없는 ( 완료할수없는 ) 컴포넌트의경우, 별 도의쓰레드에할당하는것이바람직하다. 쓰레드는표준 Java 쓰레드오브젝트를사용하여코드에서생성 된다. 24
애플리케이션기초 Part 1 애플리케이션컴포넌트 액티비티와태스크 프로세스와쓰레드 컴포넌트생명주기 25
액티비티의세가지상태 활성화 (active) or 실행중 (running) 상태 해당액티비티가사용자액션에대한포커스를가지고있을때이다. 좀더쉽게말해서, foreground 화면에나타나있을때이다. 멈춤 (paused) 상태 포커스는보유하지않았으나, 여전히사용자에게보이는상태이다. 다른액티비티에의해가려져부분적으로만보이는상태로서, 해당액 티비티는살아있는상태이다. 정지 (stop) 상태 다른액티비티에의해완전히가려진상태이다. 여전히액티비티의정보는유지되나, 메모리부족시종료될가능성이 높은상태이다. 26
액티비티의상태가변하면, 다음의 method 가호출되어, 그변화가통 보된다. void oncreate(bundle savedinstancestate) void onstart() void onrestart() void onresume() void onpause() void onstop() void ondestroy() 이들 method 는상태변화에따른적절한액션을위해, override 하여 사용할수있다. 대표적인사용예가 oncreate() method 이다. 27
foreground lifetime entire lifetime visible lifetime 28
entire lifetime foreground lifetime visible lifetime 29
entire lifetime foreground lifetime visible lifetime 30
entire lifetime foreground lifetime visible lifetime 31
서비스가사용되는두가지방법 새로운서비스시작, 명시적종료 startservice() 로새로운서비스시작 stopservice() 로실행중지, 혹은자신이스스로 stopself() 를사용하여중지 Methods: oncreate(), onstart(intent), ondestroy() 이미존재하는서비스오브젝트에 bind/unbind 클라이언트가 bindservice() 를사용하여서비스오브젝트에커넥션을 만들어이용 커넥션은 unbindservice() 로끊을수있음 Methods: onbind(intent), onunbind(intent), onrebind(intent) 32
active lifetime entire lifetime 33
하나의 callback method 를가진다. onreceive(context, Intent) 리시버에게브로드캐스트메시지가도착할때, 안드로이드는 onreceive() 를호출하여, 메시지를포함하고있는인텐트오브젝트를전달한다. 리시버는 onreceive() method 를실행하는동안에만활성화되는것으로 간주한다. 리시버는 onreceive() 가리턴될때, 비활성화된다. 34
( 자원이부족한모바일디바이스의특성을고려하여 ) 프로세스들은 중요성계층구조 (importance hierarchy) 속에서유지되며, 자원이부족한경우낮은중요성을가진프로세스부터순차적으로제거된다. 프로세스의중요성순서 Foreground: 사용자가현재인터랙션하는프로세스 Visible: 인터랙션은없어도, 눈에는보이는프로세스 Service: 서비스를동작시키고있는프로세스 Background: 동작은하나 visible 하지않은액티비티를가진프로세스 Empty: 어떠한 active 한컴포넌트도가지지않은프로세스 ( 다음번에구동될수있는컴포넌트에대한캐슁을수행하고있음 ) 35
36