Android Document  SDK old PDF 파일
Notepad Application 작성 실습 예제 3
작성자
작성일 2008-03-04 (화) 14:09
ㆍ추천: 0  ㆍ조회: 7454      
IP: 221.xxx.120
 ※ 아래의 글은 Android Wave와 카페통합을 통해 이곳으로 이동된 글임을 알려드립니다.
 
작성일시 : 2007.11.25 10:29
작성자 : 행복가득(siriusme) 
 
Notepad Application 작성 실습 예제 3

♦ 준비 사항
먼저 SDK를 설치하고, Eclipse 개발환경을 맞추어 놓아야한다. SDK를 패키지 내에 우리가 작성해볼 예제에 대한 자료가 있다. 먼저 다음과 같이 실습해볼 프로젝트 파일을 준비하자. 참고로 완전한 노트패드는 SDK의 samples 폴더에 들어 있다.
1. project exercises archive (.zip) 에서 예제를 다운받자.
2. 적당한 위치에 압축을 풀자.
3. NotepadCodeLab 폴더를 연다. 이 파일 안에는 다음과 같은 6개의 프로젝트 폴더를 볼 수 있다.
 
<그림1>
Notepadv는 실습할 프로젝트이고, NotepadSolution은 실습에 대한 해답이다. 연습을 하다 막히는 부분이 있으면 Solution을 보면 된다. 실습해볼 과제는
(1) 실습 1
수정할 수는 없지만 추가할 수 있는 간단한 노트 리스트를 만드는 것. 이것은 ListActivity와 메뉴 옵션을 생성하고 다루어 보며, SQLite 데이터베이스에 노트를 저장하게 될 것이다.
(2) 실습 2
애플리케이션에 두번째 Activity를 추가해본다. 새 Activity를 만들어 AndroidManifest.xml 파일에 추가하고, Activity간 데이터를 전달해해본다. 그리고 더 다양한 화면 레이아웃을 이용하고, startSubActivity() 메소드를 이용하여 비동기적으로 다른 Activity를 호출해본다.
(3) 실습 3
Life-cycle 이벤트에 대한 핸들링을 애플리케이션에 추가하고, Life-cycle을 지나는동안 애플리케이션 상태를 유지하는 방법에 대해 알아본다.
(4) 실습 4
이클립스 디버거를 어떻게 사용하는지, 이것으로 만들어진 lifecycle 이벤트를 어떻게 확인하는지 살펴본다.
♦ 실습 2
(1) 이클립스에서 다음과 같이 노트패드3 프로젝트를 연다. 여기서는 애플리케이션 상태 데이터를 저장하거나 가져오기 위해서 life-cycle 이벤트 콜백에 대해서 작성해볼 것이다.
 
<그림2>
a. Package Explorer에서 오른쪽 클릭을 하고, Import를 선택 후, /General/Existing Project into Workspace를 선택
b. browse 버튼을 클릭하고, 방금전에 다운받은 폴더를 찾은 다음, Notepadv3을 선택하고 OK를 클릭한다.
c. Notepadv3이 왼쪽 그림과 같이 추가 된 것을 확인할 수 있다.
d. 만약에 AndroidManifest.xml 파일이나, 다른 문제가 발생하면 project의 오른쪽 클릭을 하고 Android Tools  Fix Project Properties를 선택한다. 이렇게 하면 프로젝트는 라이브러리 파일의 잘못된 위치를 찾고, 에러가 없어진다.
(2) 이 현재까지의 예제에는 몇 가지 문제가 있다. 노트 입력화면에서 Back 버튼을 누르면 입력상태가 깨지고, 입력중인 내용을 잃어버린다. 이것을 수정하기 위해 NoteEdit클래스에서의 노트 입력과 수정 기능을 이동시키고 노트 수정을 위한 완전한 lifecycle에 대해 소개할 것이다.
타이틀과 본문을 extra bundle로부터 가져오는 아래의 NodeEdit 코드를 삭제하자. 여기서는 DBHelper 클래스를 이용하여 노트 정보에 직접 접근할 것이다. 이렇게 하면 activity에 전달해 줄 것은 노트 수정시 rowId만 전달해주면 된다.
 
<그림3>
 
<그림4>
그리고, if (extras!=null) { } 부분을 다음과 같이 수정하자.
 rowId = extras!=null ? extras.getLong(Notepadv3.KEY_ROW_ID):null;
(3) NoteEdit 클래스에 DBHelper 필드를 추가한다.
 private DBHelper dbHelper;
다음으로 onCreate() 메소드에 DBHelper 인스턴스 생성 콛,드를 추가하자. (super.onCreate() 호출 다음에 추가하도록 한다.)
 dbHelper = new DBHelper(this);
(4) 노트 수정이 이루어지기 위해서는 icicle의 rowId를 검사해야 한다. onCreate() 메소드의 rowId=null 부분을 다음과 같이 수정하자.
 
<그림5>
Icicle의 null 체크를 하고, icicle로부터 rowId를 받을 수 없는 경우, extras로부터 rowId를 받는 부분이다. 
(5) 이제 confirmButton.setOnClickListener()에서 처리하던 부분을 confirmButton.setOnClickListener() 코드 앞에서 먼저 실행될 populateFields() 함수로 옮겨보도록 하자. 먼저 populate() 메소드를 만들어보자. 일일이 타이핑하지않고 eclipse에서 클릭 몇번으로 간단하게 만들 수 있다.
 
