TOMPA [Android] - 액티비티와 프로세스

2011. 9. 27. 21:23카테고리 없음

1. 액티비티 상태 종류, 우선순위, 스택자료구조 (p.756)tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

- 액티비티는 시작, 실행, 활성, 비활성화, 정지, 종료되는 일련의 상태를 순환하는데 이것을 생명주기라고 한다. 사용자의 선택이나 시스템의 자원 사정에 따라 액티비티의 상태는 끊임없이 바뀐다.tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

- 시스템은 태스크의 실행 중인 액티비티를 스택으로 관리한다. 액티비티가 새로 생성되면 스택의 제일 위에 놓여 활성화된다. 이 상태에서 다른 액티비티가 또 생성되면 기존 액티비티는 잠시 가려지고 새 액티비티가 스택의 제일 위에 배치된다. 스택 제일 위의 액티비티가 종료되면 바로 아래쪽에 있는 액티비티가 자연스럽게 활성화될 것이다. 스택의 액티비티는 넣고 빼기만 할 뿐 순서가 바뀌지는 않는다.tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

- 스택상의 액티비티는 세 가지 상태 중의 하나이다.tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

1. 실행(active,running) : 사용자가 직접 사용하는 상태이다. 스택의 제일 위에 있으며, 화면상에서도 역시 제일 위에 있다. 입력 포커스를 가지며 사용자의 입력을 직접 처리한다.tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

2. 일시 정지(pause) : 포커스는 잃었지만 사용자에게 보이는 상태이다. 위쪽에 다른 액티비티가 있지만 화면 전체를 다 가리지 않았거나, 반투명한 경우가 이에 해당한다. 살아있는 상태 같지만 시스템에 의해 강제 종료될 수도 있다.

3. 정지(stopped) : 다른 액티비티에 의해 완전히 가려진 상태이며, 사용자 눈에 보이지 않는다. 그러나 모든 정보를 다 유지하고 있으므로 언제든지 다시 활성화될수 있다. 메모리가 부족하면 정지 상태의 액티비티를 언제든지 강제 종료할 수 있다.tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

- 각 액티비티의 상태는 현재 실행 중인 모든 액티비티의 스택 구조에서 액티비티가 차지하는 위치에 의해 결정된다.

- onPause() 메소드가 끝나기 전까진 다음 액티비티가 실행되지 않는다!tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

- onPause()가 호출된 이후를 킬러블 상태라고 하며 시스템이 언제든지 액티비티를 강제 종료할 수 있다. 강제종료를 당한 프로그램은 onStop()과 onDestory()가 호출되지 않으므로 호출이 보장된 onPause()가 실질적으로 생명주기의 마지막이라고 할 수 있다. 그래서 미저장 정보는 onPause()에서 저장하는 것이 좋다. 홈키를 누르면 onPause()가, 종료를 누르면 onPause()와 onDestory()가 호출된다.

- 하나의 액티비티가 다른 액티비티를 시작할 때 하느는 멈추고 정지되며, 다른 하나는 시작되는 구조를 가진다. 생명주기 메소드의 순서는 두 개의 액티비티가 동일 프로세스 안에 있을 때에 정의된다.tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

- 현재 액티비티의 onPause()가 호출된다. 다음 시작되는 액티비티의 onCreate()->onStart()->onResume()이 차례대로 호출된다. 그다음 시작하기전 액티비티의 onStop()가 호출된다.tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

- onResume() : 사용자와 상호작용 하기 직전에 호출된다.tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

2. Tasktompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

- 태스크는 하나의 스택 내에 정렬된 액티비티들의 그룹이다. 스택의 루트 액티비티는 그 태스크를 시작했던 액티비티가 된다.

- 태스크는 매니페스트에 있는 클래스나 엘리먼트가 아니라, 액티비티에 대한 스택이다.tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

- 태스크에 대한 값은 루트 액티비티에 의해 설정되며, 태스크의 액티비티와 독립적으로 그 값을 설정할 방법은 없다.

- 태스크 안에서 모든 액티비티는 하나의 단위로 함께 움직이는데, 전체의 태스크는 포그라운드로 가져올 수 있고, 백그라운드로 보내질 수 있다.

- 이런 동작 방식을 수정할 수도 있는데, 매니페스트 내의 <activity> 엘리먼트에 설정된 속성과 액티비티를 시작시켰던 인텐트 객체 내에 설정된 플래그에 의해 제어된다.tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

3. intenttompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

- 안드로이드의 컴포넌트끼리 통신하기 위한 메시지 시스템, 인텐트 안에 누구를 호출하여 무슨 작업을 시킬 것인가에 대한 정보가 들어있다.

- 인텐트에 호출할 대상 컴포넌트가 분명히 명시되어 있는 것을 명시적 인텐트(Explicit intent)라고 하며 누가 호출될 것인지가 애초에 고정되어 있다. 주로 같은 응용 프로그램내의 서브 액티비티를 호출할 때 사용하며 권한만 있다면 외부 응용 프로그램의 액티비티도 호출할 수 있다.

