오늘은
 안드로이드의 내부-인텐트, 애플리케이션 구성요소, 액티비티 수명주기등을 알아보도록 할께요.

아 그전에 아직 테이블 레이아웃을 보지 않았으니깐 잠깐 알아보고 갈께요. 스크롤뷰도요





만약 어플리케이션이 죽는다면, DDMS의 logcat을 분석해서 디버그를 할 수 있어요.



xml파일에 있는 리소스를 가져오도록 해 볼께요







안드로이드 개발에 있어서 가장 주용한 개념인 intent라는 게 있어요. 뭔가 하려고 하는 일, 즉 어떤 작업을 할건지 담아놓은 객체죠
인텐트의 구성요소로 액션, 데이터, 카테고리가 있는데요, 액션은 어떤동작을 할지 정하는 것으로 ACTION_VIEW는 보겠다,
ACTION_EDIT는 편집을 하겠다는 걸 뜻해요.
 데이터는 하려는 일을 하는 데이터를 나타낸건데 Uri로 표현이 되요. Uri는 URL같이 표시되죠. 그런데 URL과 다른점은 
URL은 우리가 읽기 쉽게 표현되 있는거고, Uri는 시스템이 읽기 쉽게 표현되 있는거에요. 그래서 Uri.parse() 함수를 사용해
우리가 읽기 쉬운 URL을 시스템이 읽기 쉬운 Uri로 바꿔주죠.
 Uri를 지정할 때 content: 이렇게 쓰는데요 이렇게 적어줌으로써 시스템이 액션과 데이터를 조합하여 Activity를 보여주게 되죠. 
  액션과 데이터를 적어주지 않고 컴포넌트 이름을 적어줄 수도 있는데요, Activity를 직접지정하는 거죠. 시스템은 pakage이름을 보고
특정 App를 찾아간후, Class이름으로 특정 class를 찾아가요. 이걸 바로 명시적 인텐트라고 하고, 액션이나 데이터를 사용하는 걸 
암시적 인텐트 라고 해요.
 category는 특정 컴포넌트에 대한 부가적인 정보를 여기 넣어준다고 생각하면 될 거 같애요.
 이런 인텐트는 다른 App간에 서로의 App를 띄우는 모든 경우에 사용되고요, 컴포넌트와 컴포넌트 간 데이터를 전달할때 전부
인텐트가 들어가죠. 
 하나의 App는 하나의 VM에서 돌아가요. 그리고 리소스를 공유하죠. 

Activity에 대한 category를 넣어줄 수 있습니다. 추가적인 정보를 말하죠. 예를 들어 category의 이름이 CATEGORY_LAUNCHAR면
시스템은 이 인텐트필터를 포함하는 액티비티를 홈 스크린에 보여줘요.



Activity가 어떤 동작에 관심이 있는지 설정하기 위해 intent-filter를 만들수 있어요. 인텐트 필터는 시스템에 있는 Activity Manager에게
이 Activity는 어떤 인텐트에 대해 관심이 있고, 그 인텐트가 들어오면 어떤 동작을 할 지 알려주죠. 예를들어 이 안에 '나는 VIEW 액션과 http 데이터가 들어오는 인텐트를 받아들일 수 있는 Activity다!! ' 하고 명시해 줄 수 있어요.



처음 시작될 Activity를 바꿀수도 있어요
여기서 알고가야 할게 있는데요, 하나의 사용자 시나리오를 처리하는 데 하나의 App로만 구성된 건 아니라는 거죠. 예를들어 
그림편집을 하고 메일로 보내는 시나리오가 있다면 그림편집 App에서 '그림선택 App'를 사용하고, 메일 보낼때는 'gmail App'
를 사용해요. 이렇게 사용되는 Activity의 묶음을 task라고 하죠. 각각의 App는 각각의 process를 갖고 있어요. 새로운 App가 
나타날 때마다 Activity stack에 쌓이게 되죠.
 인텐트의 중심에는 Activity Manager가 있어요. 얘가 한쪽 App에서 intent를 받고 다른 App를 실행시켜 주죠. 인텐트를 만들면
시스템에 등록을 해 줘요. 그럼 시스템이 수집을 해서 실제 intent 요청이 왔을 때 적당한 Activity에 매칭을 시켜줘요.
 이게 바로 안드로이드에서 멀티태스킹의 핵심이에요. 여러개의 task랑 프로세스가 잘 돌아가게 만들어 놓았죠. 