<그림6>
이클립스에서 왼쪽에 에러 표시 부분을 클릭하면 위와 같은 화면이 나온다. 여기서 Create method를 선택하면 메소드가 자동으로 만들어진다.
(6) 이제 onClick() 메소드를 조금 더 짧게 만들어보도록 하자. onClick() 메소드에서 bundle을 생성하고 그 값을 설정해주는 부분을 제거하자. 아래와 같은 코드로 깔끔하게 정리될 것이다.
 
<그림7>
변경된 onCreate() 메소드 전체는 다음과 같다.
 
<그림8>
나중에 life cycle 메소드를 이용하여 새 노트나 수정된 노트를 데이터베이스에 저장하는 것을 다룰 것이다.
(7) populateFields() 메소드를 아래와 같이 정의하자.
 
<그림9>
(8) 다음으로 onFreeze(), onPause(), onResume() 메소드를 오버라이드하자. 이 메소드들은 life cycle 메소드들이다.
onFreeze()는 Activity가 정지되거나, 다시 시작하기 전에 종료되는 경우 안드로이드로부터 호출되는 메소드다. 즉, Activity가 재시작 될 때 이전과 같은 상태로 재초기화 시키기 위해 현재의 특정한 상태를 저장할 수 있다는 것이다. 이 메소드는 onCreate()와 동질성을 지니고 있는데, onCreate()에 전달되는 icicle bundle은 onFreeze()에 전달되는 outState bundle과 동일한 것이다.
onPause()와 onResume()은 서로 상반되는 메소드다. onPause()는 Activity가 끝날 때 항상 호출된다. 여기서 이것을 이용하여 현재의 노트를 데이터베이스에 다시 저장한다. 이 메소드를 이용하기에 가장 좋은 것은 onPause() 메소드에서 해제할 수 있는 자원을 해제하여 휴지(passive) 상태에서 가장 적은 리소스를 차지하도록 하는 것이다. 이런 이유로 DBHelper 클래스를 닫고, 필요에 따라 가비지 콜렉션을 할 수 있도록 필드들을 null 처리한다. 반대로 onResume()에서는 dbHelper 인스턴스를 생성하고, 데이터베이스 외부에서 노트를 읽을 수 있도록 필드의 값을 세팅해준다. onFreeze(), onPause(), onResume() 메소드를 오버라이드하자.
 
<그림10>
(9) 데이터베이스에 데이터를 저장하기 위한 saveState() 메소드를 정의해주자.
 
<그림11>
(10) 이제 Notepadv3클래스내의 onActivityResult()에 있는 핸들링 코드들을 가져오도록 하자.
모든 노트를 가져오고, 업데이트 하는 것은 이제 NoteEdit lifecycle에서 일어나며, onActivityResult() 메소드는 데이터를 화면상에 나타내기만 할 뿐 다른 일은 하지 않게 될 것이다. onActivityResult()는 다음과 같이 변경된다.
 
<그림12>
(11) 이제 다시 필요없는 코드중 onListItemClick() 메소드의 타이틀과 내용을 Intent에 저장하는 코드를 제거하자. rowId를 가져오는 부분을 제외한 나머지를 제거하면 된다.
 
<그림13>
(12) 이제 모두 수정되었으니 실행해서 결과를 보도록 하자.
 
 
 
 
이름아이콘 빈솔B
2009-01-06 09:45
위 본문에 나오는 소스들은 어디서 받을수 있나요?
   
이름아이콘 들풀
2009-01-06 10:16
안드로이드 SDK를 이미 설치하셨다면..
예를들어 D: 디렉토리라면..아래와 같은 같은 위치에 있습니다.
D:android-sdk-windows-1.0_r2samplesNotePad
   
이름아이콘 빈솔B
2009-01-08 10:40
말씀 감사합니다. 제가 말한건 완전한 notepad 소스 말구요 본문에 나오는 실습용 소스 말한거였는데요 2번 게시글에 친절히 링크해주신 분이 있네요. 혹시 저 이후에 실습하시는 분들을 위해 실습 2,3은 sdk 0.9 버전 소스 중심으로 나와있어서 sdk1.0으로 실습하시는 분들은 저처럼 처음에 혼동 많으실것 같네요. 링크된 샘플에 각 실습에 결과 소스가 1.0버전으로 친절히도^^ 같이 있네요 참조하세요~
   
이름아이콘 TaekLove
2009-02-10 09:43
좋은 강의 감사합니다.
   
이름아이콘 와이드오픈
2009-02-17 11:42
아 그래서 달랐구나. 쩝.
DBHelper 클래스가 SDK 1.0 에서는 NotesDbAdapter 클래이 인듯 한데요
이 클래스에 대한 설명은 실습 예제 1에 있을 것같은데 예제 1에대한 글은 없어진듯한데 왜 그런가요?
   
이름아이콘 음냐쿨쿨
2009-12-07 21:34
오홋 정말 그렇군요. SDK 설치하니 노트 패드란게 있었네요. 그런데 SDK에서 제공하는 노트패드는 예제하고 엄청... 다르군요. 그래도 초보로 시작하기엔 example 보다 예제 소스가 더 좋을 것 같네요.
   
 
덧글 쓰기 0
3500
※ 회원등급 레벨 0 이상 읽기가 가능한 게시판입니다.