제 2 회안드로이드세미나 2009 년 12 월 05 일토요일 주최 : 안드로이드사이드서강대게임교육원 후원 : 한국콘텐츠진흥원안드로이드퍼브 협찬 : 케이앤피북스출판사 ITC 출판사제이펍출판사 http://www.androidside.com http://www.soganggame.ac.kr
제 2 회안드로이드세미나 진행 : 한동호 ( 안드로이드사이드운영자 ) 1. 세미나소개 한동호 2. 안드로이드응용프로그램교육과정로드맵 최승관 3. 안드로이드의미래 이학준 4. 안드로이드에서의 OpenGL 최호생 5. 안드로이드앱과마켓 박성서 6. 안드로이드기초실습 김태호 7. 테트리스게임템플릿실습 권욱빈 8. 사용자가본스마트폰, 그리고안드로이드폰의가능성 문형철 9. 자유질문시간
세미나소개 한동호 강사소개한동호 nhn에내부플랫폼교육및큐브리드강의를담당. SCJP, 자바서적등을출간하였으며 Java Programming Language 4 th 등의원서번역. 현재안드로이드에많은관심을가지고있으며안드로이드정보공유커뮤니티인안드로이드사이드를운영하고있음.
안드로이드응용프로그램교육과정로드맵 최승관 강사소개최승관 현재서강대학교게임교육원게임소프트웨어개발학과세종대학교디지털콘텐츠학과 ( 박사수료 ) 호서대학교전자계산학과 ( 석사 ) 호서대학교전자계산학과 ( 학사 ) ( 주 ) 지디온서버프로그래머
Android d Curriculum Android Business Environment Android dodsystem Architecture tectue Android Curriculum
Open Handset Alliance Open Eco-System Open Service Open Network Open Device Open Application 상생과협력의정신으로생태계내의모든구성원들이유기적결합으로시너지를창출하여지속가능한성장을실현 Open Eco-System 어느파트에서개발할것인가? Open Service Open Network Open Application Open Device
Java C / C++ Applications Java Application Framework JNI(Java Native Interface) NDK C / C++ Libraries Linux Kernel Android Runtime Native Developer Kit
Java Applications Application Framework 1 그룹 : 응용프로그램개발중심 - Android Market을타깃으로 2 그룹 : Native Lib 형태의개발 - 게임엔진등의자체프레임워크 3 그룹 : 자체 OS 시스템개발중심 - 제조사 ( 핸드폰, IPTV 등 ) 중심으로 JNI(Java Native Interface) NDK C / C++ Libraries Linux Kernel Android Runtime Native Developer Kit 단지, 자바만배우면? 1 st Term 2 nd Term 3 rd Term 4 th Term Project 10w 4w 10w 4w 10w 4w 10w 26w C & C++ Grammar. Language 6 C & C++ 1 OOP Interface Programming. Multiple Inheritance & Mixin. Design Patterns. Template & STL Basic Windows Programming Concept of OS.(1) File System Programming.(1) Process & Thread System (2)Programming. MMS & Registery Computer Science Platform Linear algebra Vector & Matrix Vector space & transform 공간도형 (line, plane, sphere, box) Basic Dynamics 2 Data Structures Array & Linked List. Stack & Queue. Trees & Graph Hashing. 4 WIN32 1 Algorithms 1 Analysis of Algorithms. Sort Algorithms. Search Algorithms & Etc 1 System Progr.(I) () 1 1 DB Programming. 2 Network Prog. Software Engineering 1 MFC Programming System Progr. (II) Out Door System(Quad Tree) Terrain System. Out Door Items In-Door Systems (BSP, Oct Tree) Portal System. DLL COM Active-X Service Programming 2 Network Engine Prog. Network Programming 2 P2P Network System 3D Programming D3D API Initialization(2) Rendering Pipeline & Mesh Rendering(8) Lighting & Material & Texturing(4) 3D Data Export.(From 3D Studio Max)(4) Animation & Skinning.(6) Particle Programming.(4) Billboard & Transformed Vertex.(2) View-frustum Culling.(2) Collusions(4) Project 1 3DMathematics 1 3D Game Physics 1 6 3D Studio Max 3D API & 3D System Shader Programming & HLSL Skinning with Shader PPL(Per Pixel Lighting) Environment Mapping Light Mapping Normal Mapping Commercial Engine Programming (Render ware, XNA) 1 3D Engine Project 5 3D Game System 1 3D Rendering Tech I 5 3D Engine Prog. 1 3D Rendering Tech II Post Effect( Glow, DOF, and so on) Instancing. Fog & Light Gathering Etc P1 P2 P3 P4 Main Project Basic Software Engineering. Agile Process & XP Refactoring & TDD Network Engine System Thread-safe Programming Pool System Object Management System Executor System Socket Design & Implementation Acceptor System Packet Processing Group System UDP Programming Reliable UDP NAT System P 2P Framework Security of UDP Network Data Communicate Socket Accept /Connect Process Send/Receive process Disconnect Process Overlapped & IOCP 3D Application Framework Resource Management System Builder System Rendering System Scene System UI System Out Door System(Quad Tree) Terrain System. Out Door Items In-Door Systems (BSP, Oct Tree) Portal System. 2D Project Individual Project 3D Project Joint Team Project 3D Engine Project Joint Team Project Main Project Joint Team Project
프로그램교과과정의특징 다양한컴퓨터관련전문지식을수반하는교과과정이요구됨 - 운영체제, 데이터베이스, 이미지프로세스, 네트워크등 단계적프로그래밍스킬향상을위한교과과정이요구됨 - Java(C/C++), 자료구조, 고급 OOP, 디자인패턴등 이론적인학습과자가학습의노력이요구됨 - 숙달된코딩및다양한경험, 컴파일러사용법 ( 디버그 ) 등 Android Course 1 Android Course 2 Project Course 1 Project Course 2 1 Java 1 Advanced OOP Android Project Language 1 Multi-media 2 Android 2 Censors Computer Science 2 Data Structures 3 Algorithms 4 DB Programming. g 3 Network 4 Location Platform 5 System Progr 5 OpenGL(ES) Network Programming 6 Network Progr1. 6 Network Progr2. 3D Programming 1 3DMathematics 2 3D Game Physics Android 필수교과 Android 보조핵심교과 프로젝트에따른선택적분야 3D 프로그래밍을위한핵심교과
Android 필수교과 Java - Android 운영프로그램개발을위한필수교과 Android - Android SDK에서제공하는 API를이용한응용프로그램개발교과 - Activities, Services, Broadcast receivers, Content providers Android 보조핵심교과 컴퓨터관련교과들에대한이해가필요하며, 최소다음과같은교과들이선행혹은병행되어야함 Advanced OOP / Data Structure Algorithm / DB Programming System Programming / Network Programming 3D 게임프로그래밍을위한핵심교과 3D Mathematics - 행렬, 벡터, 삼각함수등 OpenGL(ES) - (3D Graphics) - Mesh, Light, Camera, Rendering Process 등 3D Game Physics - 유연한형태의고급게임프로그래밍을위해서는역학등의물리학은필수 프로젝트교과과정의도입 이론적수업의한계 ( 실무중심의실습적교과의필요성이대두 ) 프로젝트중심의교과과정이등장프로젝트구성및진행에따라학습성취도의차이가두드러짐
차세대게임교육기관지정사업 추진목표 산학체계 게임교육원외교육과정 Vision 실무형중심의전문개발자양성및안드로이드개발환경의저변확대 2010 년 2011 년 2012 년 추진목표 - 안드로이드기반결과물 10개이상개발 - 안드로이드 2D-Game엔진개발 - 안드로이드기반결과물 20개이상개발 - 안드로이드게임교육과정개발 - 안드로이드교육시스템안정화 - 안드로이드상용게임개발 추진전략 안드로이드게임개발을위한교육환경조성 주요항목 안드로이드교육과정표준화 프로젝트중심의교육과정 개발환경저변확대 시행사항 - 안드로이드교육기간내의기초안드로이드교육과정의표준화 - 안드로이드전문개발자들과의교류를통한안드로이드전문교육과정의개발 - 이론적강의를기반으로결과물산출이기본인실무중심의프로젝트교육 - 책임감및동기부여를위한소규모팀구성과프로젝트교육과정개설 - 기존안드로이드커뮤니티와의적극적인교류형성 - 온라인커뮤니티를보완하여오프라인커뮤니티의지원을통한전문인력의교류의장마련 - 실무개발자양성을위한공동세미나및스터디그룹육성
개발자저변확대기술인력지원원프로젝트지참여기관과의협력 Off-line 세미나 강사수급 서강대게임교육원 Android 정규과정 Study Group 심화학습단계전문가배출 게임업체 CJ, 이노디스 환경제공교육생지원공동개발 Online 커뮤니티안드로이드 핵심교육시스템 게임교육원외교육과정 안드로이드오프라인스터디커리큘럼운영 매주토요일정규교육과정외오프라인스터디운영 게임교육원학생및안드로이드관심개발자를대상으로운영 강의식수업을배제한스터디형식의프로젝트중심의교육과정운영 수준별스터디그룹조성을통한유연한교육과정운영 코스오픈시기교육내용정원 1 단계 2009.04 안드로이드응용프로그램개발 15 2 단계 2009.09 안드로이드응용프로그램개발 15 3 단계 2010.02 안드로이드심화프로그램개발 15 안드로이드오프라인세미나운영 오프라인세미나진행을통한안드로이드개발환경의저변확대유도 다양한협의체들과의협력을통해안드로이드개발교육의허브센터역할
기술지인력안드로이드개발환경의저변확대 실무형중심의전문개발자양성 Off-line 세미나 지원강사수급 서강대게임교육원 Android 정규과정 환경제공 Study Group 산학협력업체 공동개발원심화학습단계전문가배출 교육생지원 Online 커뮤니티 프로젝트 Q&A
안드로이드의미래 이학준 강사소개이학준 현재 ( 주 ) 마크애니에서모바일보안솔루션을개발하고있으며 IT 이슈를다루는개인블로그인 " 학주니닷컴http://poem23.com" 을운영하고있음. 모바일솔루션및 UX, 서비스등에많은관심을갖고있으며특히스마트폰플랫폼에대해많은관심을갖고있음.
이학준학주니닷컴 (poem23.com) 운영자 구글이제작, 공개한오픈소스모바일운영체제 스마트폰용운영체제로공개되었으나다양한방면에서응용되고있음 리눅스커널기반의운영체제 자바기반의개발언어를제공이클립스등의공개 IDE를이용한개발환경제공 OHA(Open Handset Alliance) 를중심으로안드로이드확산을시도하는중 애플의앱스토어와같은안드로이드마켓이존재 2007년 11월 : 안드로이드 1.0 발표 2008 년 10 월 : htc 에서첫번째구글폰인 G1 출시 Motorola의 Droid에 Android 2.0이처음으로탑재 스마트폰이외에넷북등의 MID에개량되어탑재되고있음
Motorola의 Droid에최초탑재됨 SonyEricsson 의 Xperia X10 에탑재될예정 안드로이드 20 2.0 의특징 멀티터치지원 블루투스 21 2.1 지원 HTML5 정식지원 화면가상키보드성능향상 카메라지원기능향상 멀티미디어재생기능향상 많은제조사들이아이폰의대항마로안드로이드플랫폼을채택하고있음 가장나중에나온모바일플랫폼 ( 아이폰, 윈도모바일의장점을모두흡수 ) 완성도가높은 UI 솔루션탑재 라이선스에따라하드웨어에맞도록플랫폼커스터마이징이가능 오픈소스로개발에들어가는비용이절감됨 ( 아이폰 OS 는아이폰, 아이팟터치에만적용되고윈도모바일은유료라이선스를채택하고있음 ) 개발환경이접근하기쉬워다양한어플리케이션개발이가 능함 안드로이드마켓이라는오픈마켓이존재함
아이폰과윈도모바일을제치고스마트폰시장을선도할수있는플랫폼으로성장할가능성이매우큼 htc, 모토롤라, 델, 삼성, LG 등다양한제조사들이안드로이드탑재구글폰을출시하기시작함 오픈소스플랫폼의강점과강력한확장성등으로수많은제조사들의물량공세로성장가능성이매우큼 많은전문가들이 2012년이후에는아이폰보다더높은점유율을차지할것이라고예상하고있음 접근하기쉬운개발환경덕분에안드로이드용어플리케이션이안드로이드마켓에등록되기용이함 앱스토어이상의규모로성장할가능성이큼 MS의윈도모바일의점유율이점차적으로감소하는추세 상대적으로안드로이드에대한기대감이올라가고있음 스마트폰이외의다양한방면에서활용시도중 ( 넷북에서는안드로이드가적용된버전이출시되기시작했음 ) 향후다음의분야에서안드로이드가적용될가능성이큼 스마트북 : 오히려넷북보다더가능성이있어보임 ebook 리더 : 전자책표준포멧이외에다양한형식의문서를읽을수있게확장이용이함 PMP, 네비게이션 : 현재 WinCE가대세를이루지만안드로이드로충분히대체가가능함 그이외에, ATM 등의외부임베디드디바이스플랫폼등으로확장
구글이데스크탑디바이스 (PC, 노트북, 넷북등 ) 를대상으로만든웹기반의오픈소스 OS 리눅스커널에구글크롬웹브라우저를탑재한웹 OS 컨셉플랫폼 (MS 의가젤도같은컨셉 ) 웹어플리케이션, 클라우드컴퓨팅기반의솔루션구동을위한플랫폼 안드로이드는모바일기반의소형화디바이스및독립형임베디드디바이스에에적용될가능성이크기에직접적인충돌은적을것이라예상됨 ( 구글크롬 OS가스마트북으로진출할경우에는서로경쟁할가능성이있음 ) 2012년이후에는다양한제조사들의구글폰출시로아이폰, 윈도모바일보다더높은점유율을가져갈것 스마트폰이외에다양한분야에서안드로이드가활용될것이며모바일분야말고도독립형임베디드분야에서도두각을나타낼것 구글크롬 OS 와의경쟁은불가피하지만데스크탑플랫폼인크롬 OS와모바일플랫폼인안드로이드는서로경쟁하며발전할것 내년이후에는국내에서도다양한안드로이드탑재구글폰을구경할수있을것으로예상됨 ( 내년상반기에 htc의 Hero가나온다는소식이있음 )
안드로이드에서의 OpenGL 최호생 강사소개최호생 현재그림소프트대표현재서강대학교게임교육원전임강사한서대학교자문위원예원대학교산업체겸임교수주식회사단다소프트개발이사주식회사놀랑대표이사
안드로이드에서의 OpenGL 서강대학교게임교육원최호생 OpenGL ES 의소개 * OpenGL ES 는데스크탑및워크스테이션에사용되는업계표준의 2D/3D 그래픽 API인 OpenGL의서브셋으로임베디드 (Embedded) 장비를위한간단하고효율적인그래픽 API *OpenGL13 스펙을기준으로개발됨 * OpenGL 1.3 스펙을기준으로개발됨 SIGGRAPH 2003 에서 OpenGL ES(Embedded Systems) 1.0 스펙발표
Embedded System 특정한제품이나솔루션에서주어진작업을수행할수있도록추가로탑재되는시스템 그래픽소프트웨어에대한수요와기회가점점커져가는가운데, 3D 그래픽에대한수요는거의모든영역에서일어나고있다. 특히모바일단말기상에서의 3D 게임을위한하드웨어 IP화가급속히진행되어 2004 년에는상당수의휴대단말기에탑재될것으로전망된다 * 소형화, 경량화 => 저사양현재보다향상된그래픽을요구하는애플리케이션들의기반이되는 Lowlevel 단상의적합한그래픽 API 가부재한상황으로이는마치 Direct3D 나 OpenGL 이없는데스크탑윈도우즈와도같은현실이다. 그렇다고기존의 OpenGL을사용하기에는너무큰사이즈가문제가되며, Direct3D를채용하기에는플랫폼종속적인성격이문제가된다. 이에따라사이즈가작고플랫폼독립적인 Low-level단의그래픽 API의필요성이대두된다. OpenGL ES 의필요성 스크린사이즈반비례의법칙 스크린사이즈가작아질수록보다향상된그래픽처리성능을요구한다. 제한된스크린환경에서가장효율적인픽셀당그래픽처리능력을요구하며, 최신 API 에의해정의된보다진보된그래픽기술을요구한다. 안티알리아싱 (Anti-aliasing), i 다단계 UI 구성 (Multi-level l l compositing), 다양한미디어표시 (Rich media), 3D 등이그예라할수있다. * 일반적인 API 들의무거운비용 * 호환성유지 * 크로스플랫폼을위한 API 에대한요구 현재휴대단말기에는여러개의메이저급모바일및임베디드플랫폼들이존재한다. 따라서이들의다양한플랫폼상에서플랫폼에구애됨이없이어디에서나각종 3D 그래픽및게임등을제공할수있도록해주는표준 3D 그래픽 API가요구되어지고있다
OpenGL ES 의장점 * 산업로열티 free * 적은메모리 & 저전력소비 * 확장성및발전가능성 * 용이한사용성 * 풍부한문서자료 OpenGL ES 의구조 임베디드장비의 3D 구현을목적으로하드웨어위에임베디장비의구현을목적로하웨어위에소프트웨어접근가능한 3 개의층을가짐
OpenGL ES 의구조 OpenGL ES Profile 은 Common Profile 과 Critical Safety Profile로나뉨 OpenGL-ES 의스펙은몇개의프로파일로구성된정의를포함하며, 각프로파일은 OpenGL-ES 에특화된몇몇추가 Extension 이추가된 OpenGL 1.3 의서브셋이다. 프로파일정의는 OpenGL 1.3 스펙과호환되며, 기능성에있어서는향후시장의요구나플랫폼의수용성에따라서추가될수있도록제외되어있다. 현재스펙은 OpenGL 1.3의 Subset으로 OpenGL의장점은유지하고, 모바일환경에요구되는기능만을제공하며, 중복성과고비용을회피하며사용되지않는기능은제거한간소화된 3D 규격인 Common Profile과 Common-Lite Profile 의두가지 Profile 형태를지원한다. Command profile과더작은메모리가할당된플랫폼을위한 Command-Lite profile은 Core Addition과 Extension을통해더많은기능을추가적으로제공할수있도록구성되어있다. - Common Profile : PDA, STB나키오스크같은같은광범위한디바이스에사용 - Common-Lite : 핸드셋과같은최소화된모바일디바이스에사용 Common Profile * 휴대폰, PDA, 게임기와같은가정시장이타겟 * 텍스쳐매핑을포함한최대한의기능지원 * float, short, byte만사용가능
Common Lite * 좀더용량이작은휴대기기에서도사용가능 * floating point로표현되던것을전부 fixed point로변환 Critical Safety Profile * 신뢰성, 보증성이요구되는장비를타겟신뢰성, 증성이구되는장비를타겟 * 쉽게안정성을보장할수있는최소한의 3D 기능 * 항공및자동차디스플레이에사용
OpenGL ES 의발전단계 * 1.0 OpenGL 1.3 기반소프트웨어실행가능에중점 * 1.1(2003) OpenGL 1.5기반 API 의하드웨어가속화지원가능전력소모줄임자동 mipmap, 강화된텍스쳐프로세싱지원 OpenGL 1.3 기반소프트웨어실행가능에중점 * 1.2 & 2.0(2005) 2005년현재스펙나옴 OpenGL ES 1.x 와 2.x 1.x 는고정소수점을사용하는모바일 3D 가속칩을타겟으로발전 2.x 는현재발전하고있는프로그래밍가능한 3D 파이프라인지원
OpenGL ES Roadmap OpenGL ES 의변경점 기본적으로는크게변하지않음. Display list 사용불가 Approximating curve( 근사치커브 ) 와 surface geometry 에관한 pipeline 제거 GLError 지원 GLBegin, GLEnd구조삭제 float, short, byte 자료형만사용가능.
OpenGL ES 의변경점 Transform 은 double 사용하는것만제거 Clipping 사용가능 Coloring 기능다수사용가능 그외기타무겁거나자주쓰이지않는명령어삭제 OpenGL ES 의변경점 Antialiasing 지원 Point 관련명령지원 Line Stipple 삭제, 나머지명령은지원 aliase & antialiased line 지원 Quad Polygon 명령삭제 Quad, Polygon 명령삭제 Triangle 로대체
OpenGL ES 의중요특징 중복된 API 의삭제 OpenGL은많은다른함수들을포함한형태 OpenGL ES 는많은변수들을제거했다 더작은 data type 을지원저장공간과 embedded 장치에서 bandwidth의제한을인식하는 OpenGL ES 는 OpenGL 1.3 에서지원하는것보다더작은 data type을받아들이는여러새로운 API 를정의한다 OpenGL ES 의중요특징 고정소수점연산을지원하는새로운 API * 부동소수점 (Floating Point) 연산 : 일반적으로사용하는가변소수점연산표현범위 * 좀더큰숫자의연산가능 float, double 이해당됨 * 7000 => 0.7e+4, 0.07 => 0.7e-1 * 좀더정확한연산가능 * 소비전력이많다 * 비싸다, 느리다
OpenGL ES 의중요특징 고정소수점연산을지원하는새로운 API * 정수형을이용한소수점연산 7000 => 7000, 0.07 0 => 0.07 0 * FPU 유닛이없는 CPU에적합 * 숫자의크기에한계있음 * 보통 16bit:16bit 의 int형을사용 * 형변환시에오버플로우, 언더플로우, 유효숫자상실에주의 * 소비전력낮음, 저렴함, 조금더빠름 OpenGL ES 의중요특징 Geometry Specification * immediate mode 지원안함 glbegin(gl_triangles); glvertex3f(-2.0, 0.5, 0.0); glvertex3f(0.0, 0 4.0, -2.0); glvertex3f(1.5, 2.5, -0.5); glend(); * vertex array mechanism 만지원 GLfl i [] { 20 05 00 00 40 20 15 25 05} GLfloat vertices[] = {-2.0, 0.5, 0.0, 0.0, 4.0, -2.0, 1.5, 2.5, -0.5}; glvertexpointer(3, GL_FLOAT, 0, vertices); gldrawarrays(gl_triangles, 0, 3);
OpenGL ES 의중요특징 Transformation 변환은근본적인부분이므로제거거의없으나고정소수점파라미터지원 Materials와 Lighting * 빛과관련된대부분의기능은계속유지 * OpenGL에서처럼적어도 8개의빛을지원 * material 는지원되고있으나, polygon 의앞면과뒷면에분리된 material을가지는것은불가능 * Color Material 관련 API 삭제 * glshademodel() 은수정없이유지 OpenGL ES 의중요특징 점, 선, 면 * 점, 선은두께를 1로제한하여지원 * 면은 fill mode에서만렌더링지원 Clippingi 과 Culling 렌더링의필수적인요소로거의지원하나사용자정의 Clip planes 는지원안함 Texturing 어떤기능은완전제거되었고, 모든남은기능은제한을둠 2D texture만지원다중텍스쳐링지원 Image type 종류제한 Filter는모두지원 Compressed Texture 지원
OpenGL ES 의중요특징 Imaging 거의모든이미지화 API가제거됨다른쓸곳이있는 PixelStore명령만유지나머지 pixel 관련명령어는모두삭제 Bitmap 지원안함 DrawPixel명령이없으므로불가 FOG 무겁고타기능으로도구현이가능하지만여러곳에편리하게쓰일수있음. 대부분의기능지원 OpenGL ES 의중요특징 Per Fragment Operations(pixels) Dithering 가능 Read Buffer 삭제 CopyPixels 삭제 ReadPixels는제한적으로사용가능 Special Functions Select & Feedback mode 삭제 Display List 삭제
OpenGL ES 의중요특징 Finish & Flush 화면강제전환에자주쓰이므로포함 Hints speed 와 quality 에대한 trade off 에필요하므로포함 State Query 에대한 state 반환함. 없어진기능에대한 state삭제자주쓰지않는기능에대한 state삭제 EGL (Embedded System Graphic Library) EGL 이란 OpenGL 과기본적인특정플랫폼윈도우시스템사이의인터페이스를함 Microsoft Windows(WGL), UNIX(GLX) 등과같은개념
EGL의역할 * OpenGL ES graphics pipeline 의상태는 EGL 이유지하는 context 에저장 * Frame buffer 와다른 drawing surfaces 는 EGL API 를사용함으로써창조되고, 관리되고, 파괴된다 * device displays 와 device 의가능한 rendering 환경에접근할수있도록조절하고제공 EGL 설정순서 * Get the main native display * Initialize EGL * Choose an EGL configuration * Create an EGL window surface * Create an EGL graphics context
Java 와의연동 *Java 를포함한각언어는 OpenGL ES 언어바인딩존재 * 자바언어바인딩은 JSR(Java Specification Request) 239 에서정의 ( 안드로이드는 JSR 239 1.0.1 구현 ) * 다음사항을 java 소스파일에포함하여개발 Import javax.microedition.khronos.egl.egl10; Import javax.microedition.khronos.egl.egl11; Import javax,microedition.khronos.egl.eglconfig; Import javax,microedition.khronos.egl.eglcontext; Import javax,microedition.khronos.egl.egldisplay; egl Import javax,microedition.khronos.egl.eglsurface; Import javax.microedition.khronos.opengles.gl10; Import android.opengl.glu; 안드로이드에서개발시유의점 * EGL 사용한 OpenGL ES 구동 * 안드로이드 2D 라이브러리사용시화면갱신위해뷰의 OnDraw() 메소드를호출하는것과달리그리는스레드직접구현해야함 * SurfaceView 를 OpenGL 을사용하는모든뷰로확장해서사용 * OpenGL Surface 가생성되면그리기를담당할새로운 Thread시작, Surface가제거지면 Thread 종료 * Material 을안드로이드형식에서 OpenGL 형식으로변환
안드로이드에서개발시유의점 * Camera 수고하셨습니다
안드로이드앱과마켓 박성서 강사소개박성서 안드로이드퍼브 (androidpub) 커뮤니티운영자회색의구글안드로이드개발블로그운영 Google Android Developers Challenge 1 Top 50 입상 Google Android Developers Challenge 2 Top 200
안드로이드기초실습 김태호 강사소개김태호 커니의안드로이드이야기 (androidhuman.tistory.com) 운영중 안드로이드를접한지는얼마되지않았지만, 자료가부족해서안드로이드를처음배울때느꼈던절망감 (?) 을다른사람들이또다시느끼게해서는안된다는각오로블로그에공부한내용들을강좌형식으로정리하여, 더많은사람들에게 " 안드로이드이야기 " 를들려줄수있도록노력하고있습니다
제 2 회안드로이드세미나 _ TRACK B 안드로이드어플리케이션기초실습 2009. 12. 5 김태호 ( 커니의안드로이드이야기 ) Contents Android Fundamentals - 안드로이드어플리케이션의구성요소 - 액티비티의생애주기 (Activity Lifecycle) Exercises - 새프로젝트생성 / 생성파일분석 - Layout 파일을이용한액티비티화면구성 - Java Code를이용한액티비티화면구성 - 새로운액티비티생성하기 - 인텐트를이용하여액티비티호출하기 Android Fundamentals : 안드로이드어플리케이션의구성요소 안드로이드어플리케이션을만들기전에안드로이드어플리케이션은과연어떤구조를가지고있을까? 에대해서알아보도록하겠습니다. 안드로이드어플리케이션이어떤구조를가지고있는지알고있어야만앞으로진행할강좌도무리없이소화할수있고, 무엇보다도처음부터어느정도의기본바탕을잡고공부를하면앞으로배우는것들을이해하는속도도빠르고, 좀더머릿속에체계적으로정리할수있기때문에좀지루한감이있더라도잘읽고이해하도록해주세요. 가능하다면그냥외우세요! 정말중요한겁니다!!
안드로이드어플리케이션의구성요소는다음과같이사용자가직접눈으로보며상호작용을하는컴포넌트 ( 액티비티, 알림 ;Notification) 와사용자의눈으로볼수없거나백그라운드에서실행되는컴포넌트 ( 컨텐트프로바이더, 서비스, 브로드캐스트리시버 ) 로나눌수있습니다. 사실인텐트 (Intent) 와 Notificat ion 은어플리케이션컴포넌트라고할수없지만, 각컴포넌트들과깊은연관을가지고있기에여기에서함께다뤄보도록하겠습니다. 어플리케이션을구성하는컴포넌트는액티비티, 컨텐트프로바이더 (Content Provider), 서비스 (Service), Broadcast Receiver 가있습니다. 어플리케이션은이들컴포넌트중여러컴포넌트로구성되며, 각구성요소를사용하기위해서는각구성요소를호출해야하는데, 이를위해인텐트 (Intent) 를사용합니다. 인텐트도어플리케이션내에포함되는것이아니냐? 할수도있지만, 엄연히따지면 " 인텐트 " 자체는어플리케이션컴포넌트들을호출해주는역할을할뿐, 어플리케이션내에존재한다고보기는어렵습니다. 하지만, 각컴포넌트가호출될수있는조건을담고있는인텐트필터 (Intent-Filter) 는해당각컴포넌트내에존재합니다. 이글에서는어플리케이션의 ' 얼굴 ' 역할을하는액티비티에대해자세히알아보도록하겠습니다. 액티비티 (Activity) 는어플리케이션의 " 한화면 " 을뜻합니다, 전화번호부어플리케이션을예로들자면전화번호부를조회하는화면, 전화번호를새로추가하는화면, 입력된데이터를수정하는화면등등이하나의액티비티가됩니다.
전화번호부조회화면전화부편집화면전화부선택화면 액티비티는어플리케이션컴포넌트중가장중요한역할, 사용자의입력을받고사용자에게그결과를보여주는등실질적으로사용자와상호작용을하는역할을맡고있습니다. 따라서, 액티비티구성은어플리케이션개발에서가장신경써야할부분이기도합니다. 기본적으로안드로이드가휴대용기기에서돌아가는것을목적으로하는플랫폼이다보니, PC 와비교해메모리가부족할수밖에없습니다. 그러다보니, 한번에여러가지의작업을하다가메모리가부족해지면우선순위가낮은작업은메모리를반환하여다른작업을수행할수있도록합니다. 메모리관리를위해액티비티는액티비티생애주기 (Activity Lifecycle) 에따라사용자와상호작용을하지않는액티비티를비활성화시키거나종료시킬수있습니다. 이러한특성때문에액티비티를구성할때각액티비티의상태변화에따라적절한처리를해주는것이중요합니다. 서비스 (Service) 는화면에표시되며사용자와직접상호작용을하는액티비티와는달리, 화면에표시되지않고백그라운드에서실행되는컴포넌트입니다. 앞서언급했듯이, 액티비티는액티비티생애주기에의해사용자와상호작용을하지않는액티비티는비활성화되거나소멸될수있습니다. 예를들면, 음악을재생하는어플리케이션에서음악재생을담당하는부분이액티비티에구현되어있다면액티비티가화면에서없어짐과동시에해당액티비티는더이상사용자와상호작용을하지못하므로액티비티생애주기에따라비활성화상태 (Inactive) 가되므로음악재생이중지됩니다.
음악을재생하는어플리케이션은해당어플리케이션이화면에표시되고있지않을때, 즉사용자와상호작용을하지않고있더라도백그라운드에서계속음악을재생할수있어야합니다. 따라서, 일반적으로음악재생어플리케이션에서음악을재생하는부분은서비스부분에구현하여사용자와상호작용이중단되더라도지속적으로음악을재생할수있게합니다. 컨텐트프로바이더 (Content Provider) 는어플리케이션내의데이터 ( 전화번호부, 메모등..) 를다른어플리케이션과공유할수있도록해줍니다. 어플리케이션내의데이터들은기본적으로해당어플리케이션에서만접근할수있고, 다른어플리케이션은접근할수없습니다. 그래서특정어플리케이션내의데이터 ( 예 : 전화번호부데이터 ) 에다른어플리케이션에서도접근할수있게하려면컨텐트프로바이더를정의하여다른어플리케이션에서해당데이터에접근할수있는범위, 방식등을정의해주어야합니다. 즉, 컨텐트프로바이더가어플리케이션의데이터에접근하는통로가되는셈이죠. 일반적으로컨텐트프로바이더를이용하여데이터를공유할어플리케이션에서공유를하고싶은데이터만을선택하여공유를할수있도록지정하게됩니다. 이과정에서해당컨텐트프로바이더로접근할수있는고유의주소를정의하게되며, 컨텐트리졸버 (Content Resolver) 에이주소를넘겨서공유된데이터에접근할수있습니다.
컨텐트프로바이더는마치싸이월드미니홈피와비슷하다고할수있습니다. 요즘은사진등을올릴때최소일촌공개로사진을올리는경우가많습니다. 물론일촌공개인사진외에자신만볼수있는비공개사진들도있겠구요. 즉, 일촌공개도결국은비공개인사진중일부를볼수있도록공개해주는것이라볼수있습니다. 이와같이컨텐트프로바이더도어플리케이션의데이터에접근할수있는중재자역할을하며, 그범위까지지정해주는역할을수행합니다. 브로드캐스트리시버 (Broadcast Receiver) 는주로시스템의상태에관련된메시지 ( 배터리부족, 언어변경됨등..) 혹은어플리케이션의메시지 ( 파일다운로드완료등..) 에응답하는역할을합니다. 브로드캐스트리시버는해당이벤트가발생하였을경우그를잡아내는능력만있을뿐, 이를사용자에게알릴방법은없습니다. 때문에, 사용자에게해당이벤트를알리기위해알림 (Notification) 혹은토스트 (Toast) 을사용합니다. 알림 (Notification) 은 NotificationManager 를통해상태표시줄및 Notification Panel 을통해알림메시지를띄워주거나, LED 를점멸시키거나, 진동발생혹은벨소리를울리게하여사용자에게해당이벤트를알립니다. 이러한알림 (Notification) 은문문자메시지도착, 다운로드완료등을사용자에게알리는데사용됩니다.
토스트 (Toast) 는 Notification 과달리간단한내용을사용자에게알리기위해사용합니다. 특별한기능없이단지메시지를화면에잠깐띄워주고, 곧사라집니다. 마지막으로, 인텐트 (Intent) 에대해알아보도록하겠습니다. 인텐트 (Intent) 는어플리케이션의컴포넌트, 구체적으로말하자면액티비티, 서비스, 브로드캐스트리시버를호출하거나해당컴포넌트를호출함과동시에필요한데이터를전달해주는역할을합니다. 일종의 " 전달매체 " 라고하면적절하겠네요. 인텐트내부에는대상컴포넌트에대한정보가담겨있습니다. 인텐트는담고있는정보의유형에따라명시적인텐트 (Explicit Intent) 와암시적인텐트 (Explicit Intent) 로나뉩니다. 명시적인텐트 (Explicit Intent) 는호출하거나데이터를전달한컴포넌트가정확히명시되어있는인텐트입니다. 대상컴포넌트가명확할경우컴포넌트의이름을인텐트에넣어주면인텐트에의해해당컴포넌트가호출되거나해당컴포넌트에데이터가전달되게됩니다. 정확한주소가나와있군요!
암시적인텐트 (Implicit Intent) 는호출하거나데이터를전달할컴포넌트를정확히명시하지않고, 대상컴포넌트의특징들만나열한인텐트입니다. 예를들면, 메모를수정하는인텐트에는메모를수정하는기능을가진컴포넌트의이름이아닌 [ 메모를수정할수있는기능 ] 이들어가게됩니다. 목적지의특성이나열되어있군요 -_-^ 이러한암시적인텐트를처리하려면각컴포넌트에해당컴포넌트가처리할수있는작업을명시해주어야호출대상컴포넌트가인텐트를받아호출될수있습니다. 이렇게인텐트를해석하여적절한컴포넌트를찾는과정을인텐트해석 (Intent resolving) 이라합니다. 인텐트해석 (Intent resolving) 에필요한정보는메니페스트파일인 AndroidManifest.xml 의각컴포넌트태그내의인텐트필터 (Intent-filter) 내에명시되며, 이곳에는각컴포넌트가처리할수있는작업의유형뿐만아니라해당컴포넌트에서처리할수있는데이터의유형까지명시되어있습니다. Android Fundamentals : 액티비티생애주기 (Activity Lifecycle) 안드로이드는모바일기기에서구동되는것을목적으로하고있기에 PC 에서구동되는프로그램들에비해더효율적인메모리관리가필요합니다. 안드로이드어플리케이션을구성하는구성요소중하나인액티비티 (Activity) 도효율적인메모리관리를위해액티비티가생성되고소멸되는조건인생애주기 (Lifecycle) 을가지고있습니다. 액티비티뿐만아니라브로드캐스트리시버 (Broadcast Receiver), 서비스 (Service) 도일정한생애주기를갖고있지만, 가장자주쓰이는구성요소인액티비티의생애주기부터알아보도록하겠습니다. 액티비티의상태는크게활성 (Active), 일시정지 (Paused), 정지 (Stopped) 이 3가지로나눌수있으며, 각상태에해당하는생애주기들이존재합니다. 우선, 액티비티의상태에대해알아보도록하겠습니다. 활성 (Active) 현재화면에액티비티가표시되는상태이며, 사용자와상호작용 ( 버튼을누르거나글자를입력하는등..) 을할수있는상태를말합니다. 일반적으로액티비티가화면에표시되고있을때액티비티는활성상태입니다.
액티비티내의 EditText 위젯에텍스트를입력하는등, 사용자와상호작용이가능합니다. 일시정지 (Paused) 화면에서액티비티가보이지만, 사용자와상호작용은할수없는상태입니다. 즉, 배경이투명한액티비티나화면전체를가리지않는다른액티비티에의해액티비티의일부가가려진경우가해당됩니다. 다이얼로그또한액티비티의일부를가리지만, 다이얼로는액티비티의일부이기때문에이때에는일시정지상태로바뀌지않습니다. 다이얼로그가화면을가린경우에는 Paused 상태가되지않습니다. 배경이투명한액티비티가화면을가린경우가려진액티비티는 Paused 상태가됩니다.
정지 (Stopped) 다른액티비티에의해완전히가려진상태입니다. 액티비티 A 가액티비티티 B 를호출해서액티비티 B가화면에표시된경우, 액티비티 A 의모습은화면에서더이상보이지않게되겠지요? 따라서액티비티티 A는정지상태가됩니다. 액티비티의상태는위와같이크게 3 가지로나뉘지만, 안을살펴보면아래와같이 7 개의상태로나눠지게됩니다. 아래의메소드들이호출됨에따라액티비티의상태들이바뀌게되며, 액티비티를구현할때해당메소드를오버라이드한후각상태에따라처리해줄작업을지정해주면됩니다. void oncreate(bundle savedinstancestate) void onstart() void onrestart() void onresume() void onpause() void onstop() void ondestroy()
액티비티생애주기 (Activity Lifecycle) 위메소드들의이름을통해 oncreate, onstart.. 등이메소드들이호출되는조건들을어렴풋이짐작할수있습니다. 하지만어렴풋이아는것만으로는안되겠죠? 액티비티는액티비티의생애주기에따라상태가변하게되는데, 액티비티의상태를변화시키기위해각상태에해당하는메소드가호출됩니다. 따라서, 어플리케이션을작성할때액티비티의생애주기에따라알맞는작업을처리해주기위해각상태에해당하는메소드를오버라이드하여처리할작업을넣어주게됩니다. 예를들면, 데이터베이스를사용하는어플리케이션에서는메인액티비티가실행될때데이터베이스를열고
사용할준비를해야합니다. 그리고, 데이터베이스를사용하는액티비티가소멸될때에는사용하던데이터베이스를닫아줘야합니다. 만약이러한작업을적절히처리해주지않으면데이터베이스를닫아주지않아에러가발생하는등여러가지문제가생길것입니다. 그럼, 액티비티의생애주기내에서액티비티의상태가어떻게변하는지, 어떤메소드가호출되면액티비티의상태가변하게되는지알아보도록합시다. 액티비티의시작액티비티를처음시작하려면, 액티비티를만들어줘야겠지요? 객체를사용하려면객체의생성자를이용하여새로운인스턴스를만들어주듯이, 액티비티또한이러한과정이필요합니다. 액티비티의생성은 oncreate(bundle savedinstancestate) 메소드가호출을통해이루어집니다. 액티비티가생성되니까 oncreate() 메소드가호출되는것은알겠는데, 인자로받는 savedinstancestate 는뭔지잘모르겠다구요? - 요놈은잠시후에설명할테니, 궁금해도조금만참아주세요. ^^; oncreate() 메소드에서는액티비티의 " 초기화 " 를담당하는코드들을처리해줍니다. 액티비티에서는기본적으로각종버튼이나리스트, 체크박스, 입력표시줄 (EditText) 위젯들이배치되어있는레이아웃을구성하므로, 그러한위젯들이사용자와상호작용을할수있도록해주는코드들을담고있어야합니다. 예를들면, 버튼을누르면다른액티비티가뜨게하거나, 아니면입력표시줄 (EditText) 에서받은데이터를처리하는것등이될수있겠죠. oncreate() 메소드를통해액티비티를시작하기위한준비를모두끝마쳤다면, 액티비티를시작해야겠지요? 액티비티의시작은 onstart() 메소드를통해이루어집니다. 하지만, 이상태는완전히액티비티가시작된상태가아니라액티비티가화면에표시되기 " 직전 " 의상태입니다. 이어서 onresume() 메소드가호출되면액티비티가화면에표시되고, 사용자와상호작용을하기직전의상태가됩니다. 액티비티가생성된후바로액티비티를실행하면간단할것같은데, 왜굳이복잡하게 onstart() 와 onresume() 으로나누었을까요? onstart() 와 onresume() 의비교
액티비티생애주기그림을다시보도록하죠. onstart() 와 onresume() 의위치가다른것을볼수있습니다. onstart() 는액티비티가실행되다가다른액티비티가화면에표시되어정지상태가되면서 onstop() 이호출되었다가, 메모리에서사라지기전에다시정지되었던액티비티가호출되어 onrestart() 를거쳐오거나, 혹은메모리가부족하여프로세스가종료되었다가다시액티비티를생성하고, (oncreate() 호출 ) 액티비티를화면에표시하면서 onstart() 를호출하게됩니다. 즉, onstart() 에서는정지 (Stopped) 상태에서액티비티가복귀될때호출된다고할수있습니다. 이는한마디로액티비티가화면에서보이지않다가다시나타나는것을의미합니다. 반면, onresume() 은액티비티가일시정지 (Paused) 상태에서복귀될때호출됩니다. 즉, 이는액티비티가사용자와상호작용을하지못하다가다시상호작용을할수있게되는것을의미합니다. 이렇게, 액티비티가대기상태에있다가복귀되는시점및복귀되는기능이다르기때문에 onstart() 와 onresume() 처럼시작과정이복잡하게나누어져있는것입니다. 액티비티의정지 / 일시정지액티비티가화면에표시되고, 사용자와상호작용을할수있는활성 (Active) 상태에서다른액티비티에의해가려지거나, 화면에서사라지게되면그액티비티는정지 (Stopped) 상태가됩니다. onstop() 메소드가호출되면해당액티비티는정지상태가며, 이곳에서부터액티비티의운명은갈리게됩니다.
일반적으로정지된액티비티는사용자가다시사용할것을대비하여메모리서바로사라지지않고올라가있다가메모리가부족하게되면메모리확보를위해강제로종료되게되죠. 그후, 사용자가다시그액티비티를실행시키게되면다시액티비티를생성한후 (oncreate() ) 액티비티를실행시키게됩니다. 반면에, 메모리부족등이발생하지않아액티비티가대기상태로메모리에올려져있을때다시그액티비티를호출하게되면액티비티를다시만들필요없이다시화면에표시하면 (onrestart()) 되므로, 액티비티를다시시작하기만하면됩니다. 액티비티가일시정지 (Paused) 되는것은액티비티가화면에는표시되고있지만, 사용자와상호작용을하지않아서입니다. 일시정지상태에는이것외에도중요한것이하나더있습니다. 위의생애주기에서도확인할수있듯이, 일시정지상태에서도메모리가부족하면액티비티가종료될수있습니다. 일시정지상태에서는대부분사용자가어떤내용을입력하고있는등, " 어떠한작업이진행중 " 일가능성이높습니다. 그런데, 메모리가부족해액티비티를종료시키게된다면사용자가입력했던데이터들 ( 예 : 작성중이던메시지등..) 이손실됩니다. 이를방지하기위해메모리부족등으로 " 어쩔수없이 " 액티비티를종료해야하는경우 onsaveinsstancestate() 메소드가호출되며액티비티의상태를 Bundle 형태로저장하게됩니다. 따라서, onsavedinstancestate() 메소드는항상호출되지않으며, 만약호출된다면프로세스가종료되기전, onpause() 이후혹은 onstop() 이후에호출될수있습니다. onsaveinstancestate() 메소드를통해저장된상태는 Bundle 객체형태로저장되어있다가, 나중에해당액티비티를다시실행할때 oncreate() 메소드및 onrestoreinstancestate() 메소드에서액티비티가강제로종료될때의상태로액티비티를복원하게됩니다. oncreate() 메소드와 onrestoreinstancestate() 모두 Bundle 객체를인자로받고있으며, 실제로액티비티가강제종료될때저장된상태정보가담겨있는 Bundle 객체의정보를동일하게전달받게됩니다. 따라서액티비티상태의복구는두메소드모두에서처리해줄수있으며, 상황에따라적합한메소드에서상태를복원해주는코드를넣어주면됩니다. onrestoreinstancestate() 메소드역시항상호출되는메소드는아니며, 호출된다면 oncreate() 메소드이후에호출되게됩니다. 즉, 위의두메소드는액티비티가 " 강제로 " 종료되었을때혹은그후액티비티를다시실행시킬때만실행되므로, 만약액티비티가시작하고나종료될때해주어야할작업이있다면저두메소드를오버라이드하는대신 oncreate(), onstop() 및 ondestroy() 메소드를오버라이드한후그안에코드를구현해야안정적으로해당작업을처리해줄수있습니다. 아래에액티비티생애주기를구성하는주요메소드의역할을간단히정리해보았습니다.
Exercises : 새안드로이드프로젝트생성 안드로이드 SDK 도설치하고, 이클립스도설치하고,ADT 까지다설치했다면? -> 이제본격적으로개발에들어가는것만남았겠죠? 이글에서는최근출시된안드로이드 SDK 2.0 과이클립스용안드로이드개발플러그인인 ADT 0.9.3 버전을기준으로하여새로운프로젝트를만드는과정에대해알아보도록하겠습니다. 자, 우선새로운프로젝트를생성하려면... 이클립스부터켜야겠지요? (...) 이클립스를켠후, New Android Project 버튼을누릅니다.
새로운프로젝트를생성하는창이나오면, 내용들을하나하나씩 (?) 입력해주면됩니다. 그리어려운내용이아니니... 하나하나보도록하죠. Project Name : 이름그대로프로젝트이름을입력해주시면됩니다. Build Target : 해당프로젝트에서사용할 SDK 의버전을지정합니다. 좀더정확히말하면 AVD(Android Virtual Device) 의버전을선택하는것입니다. Android 1.5/1.6 은해당버전의시스템이미지를의미하고, Google APIs 는해당버전의시스템이미지에 Google maps 가포함되어있음을뜻합니다. Application name : 어플리케이션이름을지정합니다. Package name : 패키지명을지정합니다. 패키지명을짓는원리에대해서는 2009/01/12 - [ 프로그래밍이야기 / 끄적끄적 ] - 자바 패키지이름을짓는원리?? 를참고하세요.
Create Activity : 체크표시를한후, 액티비티명을입력하면프로젝트생성과동시에액티비티가만들어집니다. Min SDK Version : 프로젝트의최소 SDK 요구버전입니다. SDK 의업데이트가계속되고있으므로, 최신기술을사용하는경우구버전의시스템이미지에서는정상적으로동작을보장하지않기에이곳에최소버전을명시하여야합니다. 이정보는 Target 을설정하게되면자동으로입력됩니다. 모든정보를입력한후, Finish 버튼을누르면프로젝트가생성됩니다. 프로젝트생성과동시에같이생성된파일들은다음과같습니다. 위에서생성된파일들을크게구분한다면소스파일과리소스파일로구분할수있습니다. 소스파일은우리가실제로어플리케이션에서행해야할동작들을명시하게되고, 리소스파일들은여러가지데이터 ( 그림, 음악, 레이아웃, 문자열등등...) 의데이터를가지고있습니다. 하나의어플리케이션을만드려면이두가지가적절히조합되어야하죠.
Exercises : 프로젝트생성파일분석 새프로젝트를생성하게되면, 위와같은폴더와파일들이생성됩니다. 폴더는 src, gen, assets, res 로나누어지고, 그외에어플리케이션에대한전반적인정보를담고있는 AndroidManifest.xml 파일및안드로이드라이브러리를볼수있습니다. 안드로이드어플리케이션을이론적관점에서보면액티비티, 서비스, 컨텐트프로바이더, Broadcast Receiver 로나눠지지만, 실제개발환경관점에서보면크게 [( 자바 ) 소스코드 ], [ 리소스 ], [ 메니페스트 ] 로나눌수있습니다. 개발환경관점에서본안드로이드어플리케이션의구조
위의그림에서는리소스에 drawable, layout, values, assets 만표시하였지만, 실제로안드로이드어플리케이션에서사용할수있는리소스의종류는이보다더많습니다. SDK 폴더의예제에포함된안에있는 ApiDemos 어플리케이션의리소스구조만봐도알수있죠. 엄청복잡합니다. -ㅁ-... 한눈에봐도복잡하기만한 ApiDemos 의폴더구조.. 폴더들을보면, values, drawable 폴더도있지만 values-large 나 drawable-hdpi 등다소수상한 (?) 제목을가지고있는폴더들도보이는군요. 이러한폴더들은단말의환경 ( 고해상도액정, 저해상도액정, 단말로케일등등..) 에따라다른리소스를사용하기위해각환경에맞는리소스들을별도로가지고있는것들입니다. 리소스에대한자세한설명은추후에하기로하고, 일단은새로만든프로젝트에서생성한파일들에대해알아보도록하겠습니다. 소스코드 (/src, /gen) 1. 어플리케이션컴포넌트 / 기타클래스의소스코드 (/src) 일반소스코드는액티비티, 서비스, 컨텐트프로바이더혹은기타어플리케이션구성에필요한클래스들의
소스파일들로구성되어있습니다. 새프로젝트를생성한경우, 일반적으로자동으로생성된액티비티의소스코드가포함되죠. 우리가만든 HelloAndroid 프로젝트를보면, 자동으로생성된액티비티의소스코드인 HelloAndroid.java 가있는것을확인할수있습니다. HelloAndroid 액티비티의소스코드가담긴 HelloAndroid.java 파일 2. 자동생성파일 (/gen) 안드로이드어플리케이션은소스코드뿐만아니라레이아웃, 그림, 문자열등여러가지리소스들로구성됩니다. 소스코드를작성하다보면레이아웃파일에정의된위젯 ( 예 : TextView 등..) 에접근하여작업을수행 ( 예 : 표시될텍스트내용을변경 ) 하는등리소스에접근해야하는경우가생깁니다. 소스코드에서리소스파일에접근하기위해이클립스 ADT 플러그인에서는리소스에변동이있을때마다리소스의주소를업데이트하여 R.java 파일에기록해줍니다. 이러한과정은리소스가추가 / 삭제되거나변경된후해당리소스가 " 저장 " 될때이루어지게됩니다. 주의할것은, 이러한과정은모두자동으로이루어지며, R.java 파일에는리소스들의주소가담겨있으므로 R.java 파일의내용을임의로변경해서는안됩니다. R.java 파일의내부모습
리소스 (/drawable, /layout, /values) 1. 그려질수있는객체 (/drawable) 이폴더에는어플리케이션에서사용할그림파일등을보관합니다. jpg, png 등의파일형식을지원합니다. 우리가위에서만든 HelloAndroid 프로젝트에는어플리케이션의아이콘인 icon.png 만들어가있습니다. 리소스를추가시키게되면해당파일의이름을리소스명으로등록하게되는데, 리소스이름으로소문자및일부한정된특수문자만지원하기에그림파일이름은모두소문자및일부한정된특수문자로만이루어져야 ([a-z0-9_.]) 합니다. 이는비단그림파일에만해당되는것이아니라, 리소스전체 ( 레이아웃등 ) 에해당됩니다, 2. 레이아웃 (/layout) 어플리케이션의화면을구성하는레이아웃파일들을포함하고있습니다. HelloAndroid 프로젝트에는 HelloAndroid 액티비티의레이아웃인 main.xml 파일이있는것을확인할수있습니다. 이클립스 ADT((Android Development Tools) 를통해레이아웃파일이화면에어떻게표시되는지볼수도있으며, Outline 및속성창을이용하여레이아웃을쉽게구성할수도있습니다. 아래는 main.xml 레이아웃파일을 ADT 를통해열어본모습입니다. 안드로이드 SDK 가 2.0 으로업데이트됨에따라, ADT 의버전도 0.9.4 로업데이트면서레이아웃에디터의모습이조금달라졌습니다. 기존의잡다한옵션들 ( 사실어떻게쓰는지도잘모르겠...) 은싹사라지고, 각장치및환경에해당레이아웃이적용된모습을미리볼수있도록바뀌었습니다. 현재는 ADP1 (Android Dev Phone 1) 과 Ion (HTC Magic) 만있습니다. ADT 0.9.4 의레이아웃에디터
레이아웃의구조가표시되는 Outline 창 각객체의속성을표시해주는 Properties 창 안드로이드레이아웃에디터ㅜ래부분의탭의 [Layout] 탭을클릭하면레이아웃미리보기를, [main.xml] 탭을클릭하면해당레이아웃의코드를볼수있습니다.
main.xml 탭을클릭하면나오는코드편집창 3. 기타여러가지값들 (/values) values 폴더에는문자열, 배열등기타어플리케이션에서사용하는여러가지값들이보관됩니다. HelloAndroid 프로젝트에는문자열을저장하는파일인 strings.xml 파일만있는것을확인할수있습니다. strings.xml 파일을열어보면아래와같이현재리소스에등록되어있는문자열과함께문자열들을추가하거나삭제할수있는화면이표시됩니다.
또한, 레이아웃과마찬가지로아래의 strings.xml 탭을선택하면직접 XML 코드를작성할수있는화면이표시됩니다. 리소스폴더에구체적으로어떤파일들이저장되는지자세한내용이궁금하신분은여기를참조하세요. 4. 메니페스트파일 (AndroidManifest.xml) 메니페스트파일인 AndroidManifest.xml 파일은각어플리케이션에필수로있어야하는파일입니다. 이파일은어플리케이션의이름, 버전부터시작하여사용권한, 컴포넌트정의등어플리케이션의뼈대를구성하는정보를포함하고있습니다.
Exercises: Layout 파일을이용한액티비티화면구성 [HelloAndroid.java] 01.import android.app.activity; 02.import android.os.bundle; 03. 04.public class HelloAndroid extends Activity { 05./** Called when the activity is first created. */ 06.@Override 07.public void oncreate(bundle savedinstancestate) { 08.super.onCreate(savedInstanceState); 09.setContentView(R.layout.main); 10.} 11.} 위의코드는 HelloAndroid 프로젝트를만들면서기본으로만들어진코드입니다. 위의코드를실행하면아래와같은화면이표시되게됩니다. 어떻게해서위와같은화면이나오는지아직은어리둥절할지도모릅니다. 하지만그리어렵지않으니, 한줄한줄차근차근알아가보도록하죠.
1.public class HelloAndroid extends Activity HelloAndroid 클래스가 Activity 클래스를상속하는것을볼수있습니다. 새프로젝트를만들게되면기본적으로액티비티가하나생성되게되는데, 그액티비티가여기에서는 HelloAndroid 입니다. 따라서, HelloAndroid 클래스는 Activity 클래스를상속받게됩니다. 1.@Override 2.public void oncreate(bundle savedinstancestate) { 3.super.onCreate(savedInstanceState); 4.setContentView(R.layout.simplelayout); 5.} Activity 클래스내의메소드중하나인 oncreate() 메소드를오버라이드합니다. 2009/09/18 - 액티비티의생애주기 (Lifecycle) 에서다뤘듯이, oncreate() 메소드가호출되면서액티비티를생성하게됩니다. 따라서, 이곳에서 Hello, Android 액티비티의초기화작업, 텍스트를화면에표시해주는작업을수행해주어야합니다. 액티비티클래스의 oncreate() 메소드를오버라이드하여기본적인 oncreate() 에서하는일외에우리가하고자하는일을추가하는것이기때문에, 상위클래스의 oncreate() 메소드를호출 (super.oncreate(savedinstancestate)) 하여상위클래스의메소드내에정의된작업을먼저수행하게됩니다. 상위클래스메소드의호출이끝난후에, setcontentview() 메소드를사용한것을볼수있습니다. 이메소드는리소스 ( 레이아웃파일 ) 를이용하여액티비티의화면을구성할때필수적인메소드이며, 인자로레이아웃리소스혹은 View 객체를받을수있습니다. 이메소드에서는인자로받은레이아웃혹은 View 객체를액티비티의화면에표시해주는역할을수행합니다. View( 뷰 ) (android.view.view) 뷰는액티비티, 즉화면을구성하는기본단위입니다. 텍스트를표시하는 TextView, 이미지를표시하는 ImageView, 리스트를표시하는 ListView 등특정데이터를화면에표시해주는객체, Button, RadioButton 등사용자의동작에반응할수있는객체, LinearLayout, RelativeLayout 등각자가포함하고있는 View 객체들이어떻게표시할지를결정해주는레이아웃객체들로구성됩니다. 위에서는액티비티의화면에레이아웃파일을표시하도록하고있으며, 소스코드내에서레이아웃파일에접근하기위해리소스들의주소가담긴 R 클래스 (R.java) 를이용하는것을볼수있습니다.
각리소스를참조할수있는주소들이담겨있다. 그럼, 이제액티비티의화면을구성하게될 main.xml 레이아웃파일이어떻게구성되어있는지보도록하겠습니다. 01.<?xml version="1.0" encoding="utf-8"?> 02.<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 03.android:orientation="vertical" 04.android:layout_width="fill_parent" 05.android:layout_height="fill_parent" 06.> 07.<TextView 08.android:layout_width="fill_parent" 09.android:layout_height="wrap_content" 10.android:text="@string/hello" 11./> 12.</LinearLayout> 레이아웃파일의구조를보면, LinearLayout 이 TextView 를감싸는구조를하고있음을볼수있으며, 이는 LinearLayout 이포함하는다른 View 들이어떻게화면에배치될지를담당하기때문입니다. LinearLayout 의속성중하나, orientation 에따라레이아웃내부의 View 수평혹은수직으로배치하며, LinearLayout 외에도포함하는 View 들간의위치관계들을정의한후, 그에따라각객체들을표시해주는 RelativeLayout, 레이아웃의왼쪽위를기준으로포개듯이객체들을배치해주는 FrameLayout 등여러레이아웃이존재합니다. layout_height 및 layout_width 속성은 LinearLayout 뿐만아니라 TextView 에도있는속성으로, 액티비티화면내에서표시될뷰의너비및높이를지정해줍니다. fill_parent 속성은화면에꽉차게끔 View 를배치하고, wrap_content 속성은각 View 를그리는데필요한만큼만그 View 가화면을차지함을뜻합니다. 여기에서유의해야할것은 fill_parent 는해당 View 가
속하는 View, 즉여기에서 TextView 의경우 View 들을담고있는 View(LinearLayout) 이화면에서차지하는만큼화면을차지할수있습니다. 아래에서 TextView 의 layout_height 가 fill_parent 일때, LinearLayout 의높이 (layout_height) 에따라 TextView 가차지하는영역이달라지는것을볼수있습니다. <LinearLayout android:layout_height = "fill_parent"... <LinearLayout android:layout_height = "wrap_content"... TextView 는텍스트를표시하기위해 text 속성을통해화면에표시할텍스트를지정합니다. 이곳에화면에표시할텍스트를직접넣어줄수도있고, 리소스에저장된문자열의주소를넣어리소스에저장된값을표시하도록할수도있습니다. 위의코드에서는이름이 hello 인문자열의값을참조하는모습을볼수있습니다. 소스코드에서리소스파일을참조할수있는것처럼, 리소스파일에서도다른리소스파일의값을참조하도록할수있습니다. 리소스내에서다른리소스의값을참고하기위해, @[ 리소스종류 ]/[ 리소스이름 ] 형식의주소를사용합니다.
Exercises : Java Code 를이용한액티비티화면구성 안드로이드액티비티의화면구성방법은크게두가지가있습니다. 하나는앞에서알아보았던것처럼레이아웃을이용하여화면을구성하는방법이고, 다른하나는이번글에서살펴볼자바코드를통해화면을구성하는방법입니다. 일반적으로정적인레이아웃을구성할때는레이아웃파일을이용하고, 동적인레이아웃을구성할경우자바코드를통해레이아웃을구성하게되며이두가지방법을모두사용하여레이아웃을구성하는것또한가능합니다. ( 기본레이아웃을구성한후, 사용자의동작에따라 View 들을추가해주는등의레이아웃 ) 이번글에서는자바코드만을이용하여저번강좌의 Hello, Android 와동일한화면을구성하는방법에대해알아보도록하겠습니다. 아래는저번강좌에서사용했던레이아웃파일입니다. 01.<?xml version="1.0" encoding="utf-8"?> 02.<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 03.android:orientation="vertical" 04.android:layout_width="fill_parent" 05.android:layout_height="fill_parent" 06.> 07.<TextView 08.android:layout_width="fill_parent" 09.android:layout_height="wrap_content" 10.android:text="@string/hello" 11./> 12.</LinearLayout> Hello, Android 의레이아웃은 LinearLayout 을바탕으로하고있으며, 그안에텍스트를표시해주는뷰인 TextView 가들어가있습니다. TextView 를감싸고있는 LinearLayout 의너비 (layout_width) 및높이 (layout_height) 는각각 fill_parent, 즉화면을꽉채우게설정되어있습니다. fill_parent 속성은해당뷰를포함하는부모객체가가진너비혹은높이만큼의크기를가진다는것인데, 여기에서 LinearLayout 은그자체가최상위객체, 루트 (root) 객체이므로액티비티의화면을꽉채우게됩니다. 한번, 화면에표시되는레이아웃이어떤구조를가지고있는지알아보도록하겠습니다. [SDK 설치경로 ]/tools 폴더의 Hierarchy Viewer 를실행시켜보면, 액티비티의레이아웃이어떤구조를가지고있는지더잘알수있습니다. HelloAndroid 어플리케이션이실행된상태에서 Hierarchy Viewer 를실행시킨후, Load View Hierarchy 버튼을누르면아래와같이현재화면의 View 에대한정보들이표시됩니다.
아래는 Hello, Android 의뷰구조입니다. Hierarchy Viewer 의모습
우리가생각했던구조는 LinearLayout 이 TextView 를감싸고있는구조였는데, 생각보다복잡해보이는군요. 이는화면에표시되는모든 View 의구조가다표시되었기때문입니다. 별로어렵지않으니하나하나씩보도록합시다. 우선, 가장상위에위치한개체, 루트개체인 PhoneWindow$DecorView 는상태표시줄을제외한실질적으로액티비티화면이표시되는모든영역을뜻합니다. 이는크게타이틀바 ( 액티비티이름이표시되는영역 ) 과실제액티비티의내용들이표시되는영역으로나뉩니다.
루트객체의바로아래에는타이틀바와컨텐트영역을포함하는 LinearLayout 이있습니다. 각영역은 FrameLayout 을바탕으로구성됩니다. FrameLayout 은레이아웃이포함하는뷰들을왼쪽가장윗쪽을기준으로차곡차곡쌓아주는형식으로배치합니다. 이러한각영역안에실질적으로타이틀바에표시되는텍스트및액티비티화면에표시될레이아웃객체들이들어가게됩니다.
id 가 content 인 FrameLayout, 즉컨텐트영역의하위에우리가작성했던 LinearLayout 및 TextView가있는것을볼수있습니다. 이처럼, 간단해보이는화면도사실은이렇게여러구조를가지고있습니다. fill_parent 속성이부모객체의크기만큼의크기를갖는것이니, 여기에서는 LinearLayout 의부모객체, FrameLayout 의크기만큼의크기를갖고이 FrameLayout 은화면에서가로세로로타이틀바및상태표시줄을제외한모든화면을차지하도록되어있으므로이 FrameLayout 하위의객체들은최대이레이아웃의크기만큼을차지할수있게됩니다. 이제자바실제코드를통해레이아웃을구성해보도록하겠습니다. 우선, 아래의코드에서부터시작합니다. 1.public class HelloAndroid extends Activity { 2./** Called when the activity is first created. */ 3.@Override 4.public void oncreate(bundle savedinstancestate) { 5.super.onCreate(savedInstanceState); 6. 7.} 8.} 우리가구성할화면은 LinearLayout 내부에 TextView 가들어가있는구조이므로, 우선 LinearLayout 객체를생성해주도록합시다. 1.LinearLayout root = new LinearLayout(this);
그다음은 LinearLayout 이어떻게화면에표시될것인지를지정해주어야합니다. 이러한속성을지정해주기위해 LinearLayout 클래스내의내부클래스인 LayoutParams 객체를사용하여 LinearLayout 의어떻게화면에표시될지그속성을담고있는객체를생성합니다. 1.LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( 2.ViewGroup.LayoutParams.FILL_PARENT, 3.ViewGroup.LayoutParams.FILL_PARENT, 4.0.0F); [API] public LinearLayout.LayoutParams (int width, int height, float weight) 주어진너비, 높이및 weight 를갖는새레이아웃속성을생성합니다. LinearLayout 이컨텐트영역에꽉차게나오도록 width 및 height 에모두 fill_parent 속성을지정해줍니다. weight 는화면에여러뷰들이표시될때해당 View 가화면에서차지하는비율로, 여기에서는사용하지않으므로 0 을넣어줍니다. 1.root.setLayoutParams(params); 2.root.setOrientation(LinearLayout.VERTICAL); 다음으로, LinearLayout 의레이아웃속성으로우리가만든앞서만들어준속성을사용하기위해 setlayoutparams() 메소드의인자로우리가만들어준레이아웃속성 ( 객체 ) 을넣어줍니다. 그리고, LinearLayout 에서 View 를표시할방향을지정하기위해 setorientation() 메소드를사용합니다. 여기에서는 Vertical, 레이아웃내의 View 들을수직으로 ( 위-> 아래 ) 표시하도록하였습니다. 이제는 TextView 를 LinearLayout 에추가할차례입니다. TextView 객체를생성한후, settext() 를통해 TextView 에표시될문자열을지정합니다. 여기에서는리소스에저장되어있는문자열을불러왔습니다. 그다음, LinearLayout 과마찬가지로 TextView 의레이아웃속성을지정합니다. 1.TextView tv = new TextView(this); 2.tv.setText(R.string.hello); 3.LinearLayout.LayoutParams tvparams = new LinearLayout.LayoutParams( 4.ViewGroup.LayoutParams.WRAP_CONTENT, 5.ViewGroup.LayoutParams.WRAP_CONTENT, 6.0.0F); 7.tv.setLayoutParams(tvParams); TextView 객체의설정이완료되었으므로, 이 TextView 를 LinearLayout 에추가시켜줍니다. 그후, LinearLayout 을액티비티의화면으로표시하도록설정합니다. 1.root.addView(tv); 2.setContentView(root); 완성된코드는아래와같습니다.
01.package com.androidhuman.helloandroid; 02. 03.import android.app.activity; 04.import android.os.bundle; 05.import android.view.viewgroup; 06.import android.widget.linearlayout; 07.import android.widget.textview; 08. 09.public class HelloAndroid extends Activity { 10./** Called when the activity is first created. */ 11.@Override 12.public void oncreate(bundle savedinstancestate) { 13.super.onCreate(savedInstanceState); 14.LinearLayout root = new LinearLayout(this); 15.LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( 16.ViewGroup.LayoutParams.FILL_PARENT, 17.ViewGroup.LayoutParams.FILL_PARENT, 18.0.0F); 19. 20.root.setLayoutParams(params); 21.root.setOrientation(LinearLayout.VERTICAL); 22. 23.TextView tv = new TextView(this); 24.tv.setText(R.string.hello); 25.LinearLayout.LayoutParams tvparams = new LinearLayout.LayoutParams( 26.ViewGroup.LayoutParams.WRAP_CONTENT, 27.ViewGroup.LayoutParams.WRAP_CONTENT, 28.0.0F); 29.tv.setLayoutParams(tvParams); 30. 31.root.addView(tv); 32. 33.setContentView(root); 34.} 35.} 이코드를실행시키면우리가저번에레이아웃파일을통해구성했던화면과동일한화면이표시되게됩니다. 여기까지자바코드를통해액티비티의화면을구성하는것에대해알아보았습니다. 사실, 레이아웃을구성할때자바코드를통해구성하는것보다는레이아웃파일을이용하여구성하는것이일반적으로더효율적입니다. 하지만, 동적으로화면을구성하는경우 ( 사용자의입력에반응하여 View 에요소들이추가되어야한다는둥...) 자바코드를이용하여레이아웃을구성해야합니다. 이러한특성때문에보통기본바탕이되는레이아웃은레이아웃파일을통해, 그이후는자바코드를통해레이아웃을구성하게됩니다. 따라서레이아웃파일을이용하는방법과자바코드를이용하여레이아웃을구성하는방법모두꼭알고있어야합니다.
Exercises : 새로운액티비티생성하기 액티비티를추가해주기위해서는아래의두가지작업을수행해주어야합니다. - 메니페스트파일 (AndroidManifest.xml) 에액티비티등록하기 - 액티비티소스코드만들기 1. 메니페스트파일에액티비티등록하기 안드로이드에서액티비티를호출하기위해서는먼저메니페스트파일에액티비티가등록되어있어야합니다. 메니페스트파일에액티비티를등록해주기위해, 먼저메니페스트파일 (AndroidManifest.xml) 파일을연후, Application 탭을클릭합니다. 이클립스 ADT 로열어본 AndroidManifest.xml 여러가지속성을설정할수있는화면들과함께어플리케이션의여러구성요소들을등록할수있는 Application Nodes 화면이화면좌측하단에있습니다. 이곳에서액티비티뿐만아니라다른액티비티구성요소 ( 서비스, 컨텐트프로바이더등 ) 도추가해줄수있습니다. 액티비티를추가하기위해 Application Nodes 부분의 Add... 버튼을클릭합니다.
Add.. 화면을클릭하면다음과같은대화상자가나타나는데, 이곳에서 "Activity" 를클릭합니다. "OK" 버튼을클릭한후, 추가된 Activity 를선택한후오른쪽의 Attributes 화면을보면다음과같은화면이보일것입니다.
2. 액티비티소스코드만들기 메니페스트파일에액티비티를선언하였으니, 이액티비티의실질적인동작을구현할자바소스코드를만들어야합니다. 파란색으로되어있는 Name* 을클릭하여새클래스를만들어줍시다. 위와같은대화상자가뜨게될것입니다. 다른것은특별히건드릴필요가없고, 클래스의이름 ( 일반적으로액티비티의이름과동일하게설정합니다 ) 을입력합니다. 이름을입력했으면, Finish 버튼을누릅시다.
Finish 버튼을누르면, 다음과같이새로운코드파일이생성이됩니다. 처음프로젝트를만들때와동일하게 oncreate() 메소드까지추가되어있습니다. :) 단, 액티티의화면을표시해주는메소드인 setcontentview() 메소드가추가되어있지않으므로, 이상태로이액티비티를호출하면화면에는아무것도표시되지않게됩니다. 여기까지하셨다면, 호출대상을명확히지정하는명시적인텐트 (Explicit Intent) 를이용하여이액티비티를호출할수있습니다. 하지만, 인텐트필터를정의하지않았기에암시적인텐트 (Implicit Intent) 를통해호출될수는없습니다.
Exercises : 인텐트를이용하여액티비티호출하기 강좌를따라오기전에, 준비해야할것들은다음과같습니다. - 새로운프로젝트 - 두개의소스코드및레이아웃코드 ( 액티비티를두개만들어야하니, 당연히두개필요하겠죠??) 이번강좌에서예제로만드는어플리케이션의구성은다음과같습니다. * 첫번째액티비티 (IntentExample) 에서버튼을누르면두번째액티비티가호출됨 * 두번째액티비티 (Activity2) 에서종료버튼을누르면두번째액티비티가종료됨 우선, 첫번째액티비티의레이아웃코드와소스코드를보겠습니다. [ 레이아웃 ] 01.<Linearlayout xmlns:android="http://schemas.android.com/apk/res/android" 02.android:orientation="vertical" 03.android:layout_width="fill_parent" 04.android:layout_height="fill_parent"> 05.<Textview android:layout_width="fill_parent" 06.android:layout_height="wrap_content" 07.android:text=" 첫번째액티비티화면입니다."/> 08.<Button android:layout_width="fill_parent" 09.android:layout_height="wrap_content" 10.android:text=" 두번째액티비티호출 " 11.android:id="@+id/launchActivity"></Button> 12.</Linearlayout> [ 소스 ] 01.package com.androidhuman.intentexample; 02.import android.app.activity; 03.import android.content.intent; // 인텐트사용위해 import 합니다. 04.import android.os.bundle; 05.import android.view.view; 06.import android.widget.button; 07. 08.public class IntentExample extends Activity { 09./** Called when the activity is first created. */ 10.@Override 11.public void oncreate(bundle savedinstancestate) { 12.super.onCreate(savedInstanceState); 13.setContentView(R.layout.main); 14.Button launch = (Button)findViewById(R.id.launchActivity); 15.launch.setOnClickListener(new Button.OnClickListener(){ 16.public void onclick(view v) { 17.// TODO Auto-generated method stub 18.Intent intent = new Intent(IntentExample.this, Activity2.class); // 두번째액티비티를실행하기위한인텐트 19.startActivity(intent); // 두번째액티비티를실행합니다. 20.} 21.}); 22.} 23.}
다른것들은대부분앞에서다루었던것들이고, 생소한것은단연인텐트 (Intent) 일것입니다. 인텐트에관한것을설명하자면엄청길어지지만, 항상그래왔던것처럼 (!) 하나하나씩다루어보도록하겠습니다. 이번예제에서사용한인텐트의생성자는 " 다른액티비티를호출할때 " 사용하는생성자입니다. 참고로인텐트를사용하여다른네이티브액티비티 ( 전화번호입력기, 주소록, 브라우저등..) 도호출할수있습니다. 하지만일단그런것은나중에다루도록하고, 이번강좌에서는사용자액티비티를호출하는것에대해다루도록하겠습니다. 그럼, 생성자의원형을분석해보도록합시다. public Intent(Context packagecontext, Class<?>cls) * packagecontext : 한마디로말하면호출하는액티비티를뜻합니다. 여기에서는 IntentExample 이되겠습니다.(IntentExample.this) *cls : 호출할클래스를뜻합니다. 여기에서는 Activity2 액티비티를호출해야하므로, Activity2 의클래스인 Activity2.class 를입력합니다. 이렇게인텐트설정이끝났으면, 인텐트를실행해야겠지요? 사실, 인텐트자체를생성함으로써인텐트가실행되는것이아니라, 인텐트는하나의 " 실행하는방법 " 만을담고있고, 실제로그일을수행하는것은 startactivity() 메소드가담당합니다. 인텐트를실행하는메소드도이것말고도여러가지가있지만, 일단은요거하나만다뤄보도록하겠습니다. public void startactivity(intent intent) 파라미터로받은 intent 인텐트를실행합니다. 자, 그럼첫번째액티비티에대한코딩은끝났으니두번째액티비티에대한소스와레이아웃을설계해보도록하죠. [ 레이아웃 ] 01.<Linearlayout xmlns:android="http://schemas.android.com/apk/res/android" 02.android:orientation="vertical" 03.android:layout_width="wrap_content" 04.android:layout_height="wrap_content" 05.android:id="@+id/LinearLayout01"> 06. 07.<Textview android:layout_width="fill_parent" 08.android:layout_height="wrap_content" 09.android:text=" 두번째액티비티화면입니다. 아래버튼을누르시면액티비가종료됩니다." 10.android:id="@+id/Activity_2_text"></Textview> 11. 12.<Button android:layout_width="fill_parent" 13.android:layout_height="wrap_content" 14.android:text=" 액티비티종료하기 " 15.android:id="@+id/terminateActivity"></Button> 16.</Linearlayout> [ 소스 ] 01.package com.androidhuman.intentexample; 02.import android.app.activity;
03.import android.os.bundle; 04.import android.view.view; 05.import android.widget.button; 06.public class Activity2 extends Activity { 07./** Called when the activity is first created. */ 08.@Override 09.public void oncreate(bundle savedinstancestate) { 10.super.onCreate(savedInstanceState); 11.setContentView(R.layout.layout2); 12.Button terminate = (Button)findViewById(R.id.terminateActivity); 13.terminate.setOnClickListener(new Button.OnClickListener(){ 14.public void onclick(view v) { 15.// TODO Auto-generated method stub 16.finish(); // 액티비티를종료합니다. 17.} 18. 19.}); 20. 21.} 22.} 두번째액티비티는사실더별거없습니다. 버튼에리스너다는건이제아무것도아니고, 인텐트도없구요. 대신에, 액티비티를종료하는메소드인 finish() 메소드를볼수있습니다. 사용자가액티비티를종료하고싶을땐, 이 finish() 메소드를사용하면됩니다. public void finish() 액티비티를종료합니다. 여기까지잘따라오셨다면, 다음과같은화면을보실수있을것입니다. 첫번째액티비티에서버튼을누르면두번째액티비티가실행되고, 두번째액티비티의버튼을누르면두번째액티비티는종료됩니다.
테트리스게임템플릿실습 권욱빈 강사소개권욱빈 강원대학교컴퓨터공학과졸업하고 C/C++ 및 Java로보험영업지원, 재무설계및업무지원시스템등을개발하였으며, 현재 ING 생명운영전산본부에서 Front-end 시스템및 EAI 개발업무를수행하고있다. 새롭고다양한컴퓨팅환경에대한관심을가지고안드로이드를공부중이다.
테트리스를만들며배우는안드로이드어플리케이션제작 제 2 회안드로이드세미나 2009 년 12 월 5 일권욱빈 ( 희망아빠 @ http://www.androidside.com) 목표 개발환경의설치 어플리케이션기본구성의이해 어플리케이션개발실습 ( 테트리스 )
설치와사용이편리한개발환경 개발환경의설치 필요한것들 PC or Mac (Windows, Linux, OS X) JDK 6.0 Android SDK 2.0 Eclipse Galileo RCP Eclipse Plugin ADT (Android Development Tools)
(( 설치과정동영상 )) 새로운프로젝트생성
기본어플리케이션프로젝트생성 설치된개발환경의확인 기본적인프로젝트생성 Hello, World. 에뮬레이터실행 (( 프로젝트생성동영상 ))
어플리케이션프로젝트의구성 기본프로젝트의구성 src gen (Generated Java Files) res (string, layout, drawable) AndroidManifest.xml
어플리케이션기본구성의이해 Activity 어플리케이션구성의가장기본요소 하나의스크린또는화면 Activity Life Cycle 화면이보여지는상태여부에따라안드로이드에의해 Activity의상태가전이됨 전이될때적절하게통보됨
Activity Life Cycle oncreate() onstart() onresume() onpause() onstop() onrestart() ondestroy() Process Life Cycle 안드로이드프로세스의상태 Foreground process Visible Process Service Process Background Process Empty Process 제한된메모리를효율적으로사용하기위해안드로이드는사용빈도가적은프로세스를죽일수있음
구성요소 ( 계속 ) View 유저인터페이스를구성하는기본요소 View Group View 나다른 View Group 을포함 View Attribute View 가가지는속성 Layout View 를화면에배치 / 구성 Real Development Lab Android Tetris
개요및목표 간단한어플리케이션을단계적으로제작 어플리케이션기본골격의이해 개발환경을이해 어플리케이션기본구성요소구현 (Android Application Life Cycle) 디버깅등의개발방법습득 Activity, Layout, View - 화면구성 Hello, World 를수정하여게임화면을구성 setcontentview() Activity( 화면 ) 의내용을지정설정 Layout main.xml 내용을수정 FrameLayout, RelativeLayout View & View Group TetrisView 추가
Lab 1 화면중앙에문자열출력 게임시작, 게임종료 과같은문자열이화면중앙에나오도록제작 Layout 은어디에있는것이좋을까? res/main.xml Activity.onCreate() setcontentview(r.layout.main); TextView tv = new TextView(this); tv.settext( Hello,World! ); setcontentview(tv); XML 에정의 코드에정의
Tetris 기본로직구현 기본게임알고리즘구현 초기화 OnSizeChanged() 새로운블럭생성 이동과회전 충돌확인 화면에그리기 화면에그리기 ondraw(canvas) Paint Paint.setColor(int) Canvas.drawRect(Rect, Paint) Canvas.drawRoundRect(RectF, float, float, Paint)
Lab 2 실행추적하기디버깅모드로실행하여단계적으로수행한다 Lab 3 게임화면구성하기화면에임의의블록을생성하여그린다
Tetris 기본로직구현 ( 계속 ) 떨어트리기 class RefreshHandler extends Handler { @Override public void handlemessage(message msg) {} }; public void sleep(long delaymillis) {} Lab 4 게임화면구성하기 2 생성한블록을떨어뜨린다
사용자입력처리 키입력처리 public boolean onkeydown(int keycode, KeyEvent msg) {} Lab 5 게임화면구성하기 3 떨어지는블록을키입력에따라이동 / 회전시킨다
Lab 6 게임의완성기본적인테트리스게임을완성한다 Life Cycle 지원 소형모바일장비의특성 oncreate() onpause() onresume()
Lab 7 안드로이드어플리케이션의완성지금까지작성된것에 Life Cycle 처리요소를첨가 Q & A
사용자가본스마트폰, 그리고안드로이드폰의가능성 문형철 강사소개문형철 IT 및모바일가젯블로그 [bruce, 와이프몰래오븐을지르다 ] (http://brucemoon.net) 운영 PC 미디어 [Play PC] 컬럼니스트
협찬소개 케이앤피북스출판사 제이펍출판사 ITC 출판사
케이앤피북스 IT 단행본소개 자바프로그래밍언어, 한글 4 판 자바하우투프로그램, 한글 7 판 지은이 : 켄아놀드, 제임스고슬링, 데이비드홈즈옮긴이 : 한동호정가 : 35,000원출간일 : 2009년 11월 13일페이지 : 864쪽판형 : 182*235 ISBN: 978-89-6420-039-1 ---------------------------------------------------- 유닉스쉘바이블, 개정 4판 지은이 : 하비디텔, 폴디텔옮긴이 : 김수동정가 : 53,000원출간일 : 2009년 7월 16일페이지 : 1,732쪽판형 : 188*257 ISBN: 978-89-934258-7-1 ---------------------------------------------------- C++ 하우투프로그램, 한글 6판 지은이 : 엘리퀴글리옮긴이 : 황대환정가 : 40,000원출간일 : 2008년 12월 26일페이지 : 1,256쪽판형 : 182*235 I S B N: 978-89-934258-5-7 지은이 : 하비디텔, 폴디텔옮긴이 : 이태용정가 : 51,000원출간일 : 2009년 9월 4일페이지 : 1,640쪽판형 : 188*257 ISBN: 978-89-934259-1-8
http://www.jpub.kr Java FX : 예제로쉽게배우는짐클라크, 짐코너스, 에릭브루노공저이진행, 이아정, 정다정공역 프로페셔널안드로이드애플리케이션개발 리토마이어저 조성만역 2009년 11월 25,000원 2009년 07월 30,000원 24시간 365일서버 / 인프라를지탱하는기술 클라우드의충격 이토나오야저 시로타마코토저 진명조역 진명조역 2009년 04월 25,000원김태용의리눅스쉘스크립트프로그래밍입문김태용저 2009년 10월 18,000원프로페셔널 ASP.NET MVC : 예제로쉽게배우는롭코너리, 스콧핸슬만, 필해크, 스콧구스리공저 장현희역 2009 년 09 월 32,000 원 2009 년 10 월 28,000 원
도서출판 ITC 의 IT 단행본
감사합니다. 안드로이드사이드한동호 http://www.androidside.com 서강대게임교육원최승관 http://www.soganggame.ac.kr