인텐트를 사용하는 모습들이에요. 인텐트를 띄운 결과를 알고싶을 때 startActivityForResult 함수를 사용하죠.











그런데 인텐트를 사용해 전화를 걸려고 하면 어플리케이션이 종료되버려요. 퍼미션이 없기 때문이죠. 그래서 퍼미션을 설정할 수도 있습니다. 퍼미션으로 App가 접근할 수 있는 영역을 정할 수 있어요.





Activity간에 데이터를 전달할수도 있어요
Activity가 무엇일까요? 액티비티는 보통 하나의 화면을 표현하죠. 그려주기도 하고, 입력도 받고 해요. 액티비티를 사용하므로써
컴포넌트 재사용을 할 수 있죠. 이전에 실행된 액티비티는 차곡차곡 스택에 쌓이기 때문에 스택에 있는게 pop되면서 재사용
할 수 있어요. 이렇게 액티비티가 여러개 쌓여서 실행되는 걸 task라고 하죠. 여러 App가 상호연동하면서 동작하게 되요. 
 Activity간 데이터를 전달할 때는요 A란 Activity는 putExtra() 로 데이터를 집어넣어서 B에게 전달하고, B는 getExtra()로 데이터를 
가져오죠. B는 Activity 상태값을 돌려줄 수도 있어요.

 인텐트는 데이터 전달을 위해서만 쓰일수도 있어요. 결과값이 올 때 Callback 메소드가 호출이 되죠. 결과값을 받기를 원하면 
startActivityForResult(~~, code) 함수를 이용해서 인텐트를 전달하면 되요. 여기서 code를 왜 주냐면요 인텐트를 전달하는 
A라는 Activity는요 액티비티 B 뿐만 아니라 다른 액티비티인 C를 호출할 수도 있기 때문이에요. 그래서 서로 구분해 주기 위해 
code를 쓰죠.









manifest파일의 역할에 대해서 조금 알아보고 넘어갈께요.
App의 자바 패키지 이름을 지정해요. 패키지는 시스템 상에서 유일하게 구분되는 이름이죠.
App의 컴포넌트에 대해서도 시스템에게 설명해줘요. 컴포넌트에는 액티비티, 서비스, 브로드캐스트 리시버, content provider
가 있죠.
App가 가져야 하는 권한에 대해서도 나와있어요. 다른 App가 접근할 때의 권한에 대해서도 나와있죠.
안드로이드 버전이 워낙 여러개라서 API의 최소레벨도 나와있어요.
그리고 App에 필요한 라이브러리 리스트도 나와있죠.
원래는 하나의 App가 하나의 Process에 매핑이 되는데 가끔 사용하는 프로세스를 변경해서 써야 할 경우도 생기게 되요.
그럴때는 '이 서비스는 따로 20M의 process를 써라' 라는 정보도 넣어줄 수가 있죠.
manifest파일에 있는 intent-filter 엘리먼트는요 이 컴포넌트가 어떠한 상황에서 호출이 될 껀지 결정해줘요.

 어플리케이션엔 수명주기라는 게 있는데요 시스템이 스스로 관리하는거죠. 시스템은 사용자가 process에 대해 신경슬 필요없도록
알아서 판단해서 process를 관리해요. 안드로이드에 종료버튼이 없는 이유이기도 하죠. 시스템은 메모리를 확보하기 위해서
App process를 죽이는데요 그냥 죽이는 건 아니고 중요하지 않은 순서로 제거해요. 포커스가 있는 애는 제일중요한 애고
포커스는 없지만 보이고 있는 애는 그 다음으로 중요한 애고, background로 stack에 존재하는 애는 덜 중요한 애이죠. 그리고
특정 컴포넌트가 실행할 때 알아서 프로세스를 올려줘요. 프로세스는 그래도 죽을때 죽는다고 얘기는 하고 죽죠.
 새로운 Activity가 시작되면 스택의 맨 위쪽에 넣어지고 그 전에 있던 애들은 하나하나씩 없어지면서 밑으로 가요. 얘네는
언제든지 메모리에서 사라질수 있는 애들이죠. 주의할 점은 프로세스가 사라진다고 stack에서 사라지는 건 아니라는 거에요.
 
 액티비티는 수명주기를 가져요. Running, Paused, Stopped, Destroyed 이렇게 4개가 있는데요
Running은 포커스를 가진상태이고
Paused는 포커스를 잃은 상태이고 화면에는 보이는 중이죠.
Stopped은 화면에도 보이지 않고 stack에 쌓여있는 상태에요.
Destroyed는 메모리에도 남아있지 않고 사라지는 거죠.

 액티비티는 처음에 생기면 OnCreate() 가 호출되요.
그리고 OnStart() 에 의해 화면에 보이게 되죠.
OnResume() 으로 포커스를 가지게 되요.
여기까지 하면 Running상태가 되죠.
Running에서 onPause() 가 호출되면 Paused 상태가 되면서 포커스를 잃게되요.
하지만 다시 onResume() 로 포커스를 얻을 수 있죠.
Paused 상태에서 onStop() 이 호출되면 화면에도 보이지 않고 스택에 쌓여 있기만한 Stopped 상태가 되죠.
여기서 다시 Running으로 가서 포커스를 잡으려면
onRestart() 를 호출하고 --> onStart() 로 화면에 보인 후 --> onResume() 으로 포커스를 잡아야 해요.
 이렇게 액티비티가 화면에 보여지는 생애기간은 onStart() 메소드를 호출할 때부터 onStop() 메소드를 호출할 때까지
라고 할 수 있죠.

 그럼 onCreate() 부터 볼께요
여기서는 setContentView() 를 이용해서 화면구성을 해요. 그 다음에 Intent에서 받아온걸 처리하죠. 
 onPause() 는 포커스를 다른 Activity에게 넘기는 거에요. 내께 다 끝나서 stack의 top이 실행되어 새로운게 덮어씌여지는거죠.
 얘는 주로 데이터를 저장소에 저장하거나 할때 많이 쓰여요. 그리고 이 상태의 Activity는 시스템이 강제로 종료시킬수도 있는데요
그래서 Date를 저장소에 저장해야 하는거에요.
 onPause() 와 onResum() 은 새로운 Activity가 올라오거나 사라지는 거기 때문에 사용자가 부드럽게 느끼려면 시간을 짧게 해야
해요. 
 onDestroy() 는 액티비티가 없어지기 전에 호출이 되요. 더이상 Activity가 쓸모가 없어진 거죠. back키를 눌렀을 때 호출이 되죠.
 즉, onPause(), onStop(), onDestroy() 메소드가 강제종료될 수 있는 애들인데요 onPause() 만이 강제종료되기 전에 확실히
호출되는 메소드이고 onStop(), onDestroy() 메소드는 호출되지 않을수도 있기 때문에 데이터 저장등의 코드는 꼭 onPause()
에 있어야 해요.
 새로운 액티비티가 덮어 씌어지는거랑 다이얼로그랑은 전혀 틀려요. 다이얼로그가 떴을 때 상태변화는 전혀 없죠.
 반투명 윈도우로 액티비티를 보여줄 수도 있는데요 이렇게 되면 새로운 Activity가 올라오긴 하는데 반투명상태라서 예전 Activity도
보이긴 하죠. 근데 입력을 할순 없고요. 
 back key와 home key를 눌렀을 때 차이가 좀 있어요.
 back key를 눌렀을 때는 Activity를 종료시키는 거고요 home key를 눌렀을 때는 사용할 여지를 남겨놓는거죠. 그래서 스택에도
Activity가 쌓인 채로 있는데요, 만약 A 에서 B 를 호출하고 home key를 누른 후 다시 들어오면 A부터 실행되는게 아니라 B가
실행이 되는거죠.
 그리고 phone에서 stop버튼 누르면 대기상태로 갔다가(paused) 다시 menu버튼을 누르면 resume이 되요.
 지금까지 본것처럼 Activity를 보여줄 때는 stack에 올라가는가? 화면에 보여져야 하는가? 포커스를 가져야 하는가? 등을 신경
쓰는게 중요해요.
 안드로이드에서의 바탕화면은 window의 바탕화면과 틀려요. 내가 하던 App위에 바탕화면 App를 덮어 씌었을 뿐이죠.
 

Activity 데이터 교환을 이용한 예제예요






 시스템에 메모리가 없어서 프로세스를 갑자기 죽일 때는요 그냥 죽이는건 아니고 saveInstanceState() 와 restoreInstanceState()가
호출이 되요. saveInstanceState()는 현재 상태를 저장해야 하는 시점에 불리게 되죠. restoreInstanceState()는 파일에 저장되있던 값
을 되돌려 놓으라는 거에요. 이게 호출될 때는 Activity가 스택에 있다해도 다시 불릴때 create부타 다시하죠.

 아래는 두 Activity를 이용해 수명주기를 확인하는 예제에요



 
신고

'T아카데미' 카테고리의 다른 글

사용자인터페이스_02  (0) 2010.07.02
사용자인터페이스_02  (0) 2010.07.01
어플리케이션 구조  (0) 2010.07.01
사용자인터페이스_01  (0) 2010.07.01
안드로이드 개발환경  (0) 2010.06.27
안드로이드 개요  (0) 2010.06.26
Posted by 응큼미소
 너무 오랜만에 복습을 하게 되었어요. 여러가지 이유가 있겠지만 역시 저의 게으름이 제일 문제인것 같습니다.
 그리고 지금 시간이 너무 늦어서 모든 내용을 복습하기는 힘들거 같아요. 그래서 공부할때 찍어놨던 이미지를 바탕으로 복습하겠습니다. 추가적으로 복습하면서 나오는 내용들은 계속 적어나갈께요.

  처음에 나오는 내용은 버튼을 클릭했을때의 이벤트리스너를 만드는 모습이에요.









이번에는 소스에서 layout리소스에 xml파일로 만들어놓은 각종 view를 사용하는 모습입니다. 
view의 크기를 지정하는 속성값 중에 fill-parent라는게 있는데요 이건 컨테이너의 길이만큼 크기를 늘리라는 거에요.




UI에 있는 view들의 id를 확인할 수 있어요. id라는 속성은 해당 뷰를 구분하는 데 쓰여요. 레이아웃에서 유일한 값을 갖죠.
그런데 id를 새로 선언할때 @+를 쓰는데요 id는 새로운 파일로 생기는게 아니라 추가되는 거니깐 그렇죠. id는 그냥 하나의 integer
값일 뿐이에요. 개발자가 보기 편하게 하려고 문자로 쓰죠.



이제 Activity UI의 여러 레이아웃을 확인해 보겠습니다.

레이아웃의 속성을 사용하기 위해 레퍼런스 문서를 참고할 수 있어요
속성중에 visivility라는 게 있는데요 속성값을 visiable로 주면 화면에 표시를 해준다는 거에요.
invisiable을 주면 화면에 표시는 안하는데 공간은 차지한다는 거죠.
gone으로 하면 화면에 표시도 않해주고, 공간도 차지 않해요.


 view 라는건 Activity를 구성하는 각각의 기본 구성요소라고 할 수 있죠. 개발할때는 일단 xml로 view를 그리고, 입력에 대한 
이벤트를 처리해요. 코드를 통해 view를 그릴수도 있는데요, xml로 그리면 xml을 파싱하는 비용만 들어가기 때문에 일반적으로 
xml에 구현하죠.
 view를 2개로 구분해 볼 수 있어요. 첫번째로 위젯이라는 건 말단의 view를 나타내죠. 그리고 레이아웃이라는 건 Lienear layout
같이 다른 애를 배치시키는 view에요. 여기서 위젯은 버튼, 텍스트Field, Edit박스 같은 걸 말하죠. 
 트리형태로 구성이 되는 view를 어떻게 사용하냐면요 일단 속성을 설정할 수 있어요. 그리고 화면 가장 위에 있어서 사용자의 입력
을 받을 수 있는 포커스를 설정하죠. 버튼클릭 등의 이벤트가 발생했을 때 처리할 수 있는 리스너를 설정할 수도 있어요.
setVisibility 메소드를 호출해서 뷰를 보이거나 감출 수도 있죠.
 보통 최상위에 하나의 layout이 들어가고요 child element로 위젯이 들어가요. 그리고 각각의 속성을 xml attribute로 처리하죠.
 소스코드에서 findViewById함수는 xml에서 정의한 위젯을 가져오는 일을 하고요 setContentView는 xml의 정보를 보고 메모리에
view를 구성하죠.

프레임레이아웃이라는 게 있는데요 무조건 새로운 뷰를 뷰들의 왼쪽위에 배치시켜요. 예를 활용하면 가려져있는 상태에서 어떨 때
는 A의 visivility를 보여주고, 어떨때는 B의 visivility를 보여주고 등등을 할수 있죠.

리니어 레이아웃부터 보겠어요. 예는 내부에 들어가는 자식뷰들을 수직 또는 수평으로 배치하죠.


남은 공간을 전부 활용하기 위해 weight를 줄 수 있어요. 여러 위젯이 남은 공간을 상대적으로 얼마나 점유할 것인지를 결정하죠.
vertical일 때는 height만 weight가 적용이 되요 gravity도 마찬가지죠. horizontal일 때는 그 반대에요.


정확한 위치를 주기 위해 gravity 속성을 줄 수도 있어요
android:gravity는 문자에 대한 위치를 바꾸는 거고요
android:layout_gravity는 view의 상대적 위치를 바꾸는 거에요.




레이아웃의 속성을 사용하는 모습이에요. 만약 TextView에서 margin을 준다면 TextView의 바깥을 비우라는 뜻이고
padding을 준다면 TextView안에서 특정 공간을 비우라는 거에요.
textSize를 줄때 18sp 이런식으로 보통 주는데요 sp는 크기를 상대적으로 결정하는 거에요. 사용자마다 font사이즈가
바뀔수 있으니깐 그런 경우를 대비한 거죠. 다양한 속성을 보고싶으면 d.android.com에 가서 찾아보세요. 자바의 어떤
메소드랑 연관되는지도 다 확인해 볼 수 있어요.
 버튼 얘기를 좀 할께요. 버튼은 TextView를 상속한 엘리먼트이기 때문에 TextView와 비슷하게 속성을 사용하면 되요.







relative layout의 사용모습이에요
frame이나 Linear같은 건 메모리에 view를 tree형태로 만든다고 얘기했었는데요 너무 tree를 많이 쓰면 stack overflow가 나죠
그래서 가능하면 relative layout을 많이 써요. 더 적은 stack을 차지하죠.













check box를 사용하는 모습입니다.
RadioButton도 있는데요 보통 RadioGroup과 같이 사용되요. RadioGroup은 LinearLayout의 자식 클래스로 배치를 담당하는 역할도
같이하죠. check box와 다른점은 라디오 버튼은 소스코드에서 사용할때 하나만 check를 확인하면 된다는 거죠.
 스크롤뷰도 있는데요 예는 view group의 하나일 뿐 레이아웃은 아니에요. 얘는 하나의 자식만을 가질 수 있죠.





 마지막으로 테이블 레이아웃에 대해 이야기 할께요. 그렇게 많이 사용되진 않아요. 테이블 레이아웃은 행을 결정해주는
TableRow와 함께 사용되요. 
 android:layout_span이라는 속성으로 두 컬럼을 하나로 합칠 수 있어요. 그리고 컬럼수가 맞지 않을때는 stretchColumns속성을
이용해서 공간을 채워주죠
 android:layout_column속성으로 몇번째 컬럼부터 채워지도록 할건지 결정할 수도 있어요.

 안드로이드의 리소스는 안드로이드의 패키지(apk)를 제외한 나머지 파일들을 관리하는 애에요. xml도 변환이 되서 들어가죠.
 이런 리소스를 직접 접근하기 위해선 Resuorces클래스를 사용해야 해요.










신고

'T아카데미' 카테고리의 다른 글

사용자인터페이스_02  (0) 2010.07.02
사용자인터페이스_02  (0) 2010.07.01
어플리케이션 구조  (0) 2010.07.01
사용자인터페이스_01  (0) 2010.07.01
안드로이드 개발환경  (0) 2010.06.27
안드로이드 개요  (0) 2010.06.26
Posted by 응큼미소
 이제 실제로 이클립스를 이용해서 안드로이드를 개발해 볼까해요.
 먼저 자사 JDK를 설치해야 해요. 그 다음에 이클립스를 설치해야 하죠. 이클립스를 설치한 후가 중요해요. 바로 안드로이드 개발도구인 ADT를 설치해야 하죠.
 작업공간은 c:\android\workspace폴더에 할꺼에요. Help > Install New Software를 선택합니다. 



 Add 버튼을 클릭하면 Add Site 화면이 나타나요. 이름은 ADT로 하고 위치는 
 https://dl-ssl.google.com/android/eclipse/로 하죠 (안될땐 https에서 s를 빼 보세요)


그럼 Developer Tools항목 나타난거 확인하고 Next해요. 계속 next하다가 하단에 I accpet를 체크하고 [Finish]버튼을 누르죠. 그럼 이클립스가 다시 시작되고 설치 과정이 끝나게 되요. 
 
 이제 안드로이드 SDK를 다운로드 받아 압축을 해제해요. d.android.com 사이트에 들어가면 있어요. 아까 만든 c:\android\ 여기에서 압축풀기를 하면 android-sdk-windows폴더가 생기죠. 이제 이클립스에서 안드로이드 SDK위치를 지정하면 되죠. 
 

 그다음에 SDK플랫폼 패키지를 다운로드 하면 되요.




이제 에뮬레이터 디바이스를 만들어야 되요. 


환경변수에 SDK패스도 넣어줘야 하죠. 


이제 sample소스만 들어있는 프로젝트를 만들어서 각각의 API를 실제로 어떻게 사용하는지 볼꺼에요.


 안드로이드 프로젝트를 선택하고요


existing sample에서 ApiDemos를 선택하죠 

여기서 문제가 생겨버렸네요 -_-;; 윈도우의 사용자 이름이 한글로 되어있어서 에뮬레이터가 가동이 안되어 버렸어요. 이건 중요한 사항인데 제가 깜박해 버렸네요. 이것때문에 ApiDemos도 지워버렸고요. 처음부터 다시 한 다음에 진행하도록 할께요 ;;;

 AVD 라는 에뮬레이터로 어플리케이션을 테스트 해 볼수 있는데요, 
에뮬레이터의 파일 시스템등을 확인해 보기 위해서 >> db shell 을 입력한후 기본적인 리눅스 명령어를 이용해
데이터가 언제 저장이 되는지 등을 확인할 수 있어요.

 어플리케이션을 개발할 때 참고할 수 있는 프로젝트가 있는데요 그게 바로 ApiDemo에요. 여기에는 sample소스만 들어가 있죠.
 각각의 API들을 어떻게 사용하는지 예제가 들어있어요.

 패키지라는게 있는데요 이건 App들을 유일하게 구분할수 있게 해 줘요.
 모든 App는 유일한 패키지 name을 가져야 하죠.

 그리고 App에서 UI를 사용한다면 기본 Activity를 설정해야 하죠. 이건 Run의 Run Configuration에서 설정할 수 있어요.
 
 UI부분을 왜 xml파일로 설정하냐면요 App가 다국어를 지원해야 할 때 유용하게 활용할 수가 있어요.
 String.xml에 문자에 대한 정보가 들어가는데 이 파일을 여러개로 해서 각 언어마다 설정이 달라지게 할 수 있죠.
 그리고 UI를 담당하는 designer는 소스코드를 건드리지 않고 xml만 바꿔줘서 개발자와의 영역을 나누는 데도 유용해요.

 Manifest파일이 있는데요 여기에는 시스템이 이 App에 대해서 알아야 되는 모든 정보가 포함이 되어 있어요. 
 App version도 써줄수 있고요 아이콘, 기본라벨등도 설정해 줄 수 있죠. 
그리고 소스에 있다고 패키지가 구분되는게 아니고 여기에 Pakage가 설정이 되어 있어야지 정말 패키지가 설정이 되는거죠.

 외부에서 다운받은 App들을 에뮬레이터에서 돌려보려면요 콘솔에서 간단한 명령어가 필요해요.
만약 Hangulkeyboard.apk 라는 파일로 된 App를 에뮬레이터에 설치하려면 콘솔에서 
 >> adb install Hangulkeyboard.apk 
라고 명령하면 되죠. 

 이클립스에서 DDMS라는 창이 있는데요 여기서는 App의 쓰레드정보, Heap정보, 실행상태 등을 확인할 수 있죠.
 Logcat이란 것도 있는데요 여기서는 App를 실행하면서 발생하는 모든 Log를 볼 수 있어요.
 Log를 볼때 Log.d(태그, 메세지) 이 함수를 많이 쓰는데요 여기서 태그를 붙이는 이유는 
하나의 App는 하나의 태그를 쓰기 때문이죠.
 DDMS에서 mp3파일같은것도 sdcard에 넣어볼 수가 있어요. File Explorer창에서 복사만 하면 되죠. 근데 저장되는 파일은 꼭 영어로 
되야 하죠.

 디버깅을 위한 도구중에 hierarchyviewer라는게 있는데요 이건 화면구성에 대한걸 계층적으로 표시해 줘요. 이걸 보면 개발하는데 무척 도움이 되죠. 
 Monkey라는 애는 App을 막 사용하는 앤데요 얘가 왜 있냐면
 사용자는 개발자들 생각대로 꼭 사용하는 건 아니에요. 그리고 App는 여러가지 방식으로 사용했을 때 죽지 않아야 하죠. 
 그래서 Monkey라는 놈이 App을 막 눌러보는거에요.
 디버깅할때 step over, step into, step return이 있는데요
 step over는 한칸 넘어가는 거고,
 step into는 메소드 안으로 들어가는 거고,
 step return은 현제 메소드 끝까지 가서 리턴하는 거에요.
 
 하나의 App에는 여러개의 Activity가 존재해요
 근데 안드로이드에는 메인이 없는데요, 안드로이드는 Activity단위로 실행이 되요. 그래서 Activity가 실행이 될때
생명주기에 관한 Callback함수가 호출되기 때문에 메인이 필요없죠.

 UI를 구성해 주는 xml 파일에 대해 알아볼께요. layout이란건 하나의 view가 다른 view를 어떻게 포함할지 설정해주는 거에요.
 LinearLayout은 전체를 다 차지하는 layout이죠. 그리고 xml 파일 안에서 다른 element의 리소스를 사용하려면 @를 붙여주어야 해요.
 그리고 자바코드 안에서 리소스에 접근하려면 R.layout.main 이런식으로 해야하죠. 
 App의 타이틀바는 manifest파일에서 label로 설정해요.
 레이아웃에서 최상위 view는 하나만 들어가요. 원래 xml의 특징중에 root element는 하나이어야 한다는걸 생각하면 쉽게 
이해할 수 있죠. namespace를 지정하는게 최상위 view가 되는 거에요.
 모든 view에 꼭 들어가야 하는 속성으로는 layou_width 와 layout_height가 있죠. veiw의 크기나 넓이를 지정할 수 있는 속성이에요.이거 두개는 꼭 빼먹지 마세요. 여기에 속성값으로 wrap_content를 줄 수가 있는데 이건 필요로 하는 부분만 차지하라는 뜻이죠. 그리고 크기나 넓이를 직접 지정할 때 Pixel은 쓰지 않아요. 안드로이드 App을 개발할 땐 pixel을 쓰면 안되는 데요 다양한 스크린 장치를 표시하기 위해선 사용하지 말아아 해요. 
 res 폴더의 drawable은 왜 hdpi, ldpi, mdpi 이렇게 3개로 나누어져 있을까요?이건 장치의 호환성 문제를 맞추기 위한거에요. 
 장치의 환경마다 다른 이미지 파일을 적용하기 위한 것이죠.
 
 R.java는 소스코드랑 xml파일을 연결시켜주는 애에요. 예를 들어 main.xml 이라는 UI를 나타내는 xml파일이 있다면 R.java에서는 
이 파일이 정수값으로 정의가 되어있죠. 그래서 시스템상에서 이 정수값을 main.xml로 자동으로 연결해 줘요. 그리고 개발자는 
Activity에서 setContentView 함수를 이용해서 화면이 어떻게 구성될 건지를 결정하죠. 
 여기서 잠깐 콜백메소드들의 파라미터로 많이 등장하는 context에 대해서 이야기 하고 지나갈께요. context는 Activity에 대한 인스턴스
에요. 그리고 콜백메소드 중에 onCreate가 있는데요 예는 Activity에서 제일 빨리 실행되는 메소드에요. 
 manifest파일에서 Activity를 설정해 줄때 intent-filter라는 엘리먼트가 있는데요 여기서 action.MAIN라는게 있어요. 예를 이용해서
단독으로 실행될 수 있는 Activity라는걸 표시해 주죠.

 수업이 끝날때 쯤 박성석 대표님께 안타까운 소리를 들었어요. 제가 하고 싶은 프로젝트는 증강현실에 관한건데 증강현실을 하려면 이미지 프로세싱 같은 기술이 필요한데 그런건 전문기업만이 할 수 있는 기술이래요. 그래도 위치기반, 방향센서를 이용해서 따라할 
수는 있다니깐 포기하지 않을 꺼에요.
 
 

 


































 
신고

'T아카데미' 카테고리의 다른 글

사용자인터페이스_02  (0) 2010.07.02
사용자인터페이스_02  (0) 2010.07.01
어플리케이션 구조  (0) 2010.07.01
사용자인터페이스_01  (0) 2010.07.01
안드로이드 개발환경  (0) 2010.06.27
안드로이드 개요  (0) 2010.06.26
Posted by 응큼미소


티스토리 툴바