[안드로이드] 노트패드(NotePad) 예제 분석
- 프로그래밍 정보
- 2010. 10. 19.
반응형
이번에는 인텐트 관점에서 노트패드 예제를 분석해 보려 합니다.
노트패드 어플리케이션은 SDK 샘플 예제로서, 사용자가 노트목록을 열고 , 개별아이템을 보고, 수정하고, 새로운 아이템을 추가하는 등의 기능들이 있습니다. 이 예제의 매니페스트 파일을 보면 3개의 액티비티가 선언되어 있고, 각각은 하나 이상의 인텐트 필터를 가지고 있습니다. CP 또한 선언되어 있네요!
읽기전에 손가락 한번 클릭~ >_<
고마워요 ~ Chu ~ ♥
노트패드 예제 분석
첫 번째 액티비티, NotesList 는 단일 노트가 아닌 노트의 목록을 제어하는 액티비티 입니다. 이것은 일반적으로 어플리케이션의 초기 UI 를 제공합니다. 또한 3개의 인텐트 필터를 가지고 있으므로 세 가지의 작업을 하고 있네요.
1. 첫번째 인텐트 필터
이 필터는 어플리케이션의 메인 시작점을 나타냅니다. 표준 MAIN 액션은 인텐트의 어떤 데이터도 요구하지 않으며, 런처 카테고리는 이 시작점이 어플리케이션 런처에 나타남을 의미합니다.
2. 두번째 인텐트 필터
이 필터는 노트 디렉토리에서 액티비티가 할 수 있는 일을 선언하는 부분입니다.
즉 사용자에게 디렉토리를 보거나(VIEW),
수정하거나(EDIT)
특정 노트를 가져오거나(PICK) 할 수 있게 합니다.
<data> 엘리먼트의 mimeType 속성은 이런 액션들이 처리할 데이터 종류를 지정합니다. 즉 해당 액티비티가 노트패드의 데이터 (vnd.google.note) 를 보유한 CP로부터 0 또는 0개 이상의 아이템들(vnd.android.cursor.dir) 을 담고있는 커서를 얻을 수 있다는 의미입니다. 그 액티비티를 실행하는 인텐트 객체는 그 액티비티가 참조할 데이터타입을 지정하는 content: URI 를 포함할 것입니다.
주의할 점은 인텐트 필터에 DEFAULT 카테고리가 있다는 점입니다.
이것은 Context.startActivity() 와 Activity.startActivityForResult() 메소드가 디폴트 카테고리를 포함한 것처럼 모든 인텐트를 받을 수 있기 때문입니다.
예외 : 대상 액티비티를 명시적으로 지정한 인텐트, MAIN 액션과 런처 카테고리로 구성된 인텐트
그러므로 디폴트 카테고리는 모든 필터에서 필수가 됩니다. 하지만 MAIN 액션과 런처 카테고리는 명시적 인텐트를 위한것이 아니기 때문에 제외사항이라는 뜻입니다.
3. 세번째 인텐트 필터
이 필터는 사용자가 선택하는 디렉토리에 대한 데이터를 요구하는 것이 아니라, 사용자에 의해 선택된 노트를 반환하는 액티비티의 기능을 지정하는 것입니다.
GET_CONTENT 액션은 PICK 액션과 비슷한데, 두개 모두 액티비티는 사용자가 선택한 노트의 URI를 반환하는 역할입니다.
액티비티를 시작하기 위해 startActivityForResult() 메소드를 호출했던 액티비티에 반환됩니다.
여기에서 사용자가 가져올 데이터 디렉토리 대신, 원하는 데이터 타입을 지정하고 있습니다. 데이터타입 vnd.android.cursor.item/vnd.google.note 는 하나의 노트 URI 이며, 액티비티가 반환할 데이터 타입입니다. 반환된 URI로 부터 노트패드 데이터(vnd.google.note) 를 보유한 CP로부터 하나의 아이템에 대한 (vnd.android.cursor.item) 커서를 얻을 수가 있습니다.
즉, PICK 액션의 데이터 타입은 사용자에게 표시되는 데이터 타입이며, GET_CONTENT 는 호출했던 쪽에게 반환될 액티비티의 데이터 타입입니다.
이러한 필터들의 기능을 좀 더 해부해 보자면
action:android.intent.action.MAIN
- 지정된 데이터 없이 액티비티를 실행합니다.
action:android.intent.action.MAIN
category:android.intent.category.LAUNCHER
- 지정된 데이터 없이 액티비티를 실행하며, 런처가 목록을 구성하는 실제 인텐트가 됩니다.
action:android.intent.action.VIEW
data:content://com.google.provider.NotePad/notes
- content://com.google.provider.NotePad/notes 의 아래에 있는 모든 노트목록을 표시할 액티비티를 요청하는 기능을 합니다. 그 뒤 사용자는 목록을 열람하고, 아이템에 대한 정보를 얻을 수 있습니다.
action:android.intent.action.PICK
content://com.google.provider.NotePad/notes
- content://com.google.provider.NotePad/notes 아래의 노트 목록을 표시할 액티비티를 요청하고, 그 뒤 사용자는 그 목록에서 노트를 가져올 수 있고, 그 액티비티는 NoteList 액티비티를 시작시킨 액티비티에게 그 아이템의 URI 를 반환합니다.
action:android.intent.action.GET_CONTENT
data type:vnd.android.cursor.item/vnd.google.note
- 하나의 노트패드 데이터 아이템을 제공하는 액티비티를 요청합니다.
- 지정된 데이터 없이 액티비티를 실행합니다.
action:android.intent.action.MAIN
category:android.intent.category.LAUNCHER
- 지정된 데이터 없이 액티비티를 실행하며, 런처가 목록을 구성하는 실제 인텐트가 됩니다.
action:android.intent.action.VIEW
data:content://com.google.provider.NotePad/notes
- content://com.google.provider.NotePad/notes 의 아래에 있는 모든 노트목록을 표시할 액티비티를 요청하는 기능을 합니다. 그 뒤 사용자는 목록을 열람하고, 아이템에 대한 정보를 얻을 수 있습니다.
action:android.intent.action.PICK
content://com.google.provider.NotePad/notes
- content://com.google.provider.NotePad/notes 아래의 노트 목록을 표시할 액티비티를 요청하고, 그 뒤 사용자는 그 목록에서 노트를 가져올 수 있고, 그 액티비티는 NoteList 액티비티를 시작시킨 액티비티에게 그 아이템의 URI 를 반환합니다.
action:android.intent.action.GET_CONTENT
data type:vnd.android.cursor.item/vnd.google.note
- 하나의 노트패드 데이터 아이템을 제공하는 액티비티를 요청합니다.
두번째 액티비티 , NoteEditor 는 사용자에게 하나의 노트 입력란을 보여주며 , 편집할 수 있게 합니다.
두개의 인텐트 필터를 가지고 있으므로 두 가지의 일을 합니다.
1. 첫번째 인텐트 필터
이 액티비티의 목적은 사용자가 노트를 VIEW 하거나, 그것을 EDIT 하도록 하나의 노트와 상호작용하게 하는 일입니다.
(EDIT_NOTE 와 EDIT 은 동의어 라고 나와있네요;;; )
그 인텐트는 MIME 타입 vnd.android.cursor.item/vnd.google.note 와 일치하는 하나의 특정 노트에 대한 URI를 포함합니다. 이것은 전형적인 NoteList 액티비티의 PICK 또는 GET_CONTENT 액션에 의해 반환되는 URI 가 됩니다. 이 필터도 마찬가지로 클래스를 명시적으로 지정하지 않은 인텐트에 의해 실행될 수 있도록 디폴트 카테고리를 포함하고 있습니다.
2. 두번째 인텐트 필터
이 액티비티의 또 다른 목적은 사용자가 신규 노트를 생성하게 하는 것입니다. 그 노트는 이미 존재하는 노트 디렉토리에 삽입되죠. 그 인텐트는 MIME 타입과 일치하는, 노트가 놓이는 디렉토리에 대한 URI를 포함합니다.
이러한 필터들의 기능을 좀 더 세밀히 살펴보면
action : android.intent.action.VIEW
data : content://com.google.provider.NotePad/notes/ID
- ID 로 식별되는 노트를 보여줄 액티비티를 요청합니다.
action:android.intent.action.INSERT
data:content://com.google.provider.NotePad/notes
- content://com.google.provider.NotePad/notes 에 있는 노트목록에 신규로 빈 노트를 생성하고 사용자가 편집할 수 있게 액티비티를 요청합니다. 만약 노트를 저장하면, 그것의 URI 가 호출한 쪽으로 반환되겠네요
action:android.intent.action.EDIT
data:content://com.google.provider.NotePad/notes/ID
- ID 로 식별되는 노트를 보여주고 그것을 편집할 수 있게 할 액티비티를 요청합니다. 사용자가 변경한 것을 저장하게 되면 액티비티는 CP 에 있는 노트에 대한 데이터를 갱신하도록 합니다.
data : content://com.google.provider.NotePad/notes/ID
- ID 로 식별되는 노트를 보여줄 액티비티를 요청합니다.
action:android.intent.action.INSERT
data:content://com.google.provider.NotePad/notes
- content://com.google.provider.NotePad/notes 에 있는 노트목록에 신규로 빈 노트를 생성하고 사용자가 편집할 수 있게 액티비티를 요청합니다. 만약 노트를 저장하면, 그것의 URI 가 호출한 쪽으로 반환되겠네요
action:android.intent.action.EDIT
data:content://com.google.provider.NotePad/notes/ID
- ID 로 식별되는 노트를 보여주고 그것을 편집할 수 있게 할 액티비티를 요청합니다. 사용자가 변경한 것을 저장하게 되면 액티비티는 CP 에 있는 노트에 대한 데이터를 갱신하도록 합니다.
마지막 액티비티인 TitleEditor 는 사용자가 노트 제목을 편집할 수 있게 하는 역할입니다. 이것은 명시적으로 인텐트에 컴포넌트 이름을 넣어서 인텐트 필터를 사용하지 않고 직접 액티비티 호출로 구현할 수 있지만, 존재하는 데이터에 택일적인 사용을 위하여 인텐트 필터를 사용하는 것입니다.
이 액티비티에 대한 인텐트 필터 중 com.android.notepad.action.EDIT_TITLE 은 커스텀 액션입니다. VIEW 나 EDIT 같이 특정 데이터 타입의 노트에서 호출됩니다. 하지만, 그 액티비티는 노트 자체가 아닌 노트에 포함된 제목을 보여주죠.
통상적인 디폴트 카테고리가 있으며, 표준 카테고리인 ALTERNATIVE 와 SELECTED_ALTER_NATIVE 를 갖고 있습니다.
그리고 label: 속성으로 명시적인 라벨을 제공하는데, 이것은 사용자가 현재 보고있는 데이터의 액션으로써, 액티비티가 표시될 때 사용자가 보는것을 기본적으로 하기 위해서 입니다.
이러한 필터들의 기능은
action:com.android.notepad.action.EDIT_TITLE
data:content://com.google.provider.NotePad/notes/ID
- 노트 ID 와 결합된 제목을 보여주고, 사용자가 제목을 편집할 수 있게 해당 액티비티를 요청합니다.
data:content://com.google.provider.NotePad/notes/ID
- 노트 ID 와 결합된 제목을 보여주고, 사용자가 제목을 편집할 수 있게 해당 액티비티를 요청합니다.
끝~
관련글
반응형