- 반면, 호출 대상이 분명히 정해지지 않은 인텐트,호출 대상 컴포넌트의 특성만 나열되어 있는 인텐트를 암시적 인텐트(implicit intent)라고 하는데 주로 다른 응용 프로그램의 컴포넌트를 호출할 때 사용된다.tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

- 인텐트의 구성요소 : Component name(인텐트를 전달 받을 컴포넌트 명), Action(동작), Category(대상의 종류), Data(데이터 위치와 타입), Extra(기타정보), Flag(시스템에 의한 액티비티 launch 방법과 launch후 액티비티를 다루는 방법) p.739

- Data에 데이터가 직접 들어가 있는게 아니라 주소가 들어가 있다고 생각tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

- 명시적 인텐트 : Intent intent = new Intent(this, subActivity.class);tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

- 암시적 인텐트 : 호출할 컴포넌트를 정확히 아는 것이 아니라 인텐트 객체 내에 호출 대상 컴포넌트를 찾을 수 있는 정보들만 들어있다.

3-1. intent filtertompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

- 인텐트 객체 내의 정보들을 통해 호출해야할 컴포넌트의 정보를 알았으니, 그 다음엔 이 정보를 바탕으로 각 컴포넌트 별로 비교를 해보며 적절한 컴포넌트를 찾아야 한다. 이렇게 인텐트 객체 내의 여러 정보들을 바탕으로 가장 적절한 컴포넌트를 찾는 과정을 인텐트 해석(Intent Resolving)이라 한다. 이 과정에서 인텐트 객체의 정보와 각 컴포넌트의 정보를 비교하게 되며, 이를 위해 각 컴포넌트는 자신이 받을 수 있는 인텐트의 종류를 매니페스트 파일에 정의한다. 이를 인텐트 필터라 한다. 안드로이드 시스템 내부에서는 수많은 어플리케이션들에 의해 수많은 인텐트들이 발생하게 된다. 이 중에서 자신에게 필요한 인텐트 만을 받기 위해 인텐트 필터가 있는 것이다.tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

- 하지만, 인텐트 필터가 없다고 해서 인텐트를 받을 수 없는 것은 아니다. 인텐트 필터는 인텐트 해석 과정이 필요한 암시적 인텐트를 받을 때만 필요할 뿐, 호출 대상 컴포넌트가 명시되어 있는 명시적 인텐트는 이러한 인텐트 필터가 없어도 대상 컴포넌트를 호출할 수 있다.

- 카테고리를 특별히 추가 해주지 않은 인텐트를 받을 수 있게 하려면 카테고리 필터에 android.intent.category.DEFAULT 를 추가해줘야 한다. 그렇지 않으면 어떠한 암시적 인텐트도 받을 수 없게 된다. ( 암시적 인텐트를 만들 때 카테고리를 추가하지 않을 경우 안드로이드에서 자동으로 CATEGORY_DEFAULT를 추가해주게 된다.)tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

- 주로 필터링 되는 항목은 action, data, category 이다.tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

- 인텐트 필터는 여러개가 존재할 수 있다.tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

3-2. 다시 이전으로 실행결과를 되돌려주는 방법tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

- 리턴 값을 돌려주는 액티비티는 startActivityForResult(Intent intent, int requestCode) 메소드로 호출한다. 두 번째 인수는 호출한 대상을 나타내는 식별자이며 리턴시에 누구에 대한 리턴인가를 구분할 때 사용한다.tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

- 여러 액티비티를 호출할 경우 리턴을 받는 메소드에서 어떤 액티비티에 대한 리턴인지를 구분할 수 있어야 하므로 호출되는 액티비티별로 고유의 번호를 붙인다. 음수를 넘길 경우는 리턴을 받지 않겠다는 뜻이다.tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

- 호출된 액티비티가 종료되면 onActivityResult(int requestCode, int resultCode, Intent data) 메소드가 호출되므로 리턴값을 받으려면 이 메소드를 재정의해야 한다. requestCode는 액티비티를 호출할 때 전달한 요청코드이며 resultCode는 액티비티의 실행 결과이다. 이 둘을 분석해 보면 누구에 대한 호출이 어떻게 처리되었는지 알 수 있다. 리턴값은 data 인텐트 안에 포함되어 있으므로 data안의 Extra를 읽어 구한다.

- 결과를 리턴할 때도 인텐트를 사용하는데 새 인텐트 객체를 생성한다.tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

- setResult(int resultCode, Intent data) 메소드로 결과를 대입한다. resultCode는 인텐트의 작업 결과이다. 편집을 완료 했으면 RESULT_OK를 리턴하고 취소했으면 RESULT_CANCEL을 리턴한다 tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof