Folie 1

Similar documents
( )부록

Microsoft PowerPoint App Fundamentals[Part2].pptx

Microsoft Word - windows server 2003 수동설치_non pro support_.doc

[ 그림 8-1] XML 을이용한옵션메뉴설정방법 <menu> <item 항목ID" android:title=" 항목제목 "/> </menu> public boolean oncreateoptionsmenu(menu menu) { getme

Microsoft PowerPoint Android-SDK설치.HelloAndroid(1.0h).pptx

Microsoft PowerPoint SDK설치.HelloAndroid(1.5h).pptx

PathEye 공식 블로그 다운로드 받으세요!! 지속적으로 업그래이드 됩니다. 여러분의 의견을 주시면 개발에 반영하겠 습니다.

Microsoft PowerPoint UI-Event.Notification(1.5h).pptx

Microsoft PowerPoint - 4주차_Android_UI구현.ppt [호환 모드]

어댑터뷰

4S 1차년도 평가 발표자료

학습목표 메뉴를추가하는방법을이해하고실습할수있다. 프로그램의기본설정 (settings) 을정의하는방법을알고실습할수있다. 대화상자를여는방법을알고실습할수있다. 로그메시지로디버깅하는방법을이해한다. 디버거로디버깅하는방법을이해한다.

아이콘의 정의 본 사용자 설명서에서는 다음 아이콘을 사용합니다. 참고 참고는 발생할 수 있는 상황에 대처하는 방법을 알려 주거나 다른 기능과 함께 작동하는 방법에 대한 요령을 제공합니다. 상표 Brother 로고는 Brother Industries, Ltd.의 등록 상

View Licenses and Services (customer)

Windows 8에서 BioStar 1 설치하기

슬라이드 1

Microsoft PowerPoint App Fundamentals[Part1](1.0h).pptx

안드로이드기본 11 차시어댑터뷰 1 학습목표 어댑터뷰가무엇인지알수있다. 리스트뷰와스피너를사용하여데이터를출력할수있다. 2 확인해볼까? 3 어댑터뷰 1) 학습하기 어댑터뷰 - 1 -

(Microsoft PowerPoint - AndroG3\306\367\306\303\(ICB\).pptx)

소규모 비즈니스를 위한 플레이북 여기서 다룰 내용은 다음과 같습니다. 1. YouTube 소개 2. YouTube에서 비즈니스를 위한 채널 만들기 3. 눈길을 끄는 동영상 만들기 4. 고객의 액션 유도하기 5. 비즈니스에 중요한 잠재고객에게 더 많이 도달하기

Microsoft PowerPoint App Fundamentals[Part1].pptx

을풀면된다. 2. JDK 설치 JDK 는 Sun Developer Network 의 Java( 혹은 에서 Download > JavaSE 에서 JDK 6 Update xx 를선택하면설치파일을

PowerPoint 프레젠테이션

SIGIL 완벽입문

2) 활동하기 활동개요 활동과정 [ 예제 10-1]main.xml 1 <LinearLayout xmlns:android=" 2 xmlns:tools="

2 Application Name: Day10_yhg <LinearLayout android:layout_weight="3" > /> an

슬라이드 1

9 차시고급위젯다루기 1 학습목표 날짜 / 시간과관련된위젯을배운다. 웹뷰를사용하여간단한웹브라우저기능을구현한다. 매니패스트파일의설정법을배운다. 2 확인해볼까? 3 날짜 / 시간위젯 1) 활동하기 활동개요

Microsoft PowerPoint - 11주차_Android_GoogleMap.ppt [호환 모드]

iii. Design Tab 을 Click 하여 WindowBuilder 가자동으로생성한 GUI 프로그래밍환경을확인한다.

1

IRISCard Anywhere 5

PowerPoint Template

학습목표 선언하여디자인을하는방법을이해하고, 실행할수있다. 시작화면을만드는방법과대체리소스를사용하는방법을이해하고실행할수있다. About 과같은상자를구현하고, 테마를적용하는법을이해하고실행할수있다.

Microsoft PowerPoint - chap01-C언어개요.pptx

Microsoft PowerPoint - 02처음으로만드는(Ver 1.0)

윈도 모바일 6.1을 OS로 사용하는 스마트폰(옴니아2 등)에서의 Tcl/Tk의 사용

서현수

SBR-100S User Manual

[ 그림 7-1] 프로젝트 res 폴더 이미지뷰 [ 예제 7-1] 이미지뷰 1 <LinearLayout 2 ~~~~ 중간생략 ~~~~ 3 android:orientation="vertical" > 4 <ImageView

Mobile Service > IAP > Android SDK [ ] IAP SDK TOAST SDK. IAP SDK. Android Studio IDE Android SDK Version (API Level 10). Name Reference V

사용설명서를 읽기 전에 안드로이드(Android)용 아이디스 모바일은 네트워크 연결을 통해 안드로이드 플랫폼 기반의 모바일 기기에서 장치 (DVR, NVR, 네트워크 비디오 서버, 네트워크 카메라) 에 접속하여 원격으로 영상을 감시할 수 있는 프로그램입니다. 장치의 사

1. 자바프로그램기초 및개발환경 2 장 & 3 장. 자바개발도구 충남대학교 컴퓨터공학과

1부

목차 제 1 장 inexio Touch Driver소개 소개 및 주요 기능 제품사양... 4 제 2 장 설치 및 실행 설치 시 주의사항 설치 권고 사양 프로그램 설치 하드웨

슬라이드 1

Microsoft 을 열면 깔끔한 사용자 중심의 메뉴 및 레이아웃이 제일 먼저 눈에 띕니다. 또한 은 스마트폰, 테블릿 및 클라우드는 물론 가 설치되어 있지 않은 PC 에서도 사용할 수 있습니다. 따라서 장소와 디바이스에 관계 없이 언제, 어디서나 문서를 확인하고 편집

Microsoft Word - 안드로이드_개발_매뉴얼1.docx

구글안드로이드프로그래밍액티비티, 인텐트수신자, 그리고서비스 안드로이드애플리케이션의구성요소에는액티비티, 인텐트수신자, 서비스, 컨텐트제공자가있다. 이번호에서는사용자인터페이스를위한액티비티와백그라운드서비스를위한인텐트수신자, 그리고서비스의라이프사이클과활용법에대해살펴보도록하자.

Chapter 1

THE TITLE

사용설명서를 읽기 전에 ios용 아이디스 모바일은 네트워크 연결을 통해 ios 플랫폼 기반의 모바일 기기(iOS 버전 6.0 이상의 ipod Touch, iphone 또는 ipad)에서 장치(DVR, 네트워크 비디오 서버 및 네트워크 카메라)에 접속하여 원격으로 영상을

슬라이드 1

12 주차 인텐트

디지털 공학

Microsoft Word - ntasFrameBuilderInstallGuide2.5.doc

Google Maps Android API v2

슬라이드 1

슬라이드 1

ISP and CodeVisionAVR C Compiler.hwp

Daum 카페

13ÀåÃß°¡ºÐ

PowerPoint Template

07( ) CPLV12-35.hwp

01장

슬라이드 1

03장

PowerPoint 프레젠테이션

REMON Android SDK GUIDE (SDK Version 1.4.1) 1 / 25


1

스마트월드캠퍼스 교육교제

Dialog Box 실행파일을 Web에 포함시키는 방법

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

PowerPoint Presentation

Oracle VM VirtualBox 설치 VirtualBox에서 가상머신 설치 가상머신에 Ubuntu 설치

쓰리 핸드(삼침) 요일 및 2405 요일 시간, 및 요일 설정 1. 용두를 2의 위치로 당기고 반시계방향으로 돌려 전날로 를 설정합니다. 2. 용두를 시계방향으로 돌려 전날로 요일을 설정합니다. 3. 용두를 3의 위치로 당기고 오늘 와 요일이 표시될 때까지 시계방향으로

750 1,500 35

Facebook API

슬라이드 1

1. 무선 이미지 유틸리티 설명 1-1. 기능 이 Wireless Image Utility 는 안드로이드용 응용 프로그램입니다. 안드로이드 태블릿 또는 안드로이드 스마트폰에서 사용할 수 있습니다. 안드로이드 기기에 저장된 파일을 프로젝터로 무선 전송 컴퓨터에서 USB

이도경, 최덕재 Dokyeong Lee, Deokjai Choi 1. 서론

SproutCore에 홀딱 반했습니다.

DE1-SoC Board

F120S_(Rev1.0)_1130.indd

,,,,,, (41) ( e f f e c t ), ( c u r r e n t ) ( p o t e n t i a l difference),, ( r e s i s t a n c e ) 2,,,,,,,, (41), (42) (42) ( 41) (Ohm s law),

슬라이드 1

슬라이드 1

Microsoft Word - Korean_뷰어 메뉴얼_공용_ADVR&SWi_.doc

설치 순서 Windows 98 SE/Me/2000/XP 1 PC를 켜고 Windows를 시작합니다. 아직 컴퓨터에 프린터를 연결하지 마십시오. 2 PC에 P-S100 CD-ROM(프 린터 드라이버)을 삽입합니다. 3 설치 프로그램을 시작합니다. q CD-ROM의 PS1

DocsPin_Korean.pages

비디오 / 그래픽 아답터 네트워크 만약에 ArcGolbe를 사용하는 경우, 추가적인 디스크 공간 필요. ArcGlobe는 캐시파일을 생성하여 사용 24 비트 그래픽 가속기 Oepn GL 2.0 이상을 지원하는 비디오카드 최소 64 MB 이고 256 MB 이상을 메모리

OpenCV와 함께하는 컴퓨터 비전 프로그래밍 캠프

B _00_Ko_p1-p51.indd

Microsoft PowerPoint - 15주차(최종).pptx

Windows Server 2012

리니어레이아웃 - 2 -

Spring Boot

CD-RW_Advanced.PDF

B2B 매뉴얼

Transcription:

Introduction to Android how2quit@gmail.com 1

안드로이드가 뭐 대단한 거라고 제1세대 안드로이드 폰이 처음 모습을 드러낸 게 2008년 8월 입니다. 하지만, 미국 내에서의 안드로이드 기반 단말기 판매량은 2010년 첫 번째 분기에만 전년도에 비해 707% 증가하였습니다.(Gartner) 2011년 3월에는 미국에서의 스마트폰 판매량 중 안드로이드가 차지하는 비중이 37%에 다다랐으며, 애플의 아이폰은 27%, 블랙베리는 22%를 차지하였습니다 2011년 6월에는 전 세계적으로 매일 50만대 이상의 안드로이드 단말기가 매일 개통되고 있으며, 단말기의 종류만 300 가지가 넘습니다. 2

주의 깊게 봐야할 안드로이드의 특징 안드로이드 앱 개발의 잇점 중 하나는 플랫폼의 개방성(openness)입니다. 운영체제(operating system)이 오픈 소스이고 공짜(free)입니다. 그래서 누구든 안드로이드의 소스코드를 볼 수 있고 어떻게 구현되었는지 볼 수도 있습니다. 그리고 플랫폼의 개방성은 안드로이드가 재빠르게 혁신을 이루게 된 주요인이 되기도 했습니다. 안드로이드 앱은 자바로 구현됩니다. 자바는 전 세계적으로 가장 많이 사용되는 프로그래밍 언어이므로, 그런 이유에서도 안드로이드가 개발 언어로 자바를 택한 것은 어찌보면 아주 적절하며 타당한 것이었습니다. 그리고, 자바의 객체 지향적이고 파워풀한 수많은 라이브러리들은 여러분이 앱을 아주 신속하게 작성할 수 있도록 도울 것입니다. 멀티터치 스크린(Multi-touch Screen)과 내장된 다양한 앱(Built-in Apps)이 제공됩니다 많은 안드로이드 디바이스들이 멀티 터치 스크린을 지원하고, Phone, Contacts, Mail, Browser등 다양한 빌트인 앱들을 제공하며, 이 외에도 제조사 별로 커스터마이징 된 다양한 기본 앱들이 있습니다. (이제 여러분은 안드로이드 개발에 뛰어들었으므로 그것들과 어떻게 상호작용해야 하는지에 신경써야하겠죠) 3

안드로이드는버전마다새로운이름을붙이더군요 4

안드로이드개발환경을준비합시다 Java SE Eclipse IDE Andnroid SDK ADT plugin for Eclipse 5

실제 안드로이드 디바이스를 활용해서 개발하기 위한 준비 안드로이드 디바이스에 어플리케이션을 인스톨하고 디버깅하려면 먼저 USB 케이블을 통해 억세스할 수 있도록 운영체제를 설정해 주어야 합니다. Mac이나 리눅스 환경에서 작업할 경우엔 특별히 해주어야 할 것이 없으나, 윈도우라면 다릅니다. 여러분이 테스트하고자 하는 디바이스를 위한 USB 드라이버를 설치해 주어야 합니다. (만약, 여러분이 테스트하고자 하는 디바이스가 안드로이드 레퍼런스 폰인 Nexus One 이나 Nexus S 라면 굳이 USB 드라이버를 다운로드하여 설치해 줄 필요는 없고 Google USB Driver를 사용하면 됩니다. 그 이외의 디바이스라면 다음의 문서를 참고하세요 http://developer.android.com/sdk/oem-usb.html) 6

안드로이드 디바이스 세팅은 어떻게 실제 디바이스에서의 디버깅을 위해서는 몇 가지 설정이 필요합니다 안드로이드 디바이스는 기본적으로 디버깅 설정이 해제되어 있습니다. 그러므로, USB연결을 이용해서 개발도 하고 실행도 시켜보려면 디버깅이 가능하도록 그에 관한 설정을 활성화 해줘야 합니다. 1. 설정 > 애플리케이션 > 알 수 없는 소스를 체크해 줍니다. 2. 설정 > 애플리케이션 > 개발 을 선택한 후에 보이는 세 가지 옵션을 모두 선택해 줍니다. 3. 맨 아래 모의 위치 허용은 모의 위치 정보를 디바이스에 본는 걸 가능하게 해 줍니다. 위치 기반 서비서(LBS, Location based services)를 이용한 어플리케이션을 작성할 때 유용합니다. 이제 준비가 다 된 듯 합니다. 제대로 환경 설정이 되었는지 확인하고 실제 어플리케이션도 작성해 보도록 하겠습니다 7

개발 환경이 제대로 설정되어 있는지 테스트 해보기 여러분의 첫 번째 앱을 작성하기 이전에, 개발 환경이 제대로 설정되어 앱을 개발하고 테스트하고 실행할 수 있는 지 먼저 확인해 보는 것이 좋습니다. 다음의 과정에서는 (기존에 있던 샘플 앱)을 먼저 이클립스에 불러 온 후에(import), 안드로이드 가상 디바이스(AVD)에서 시험삼아 실행시켜보는 과정이 설명됩니다. 거기에 덧붙여 실제 안드로이드 다바이스에서도 실행해보도록 할 것입니다. 1. 2. 3. 4. New > Android Project (New Android Project Wizard) Project Name : Snake, Create project from existing sample > Next Build Target : Android 2.3.3 > Next Select Sample > Snake 8

의 생성과 시작 프로젝트를 준비하였으니, 이제 그 프로젝트를 실행시킬 AVD를 생성해 줘야 합니다. AVD는 어플리케이션이 실행될 디바이스의 소프트웨어와 하드웨어 특징을 가상으로 구성한 것이라 볼 수 있습니다. 그래서, AVD 프로필에는 디바이스가 지원하는 안드로이드 플랫폼에 대한 정보는 물론, SD카드의 용량, 화면 크기 설정, 디바이스에 포함된 추가적인 하드웨어 속성들이 포함됩니다. 1. Window > AVD Manager > New 2. [Create new Android Virtual Device] (그림을 참고하여 입력) 3. [AVD Manager]에서 생성된 AVD 선택 후 Start 9

Launch Configuration 설정 여러분이 작성한 앱을 AVD에서 실행하기 위해 별도의 Launch Configuration을 설정해 둘 수도 있습니다. 이클립스 프로젝트 마다, 프로젝트 특성에 맞는 Launch configuration을 별도로 설정해서 실행하는 것도 좋은 습관입니다. 1. Run > Run Configuration 을 선택해서 Run Configuration 창을 엽니다 2. 왼쪽의 리스트 중 Anndroid Application을 더블클릭하면 새로운 리스트가 하나 생성되며, 이때 오른쪽 패널에 나타나는 설정 항목을 입력해주면 됩니다. 3. 우선 name 입력 공간에 적당한 이름을 작성하고, Project 항목은 Browse 버튼을 클릭해서 Snake 프로젝트를 선택해 줍니다. (Android Tab)임을 확인하세요 4. 다음으로 Android Tab 바로 옆의 Target Tab을 클릭합니다 5. 가운데 보이는 AVD 중에 적당한 것을 선택해 줍니다. 6. 그리고, Run 버튼을 클릭하여 AVD에서 어플리케이션을 실행하도록 합니다 10

실제 안드로이드 디바이스에서 실행하기 먼저 안드로이드 디바이스의 디버깅 모드가 활성화 되어야 합니다. (아래 순서를 참고하세요) 1. 설정 > 애플리케이션 > 개발 > USB 디버깅 항목을 체크해서 활성화 시켜줍니다. 2. USB 케이블을 이용해서 안드로이드 디바이스를 컴퓨터와 연결해 줍니다. 3. 이클립스에서 실행하고자 하는 프로젝트를 선택한 후에 실행해 줍니다. (케이블이 연결된 상태이고, Run Configuration의 Target에서 Target 선택모드가 Manual로 되어 있는 경우 AVD와 실제 디바이스중 어떤 것을 실행타겟으로 잡을 것인지 선택하도록 Android Device Chooser 다이얼로그가 나옵니다) 11

이제 여러분의 첫 번째 앱 을 만들어 봅시다 첫 번째 앱이기 때문에 간단한 인사 메시지와 이미지를 사용하는 앱을 만들어 볼까 합니다. 간단하지만 이 앱을 만들면서 다음의 내용들을 살펴보고자 합니다 1. Eclipse IDE와 ADT(Android Development Tools)를 이용해서 앱을 작성하는 방법 2. ADT에서 제공하는 Visual Layout Editor를 이용해서 GUI를 디자인 하는 방법 3. 작성한 앱을 AVD에서 실행하고 확인하는 방법 좀 더 기술적으로 살펴보면, 1. 2. 3. 4. 앱을 만들기 위해 사용하게 될 이클립스의 기능들과 다양한 뷰 ImageView에 내가 원하는 그림을, TextView에는 내가 원하는 메시지를 Properties 탭의 사용, GUI 컴포넌트의 속성 변경 이 모든 것을 AVD에서 실행하고 확인하기 12

프로젝트를생성하자 1. File > New > Project 2. Android > Android Project > Next 3. Project name : Welcome, check : Create new project in workspace > Next 4. Build Target : Android 2.3.3 > Next 5. Application Name : Welcome, Package name : example.myapps, WelcomeActivity, Minimum SDK : 10 > Finish 13

1. 2. 3. 4. src 자바 소스파일을 포함하는 폴더 gen IDE에 의해 생성되는 자바 파일들을 포함하는 폴더 Android 2.3.3 앱을 만들때 선택한 안드로이드 프레임워크 버전을 포함한 폴더 res 앱과 관련된 리소스 파일들을 포함하는 폴더, GUI 레이아웃이나 이미지 등 assets 어플리케이션 리소스로 관리되길 원하지 않는 그 외의 파일이나 디렉토리들이 저장되는 폴더 projecct.properties 어플리케이션 빌드 타겟, 그 외의 빌드 시스템 옵션등이 필요에 따라 정의됩니다 proguard.cfg 진저브레드가 나오면서 지원되는 오픈소스 툴인 ProGuard를 적용하기 위한 파일입니다. ProGuard는 코드를 이해하기 어렵게 해주고(그래야 악의적인 크래커의 공격으로부터 여러분의 코드를 보호하겠죠), 코드 사이즈를 줄여주며 최적화 해주는 툴입니다. 14

과 설정 에뮬레이터에서 디버깅하기. 방금 생성한 프로젝트의 액티비티 클래스가 에러를 발생하도록 수정한 후에 디버깅 툴의 몇 가지 기능들을 사용해 보도록 하겠습니다. WelcomeActivity 파일을 열고 아래의 코드를 해당 클래스에 추가해 보겠습니다. 그리고, 실행해보세요 public void forceerror(){ if(true){ throw new Error( Whoops! ); } } 15

앞에 수정된 코드가 실행되면, 에러가 발생하게 되고 오른쪽 화면처럼 멈추게 됩니다. 어플리케이션만 Force Close 한 뒤에, 이번엔 Debug As 아이콘을 이용해서 어플리케이션을 디버깅 합니다.(Debug As > Welcome_RunConfiguration ) 잠시 뒤 이클립스는 다음과 같은 다이얼로그를 보여줄 것입니다. 16

단계별로 진행시켜가며 LogCat을 확인하세요 17

로깅(Logging) 이용하기 자주 사용되는 로깅 메소드 : 사용예 ) Method Purpose Log.e( ) log errors Log.w( ) log warnings Log.i ( ) log informational messages Log.d ( ) log debug messages Log.v ( ) log verbose messages 18

디버깅정보필터링하기 19

를 이용해서 구성하기 드래그 앤 드랍으로 GUI를 생성할 수 있습니다 GUI 레이아웃 정보들은 main.xml 파일에 저장이 됩니다. 이렇게함으로써 프리젠테이션 파트를 애플리케이션의 로직과 분리할 수가 있습니다. 레이아웃 파일들도 리소스로 간주되며, res 폴더에 저장이 됩니다. 실제로도 layout 이라는 하위폴더에 따로 저장이 됩니다. 20

프로젝트를 생성하며 만들어진 main.xml 파일을 버리고, RelativeLayout를 사용하는 새로운 main.xml 파일을 만들어 보겠습니다 1. main.xml 파일이 열려있다면 닫고, 프로젝트의 /res/layout 폴더를 마우스 오른쪽 버튼으로 클릭한 후 Delete를 선택하여 지웁니다 2. 다시 /res/layout 폴더를 마우스 오른쪽 버튼으로 클릭한 후에 New > Other 3. Android 노드에서 Android Layout XML File을 선택한 후 창이 열리면 파일이름(main.xml)과 포함할 Root Element를(RelativeLayotu) 선택한 후 Finish 하세요. 21

Android Pixel Density Density ldpi mdpi hdpi xhdpi nodpi Description Low density approximately 120 dpi Medium density approximately 160 dpi High density approximately 240 dpi Extra high density approximately 320 dpi Indicates that a resource should not be scaled regardless of screen density 22

다음과 같은 과정으로 GUI를 구성하고 설정하게 됩니다 1. 프로젝트에 image를 추가하기 2. RelativeLayout의 ID 프로퍼티 변경하기 RelativeLayout의 Background 프로퍼티 변경하기 3. TextView 추가하기 TextView의 Text 프로퍼티를 String resource를 이용해서 설정하기 TextView의 Text size와 padding top 프로퍼티를 설정하기(Scaled Pixel, Density-Independent Pixel) 그 외의 추가적인 TextView 프로퍼티 손보기 4. ImageView를 추가하고 각각의 ImageView에 이미지 붙이기 23

프로젝트에 image를 추가하기 1. 미리 배포한 files 폴더에 ice_cream_sandwich.png 파일이 있습니다. 2. Package Ecplorer 에서, res /drawable-hdpi 폴더에 그림 파일을 드래그 앤 드랍 하세요. (추가하는 파일의 이름에는 소문자와 숫자, 언더스코어만 사용할 수 있습니다) 24

RelativeLayout 손보기 XML 파일을 직접 수정하지 않고도, 원하는 레이아웃이나 컴포넌트의 프로퍼티를 설정할 때에 Properties 뷰를 사용할 수 있습니다. 1. Properties 뷰가 보이지 않는다면, Outline 뷰에 있는 RelativeLayout을 더블클릭하면 되고, 2. Window > Show View > Other 를 선택한 후 General 노드에 있는 Properties를 선택해도 됩니다. Properties 뷰에서 id 프로퍼티를 찾아 그 값을 아래처럼 수정하세요. 값을 수정하면 Outline뷰에 있던 이름도 변경됨을 알 수 있습니다 @+id/welomerelativelayout 다음으로 background 프로퍼티를 수정합니다 #FFFFFF 25

TextView 사용하기 1. Form Widgets 에서 TextView를 선택한 후에 디자인 영역에 드래그앤드랍 하세요 2. TextView의 text 프로퍼티를 설정하는데 String Resource를 사용하도록 하겠습니다. Properties 뷰에서 text 프로퍼티를 보면 디폴트 값으로 지정되어 있고, 뒷 부분에 보면 이렇게 생긴 생략표시가 있습니다. 이것을 클릭해서 Resource Chooser 다이얼로 그를 열겠습니다. 3. New String을 클릭해서 Create New Android String 다이얼로그를 엽니다. 4. String과 new R.string 항목에 ANDROID ICECREAM SANDWICH 와 welcome 으로 채웁니다 > OK 5. Outline과 Properties 뷰에서 변경된 사항을 확인하세요. 문자열이나 이미지, 색상, 폰트 사이즈 등을 외부화(externalize) 하는 것과 지역화(localize)하는 부분에 대해서는 아래의 문서를 참조하도록 하세요. developer.android.com/guide/topics/resources/index.html developer.android.com/guide/topics/resources/providing-resources.html#alternativeresources developer.android.com/guide/topics/resources/localization.html 26

6. TextView의 size와 padding을 설정해 줍니다. text size 프로퍼티를 40sp로 layout margin top 프로퍼티를 10sp로 지정해줍니다. density-independent pixels는 실제 디바이스 화면의 점밀도(pixel density)에 기반으로 안드로이드 플랫폼이 GUI의 크기를 조절하도록 해줍니다. dip 픽셀 하나는 160dpi 화면에서의 한 픽셀과 동일한 크기입니다 ( 예로, 240dpi 크기의 화면에서라면 각각의 dip 픽셀의 너비는 240/160, 즉 1.5 배의 크기로 나타나게 되며, 120dpi 화면에서라면 120/160, 즉 0.75배의 크기로 나타납니다.) Scale-Independent Pixel도 DIP 처럼 크기가 조절됩니다. 사용자가 미리 정해놓은 크기(User s preferred font size)에 따라 조절되지요. 7. TextView에 대해 몇 가지 더 설정해 줍니다. id는 @+id/welcometextview로, color는 #00F로 style은 bold로, gravity는 center로 지정해 줍니다. 27

ImageView 추가하기 Image & Media 항목에서 ImageView를 선택한 후에, Outline 뷰의 welcometextview 노드 아래 로 드랍합니다. 그리고 아래의 값들을 확인하세요 ImageView id : @+id/sandwichimageview layout below : @id/welcometextview layout center horizontal : true src : @drawable/ice_cream_sandwich 28

을 살펴봅시다 Source > Format 으로 코드를 보기좋게 정렬해보세요 29

에서실행하기 30

Android Application Development Android Application Design Essentials 1 Application Context, Activity how2quit@gmail.com 31

안드로이드 앱 디자인 Essential 컨텍스트(context) 액티비티(activity) 인텐트(inetnt)와 인텐트 필터(intent filter) 서비스(service) 브로드캐스트 리시버(broadcast receiver) 32

안드로이드 어플리케이션을 파헤쳐 보자 제한된 리소스를 가지고 움직이는 모바일 디바이스를 위한 어플리케이션을 작성하려면 먼저 어플리케이션의 라이프 사이클(lifecycle)을 이해하고 있어야 합니다. 그리고, 안드로이드는 어플리케이션을 구성하는 몇 가지 용어들 (Context, Activity, Intent 등)을 사용하는데, 안드로이드 개발을 위해서는 이러한 용어들도 이해해야 합니다. 이번 장에서는 이러한 안드로이드의 중요한 컴포넌트들 에 대해 살펴보겠습니다. 안드로이드에서 사용되는 꼭 기억해야할 용어들 Context : 컨텍스트는 안드로이드 어플리케이션의 주요한 지휘센터라고 볼 수 있습니다. 모든 어플리케이션과 관련된 기능 들은 컨텍스트를 통해 억세스 할 수 있습니다. Activity : 안드로이드 어플리케이션은 해야할 일의 모음입니다. 이 일 각각을 어플리케이션 내의 다른 액티비티와는 구분되는 자신만의 일(임무)를 갖게 됩니다.. Activity라고 부르며, 각각의 액티비티는 Intent : 안드로이드 운영체제는 수행하고자 하는 일에 맞는(그 일을 수행할만한) 적절한 액티비티를 찾기위해 비동기적 메시징 기술을 사용합니다. 그 각각의 요청이 인텐트라는 것으로 패키징 됩니다. 여러분은 그러한 각각의 요청를 뭔가 할 의도를 알리는 메시지 로 생각할 수 있습니 다 Service : 사용자와의 상호 작용을 필요로 하지 않는 일이나 임무는 서비스(Service) 내에 캡슐화할 수 있습니다. 서비스는 시간이 오래 걸 리는 일이거나 정기적으로 수행될 필요가 있는 일들에 유용할 것입니다 33

어플리케이션 컨텍스트 어플리케이션 컨텍스트(application context) 어플리케이션 컨텍스트를 이용하면 다음과 같은 일을 할 수가 있어요 34

어플케이션 컨텍스트 어플리케이션 컨텍스트(Application Context) Context 클래스는 어플리케이션과 관련된 세부 설정은 물론 어플리케이션 전반에 걸친 동작이나 데이터를 관리하기 위한 용도로 사용됩니다. 다수의 액티비티 인스턴스에 공유되는 세팅이나 리소스에 억세스할 때 어플리케이션의 Context를 사용하세요. 아래 몇 가지 주세로 어플리케이션 컨텍스트에 접근하고 정보를 얻어내는 방법을 보게 될 것입니다. 실제 어플리케이션을 작성하 며 사용법을 보는 게 아니므로, 우선은 이렇게 하는구나 정도로 기억해 두라는 의미에서 이루어집니다. 간단히 알아본 후 실제 어플리케이션을 작성하면서 더 자세하게 사용될 것입니다. 어플리케이션의 컨텍스트를 찾기 Context context = getapplicationcontext() ; 현재 프로세스의 Context를 찾으려면 getapplicationcontext() 메소드를 사용하면 됩니다. 간단하죠? 35

어플리케이션 컨텍스트 이용하면 다음과 같은 일을 처리할 수 있어요 어플리케이션 컨텍스트를 찾은 후엔 어플리케이션 전반에 걸친 특성이나 리소스, 서비스에 억세스할 때 사용 하면 됩니다. 어플리케이션 리소스를 찾을 수도 있습니다 어플리케이션의 리소스를 찾으려면 Context의 getresources() 메소드를 사용하면 됩니다. 그리고, 가장 수월하게 리소스를 찾는 방법은 R.java 클래스에 자동 생성된 (리소스마다 유일하게 생성된 )리소스 식별자(identifier)를 사용하는 것이죠. 아래 예제는 어플리케이션 리소스 중에서 리소스 ID를 가지고 문자열 인스턴스를 찾는 코드 입니다. String greeting = getresources().getstring(r.string.hello); 36

context 어플리케이션의 Preferences 를 찾을 수도 있습니다 어플리케이션의 Shared Preference를 찾으려면 Context의 getsharedpreserences() 메소드를 사용하면 됩니다. 여기서 리턴되는 SharedPreferences 인스턴스는 설정 세팅(configuration settings)같은 간단한 어플리케이션의 데이터를 저장하는 데 사용됩니 다. 나중에 이 부분도 자세하게 살펴볼 시간이 있겠죠? Context를 이용해서 어플리케이션의 다른 기능에 억세스 할 수도 있습니다 어플리케이션 컨텍스트는 어플리케이션의 최상위 특성들에 접근하는 방법을 제공하는데, 몇 가지만 보면 다음과 같습니다. 액티비티 인스턴스를 시작하기 어플리케이션에 패키징된 assets을 찾기 위치 정보와 같은 시스템 서비스를 요청하기 비공개 어플리케이션 파일, 디렉토리, 데이터베이스 관리하기 어플리케이션 권한(permission)을 검사하고 시행하기 맨 처음 언급된 방법인 액티비티 인스턴스를 시작하는 것이 아마도 어플리케이션 컨텍스트를 사용하는 가장 보편적인 방법일 것입니다. 37

context 여기서 잠깐! Context를 사용하면서 처음에 보여줬던 코드 중에 아래와 같이 Contenxt에 접근 하는 두가지 방법을 보여줬습니다. Activity 클래스가 Context 클래스에서 확장된 것이기 때문에 쉽게 두 번째 방법을 사용하기도 하는데요. 모든 상황에서 두 번 째 방법을 사용하게 되면(Activity Context를 사용하는 것이죠) 메모리 누수가 심각해 질 수 있으므로 조심해야 합니다 Context 와 관련된 메모리 누수 문제를 해결 하기 위한 두 가지 쉬운 방법이 있는데, 가장 확실한 첫번째 방안은, Context 가 자신 의 Scope 외에서는 사용되지 않도록 하는 것이고, 두번째 해결책은 Application Context 를 사용하는 것입니다. 명시적으로 Application Context를 획득해 오는 방법입니다. Context.getApplicationContext() 메소드를 이용할 수도 있고, Activity.getApplication().getApplicationContext()를 이용할 수도 있습니다. (두 번째는 Application 객체를 이용하게 되네요) Activity Context를 사용하는 방법입니다. 이 방법을 사용하면 자신의 Scope(자신이 살아있는 동안) 이 외에도 레퍼런스를 유 지 시켜 심각한 메모리 누수를 초래할 수도 있습니다. 액티비티 컨텍스트는 오래 유지되지 않도록 신경써야하고(그 액티비티가 소멸되면 사라지록), 되도록 액티비티 컨텍스트보다는 어플리케이션 컨텍스트를 사용하세요 38

어플리케이션이 할 일을 구상해 봅시다 Activity 클래스는 안드로이드 어플리케이션의 핵심이기 때문에, 여러분은 아마도 어플리케이션 개발의 대부분의 시간을 액티비티를 정의하고 구현하는 데 보내게 될 것입니다. 그런 의미에서 약간은 실제적인 예를 가지고 생각해 볼까요? 다음은 아주 간단한, 다섯 개의 액티비티를 갖는 게임에 대한 설명입니다. 아주 간단하지만 꼭 필요한 것들만 챙겨봤더니 아래 처럼 다섯개의 액티비티가 필요할 것으로 판단되었습니다. 시작 화면 : 어플리케이션을 시작하면 보이는 화면으로 어플리케이션의 이름과 버전이 메인 메뉴로 넘어가기 전 짧게 보이도록 합니다. 메인 메뉴 화면 : 사용자가 이 어플리케이션의 다른 핵심 기능을 선택해서 넘어갈 수 있게 해주는 화면입니다 게임 플레이 화면 : 사용자가 게임을 할 수 있는 화면이 되겠죠 점수보기 화면 : 게임 점수와 세팅 정보가 표시됩니다. 도움말과 게임 설명 화면 : 게임을 할 때 필요한 정보들이 표시됩니다. 시작 화면 startup / splash activity 메인 메뉴 화면 main menu activity 점수보기 화면 high score activity 게임 플레이 화면 game play activity 도움말과 게임설명 화면 help/about activity 39

어플리케이션을 구상하면서 꼭 알고 있어야 하는 것들 액티비티, 액티비티의 생명주기, 액티비티 스택 안드로이드 어플리케이션은 멀티 프로세싱(multi-processing)이 가능하고, 안드로이드 운영체제는 다수의 어플리케이션이 동시에 실행할 수 있도록 해줍니다. 게다가, 어플리케이션은 백그라운드 프로세스도 가질 수 있고, 전화가 오면 어플리케이션이 일시 정지 되기도 합니다. 하지만, 기억해야 할 것은 사용자에게 직접 보여지는 어플리케이션은 오직 하나 뿐이라는 것입니다. 더 정확하게 말하면, 하나의 액티비티만 주어진 시간에 전면(foreground)에 올라 올 수 있다는 것이지요. 안드로이드 운영체제는 액티비티의 활동을 파악하기 위해서 어플리케이션의 활동에 참여하는 모든 액티비티를 액티비티 스택(activity stack)을 이용해서 관리합니다(이름에서 알 수 있듯이 스택 구조를 가지고 있으며, 그냥 stack 혹은 back stack이라고 불리기도 합니다). 새로운 액티비티가 시작하면, 스택의 가장 위에 있던(현재 화면을 차지하던) 액티비티가 멈추고 새로운 액티비티가 스택의 가장 상위에 올라가면서 화면을 차지합니다. 그러다 그 액티비티의 활동이 끝나면 스택에서 제거되고(모든 관련 상태 정보도 사라지고) 이전의 액티비티가 최상위를 다시 차지하게 되면서 일을 다시 시작합니다. 이러한 과정을 거치면서도 안드로이드 어플리케이션은 자신의 상태정보와 메모리, 사용하는 리소스들과 데이터들을 모두 관리해야하며, 일시정지나 재시작 시에도 일관성있고 결함없이 동작하도록 디자인 되어야 합니다. 따라서, 액티비티의 생명주기 사이에서 액티비티의 상태가 어떻게 다르고 변화하는 지를 이해하는 것이 강력하고 안정적인 어플리케이션을 디자인하고 작성하는 첫 걸음이 됩니다. 40

액티비티(Activity) 액티비티가 도대체 뭐길래... 액티비티는 어떻게 만들면 되나요? 태스크와 백 스택(Task and Back stack) 액티비티에 대해서 좀 더 자세히 알아봐야 할 거 같습니다 액티비티는 기본적으로 세 가지 상태로 존재 할 수 있습니다 액티비티의 상태가 변화할 때, 시스템은 콜백 메소드를 통해 통보해 줍니다 액티비티 라이프 사이클내에 자리잡은 세 가지 내부 순환고리라는 것도 알아두면 좋아요 액티비티의 콜백 메소드 간단히 보기 콜백 메소드는 어떤 용도로 사용하면 좋을까? 액티비티의 프로세스는 언제 죽을 지 몰라요 onpause()말고도 정보를 저장하는 또 다른 수단이 있군요! 41

액티비티 액티비티가 도대체 뭐길래 액티비티는 어떤 일을 수행하기 위해 사용자와 상호작용할 수 있는 화면을 제공하는 어플리케이션 컴포넌트 입니다. 전화를 걸거나, 사진을 찍거나, 이메일을 보내거나, 지도를 보려면 사용자의 상호작용이 필요합니다. 이러한 상호작용을 위한 화면을 창을 제공하며, 이 창(window)은 화면을 가득 채우거나, 혹은 그 보다는 좀 작아서 다른 액티비티 윈도우의 앞에 띄워지기도 합니다. 어플리케이션은 보통 (서로 느슨하게 연결된) 다수의 액티비티로 구성이됩니다. 일반적으로 어플리케이션에 있는 액티비티중 하나가 메인 액티비티가 되어 어플리케이션이 처음 시작할 때 나타납니다. 액티비티는 다른 액티비티를 시작하게 할 수도 있으며, 이때 새로운 액티비티가 시작되면, 이전의 액티비티는 멈춥니다. 시스템은 멈춘 액티비티를 스택*(Back Stack)에 보관합니다. 이름에서 알 수 있듯 백스택은 LIFO(last in first out) 큐 메커니즘을 따릅니다. 새로운 액티비티가 시작하면 백 스택에 푸쉬(push)되고 사용자 포커스를 갖 게 됩니다. 그러다, 사용자가 BACK 키를 누르면 스택으로 부터 팝(pop)되어 소멸됩니다. 그러면 팝되어진 액티비티의 아래에 있던 액티비티가 다시 시작하게 되죠 새로운 액티비티가 시작해서 멈추게 된 액티비티는, lifecycle callback method를 통해 이러한 상태의 변화에 대해 통보를 받습니다. 액티비티는 몇 가지의 상태(일하고 있거나, 일시적으로 멈춰 지거나, 일을 멈추는 등)를 가질 수 있고, 어느 한 상태에서 다른 상태로 변화하게 되면 시스템은 이러한 상태 변화가 발생함을 액티비티가 갖는 콜백 메소들 호출해 줌으로써 미리 액티비티에게 알립니다. 미리 준비할 것은 준비하고, 상태가 변화하면서 발생할 수 있는 예기치 않은 상황(데이터 손실 등)을 미연에 막고자 함이죠. * 시스템의 액티비티 매니저에 의해 기록됩니다. 42

액티비티는 어떻게 만들면 되나요? 이전에 만들었던 MyFirstAndroidApp의 Activity의 소스코드를 보면 다음과 같습니다. 가장 기본적인 형태입니다. package android.example.myfirstandroidapp; import android.app.activity; import android.os.bundle; public class MyFirstAndroidApplicationActivity extends Activity{ @Override public void oncreate(bundle savedinstancestate){ super.oncreate(savedinstancestate); setcontentview(r.layout.main); } } 액티비티를 만들기 위해서는, Activity 클래스를 상속하는 자바 클래스를 생성하고, 콜백 메소드를 구현해 주면 됩니다. 그리고, 콜백 메소드 중 하나인 oncreate() 메소드에서 res/layout 폴더에 정의된 XML 파일인 안드로이드 매니페스트(AndroidManifest)을 통해 UI컴포넌트를 로드하도록 해줍니다. 43

액티비티의 콜백 메소드를 구현해주어야 합니다. 콜백 메소드 중 가장 중요한 메소드 두 개만 미리 볼까요? oncreate() 이 메소드는 반드시 구현해 줘야 합니다. 그래야 시스템이 이 메소드를 호출해서 액티비티를 생성해 줄테니까요. 이 메소드안에서 여러분은 액티비티의 기본적인 컴포넌트들을 초기화 해주면 되며, 꼭 기억해야 할 것은 액티비티의 사용자 인터페이스 레이아웃을 로드할 수 있도록 setcontentview() 메소드를 반스시 호출해줘야 한다는 것입니다. onpause() 나중에 액티비티의 라이프 사이클에 대해 자세히 알아보겠지만, 액티비티가 일시적인멈춤 상태가 되든, 동작을 멈추든, 소멸되든 항상 최초로 호출되어지는 메소드가 onpause()입니다. 그래서, 사용자 관련 정보들을 보관해 두려면 이 메소드에서 해줘야 가장 안정적입니다. 44

사용자 인터페이스도 작성해 주어야 하고... 액티비티의 사용자 인터페이스는 View 클래스로부터 파생된 뷰 객체 계층에 의해 제공됩니다. 각각의 뷰는 액티비티 윈도우 내에 특정 사각형 공간에 대한 컨트롤을 담당하고 사용자 상호 작용에 응답합니다. 안드로이드는 다수의 이미 만들어진 뷰를 제공해서 여러분이, 여러분의 레이아웃을 디자인 하고 구성할 수 있도록 해줍니다. 위젯(widget) 처럼 버튼, 텍스트 필드, 체크 박스, 또는 이미지같은 시각적인(혹은 대화형의) 구성 요소일 수도 있고, 레이아웃(layout) 처럼 위젯의 위치나 구획을 배치하는 모델일 수 도 있습니다. 레이아웃을 정의하는 가장 일반적인 방법은 XML형태의 레이아웃 파일을 이용하는 것입니다. 이렇게 함으로써 액티비티의 행동(behavior)을 정의하는 소스코드와 유저 인터페이스 디자인에 관련된 부분을 서로 분리해서 유지할 수 있도록 해줍니다. 45

Manifest 파일에 액티비티를 선언해 줘야 합니다. 아래의 소스 코드(AndroidManifest.xml)를 보면서 액티비티가 어떻게 선언되어 있는지 볼까요? <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="android.example.myfirstandroidapp" android:versioncode="1" android:versionname="1.0"> <uses-sdk android:minsdkversion="10" /> <application android:icon="@drawable/icon" android:label="@string/app_name > <activity android:name=".myfirstandroidapplicationactivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.main" /> <category android:name="android.intent.category.launcher" /> </intent-filter> </activity> </application> </manifest> 46

알아두고 넘어갑시다! Task and Back Stack 어플리케이션에는 다수의 액티비티가 포함되고, 각각의 액티비티는 사용자가 수행할 특정 액션을 수행하거나 아니면 다른 액티비티를 실행시키는 등의 일을 수행하도록디자인이 됩니다. 디바이스에 있는 다른 어플리케이션의 액티비티를 실행하게 할 수도 있죠. 예를 들어 설명해 보겠습니다. 여러분의 어플리케이션에서 이메일을 보내려고 합니다. 그럼 여러분은 이메일 보내기 를 수행할 인텐트를 정의하게 되는데, 여기에는 이메일 주소는 물론 이메일의 내용 등 추가정보가 더해지겠죠. 그럼 그런 종류의 인텐트를 처리할 수 있도록 선언된 다른 어플리케이션의 액티비티 하나가 그 인텐트를 엽니다(다수의 액티비티가 그런 종류의 인텐트를 처리할 수 있다면 시스템은 그 중의 하나를 사용자가 선택하도록 합니다). 그리고, 그 이메일 어플리케이션의 메일 쓰기 액티비티가 시작되고, 그 액티비티가 이메일을 다 보내면, 여러분의 액티비티가 다시 시작됩니다. 이러한 과정은 마치 하나의 어플리케이션 에서 이루어지는 것처럼 사용자에게 보여집니다. 다른 어플리케이션에 있는 두 개의 액티비티가 마치 하나의 어플리케이션이 실행되는 것처럼 처리되는 것, 어떠한 방식으로 이것을 처리했을지를 이제부터 설명하려 하는 것입니다. 결론부터 말하자면, 안드로이드는 원활한 사용자 경험(UX, user experience)을 유지하기 위해, 동일한 태스크(task)내에 두 개의 액티비티를 모두 두고 처리 합니다. 47

알아두고 넘어갑시다! Task and Back Stack 어떤 일을 수행할 때 사용자와 상호 작용하는 액티비티들의 모음이 태스크(task)이며, 액티비티들은 액티비티가 열린 순서대로 스택(stack) 에 정렬이 됩니다. 좀 더 상세히 알아볼까요? 디바이스의 홈 스크린(home screen)이 태스크의 시작 지점입니다. 사용자가 어플리케이션 런쳐 아이콘을 터치하면(혹은 홈 스크린의 단축 아이콘), 그 어플리케이션의 태스크가 전면에 나오게 됩니다. 만약 어플리케이션이 최근에 사용된 일이 없어서 그 어플리케이션을 위한 태스크가 없다면, 새로운 태스크가 생성되고, 어플리케이션의 메인 액티비티가 스택의 가장 아래(root)에 놓입니다. 현재의 액티비티가 다른 액티비티를 시작하게 하면, 새로운 액티비티는 스택의 가장 위에(top) 올라가게 되고 사용자의 포커스를 갖게 됩니다. 이전 액티비티는 여전히 스택에는 남아있지만 멈춰지죠. 액티비티가 멈춰지더라도 시스템은 그 액티비티의 사용자 인터페이스 상의 상태 정보들을 모두 간직해 둡니다. 그래서, 사용자가 BACK 키를 눌러 현재 가장 위에 있던 액태비티가 스택에서 제거되고(popped), 그 밑에 있던 액티비티가 포커스를 갖게 될 때, 그 액티비티를 다시 시작하기 위한 정보로 활용하게 되죠. 한 가지 기억해야할 것은 스택 안의 액티비티들은 절대로 재정렬 (rearrange)되지 않는다는 것입니다. 오직 푸쉬(push)되고 팝(pop)되기만 할 뿐입니다. 48

스택안의 현재 액티비티에 의해 새로운 액티비티가 시작하면 스택에 푸쉬(push)되고, 사용자가 BACK 키를 눌러 해당 액티비티를 떠나면 팝(pop)되는 거죠. 이렇게 백스택(back stack)은 last in, first out 객체 구조로 동작합니다. 말이 길었는데, 그림을 통해 살펴볼까요? A presentation of how each new activity in a task adds an item to the back stack. When the user presses the BACK key, the current activity is destroyed and the previous activity resumes. 스크는 전체가 하나의 단위로 간주된다 보시면 됩니다.사용자가 새로운 태스크를 시작하거나 홈(home) 키를 눌러 홈 스크린으로 이동하면 통채로 백그라운드로 이동하죠. 백그라운드에 있을 때는 스택의 모든 액티비티가 멈춥니다. 하지만, 그냥 포커스만 잃은 것일 뿐 관련된 정보들은 손상되지 않은 상태로 유지됩니다. 그 태스크가 다시 전면(foreground)에 올라오면 사용자는 백그라운드로 내려갈 때 그대로 해당 태스크에서 수행하던 일을 그대로 수행할 수가 있습니다. 49

Two tasks: TAsk A is in the background, waiting to be resumed, while Task B receives user interaction in the foreground. A single activity is instantiated multiple times. 스택내의 액티비티는 절대로 재정렬되지는 않기 때문에, 하나의 액티비티가 스택안에 여러번 인스턴스화 될 수도 있습니다. 이전에 푸쉬되었던 인스턴스를 참조해서 사용하는 게 아니라, 새롭게 만들어서 스택에 푸쉬한다는 것이죠. 액티비티가 한 번 이상 인스턴스화 되지 못하도록 할 수도 있습니다. 이것은 태스크 관리하기 부분에서 자세히 살펴볼 것입니다. 50

액티비티에 대해 좀 더 자세히 알아봐야 할 것 같습니다. Activity 클래스를 상속하는 나만의 Activity를 만들고, 사용자 인터페이스를 정의한 다음에, manifest파일에 그 액티비티를 선언 하는 방법을 보았습니다. 하지만, 이렇게 간단하지만은 않죠? 액티비티가 하나 뿐인 어플리케이션은 없다고 봐야하고, 우리가 실제 예제에서 구현해 본 액티비티의 콜백 메소드도 oncreate()뿐이잖아요? 액티비티의 라이프 사이클은 연관된 다른 액티비티의 동작(TASK와 BACK STACK 내에서의 활동)과 아주 밀접하게 관련되어 있기 때문에, 액티비티의 기본 라이프 사이클은 물론, 다른 액티비티와 연관되어 벌어질 수 있는 다양한 상황에서 어떠한 상태 변화가 있고, 그 상태 변화에서 어떤 콜백 메소 가 호출될 것인지, 그 메소드가 호출된 상황에서 우린 어떤 것들을 준비할 수 있는 지를 알 고 있어야 합니다. 그래야 강력하고 유연한 어플리케이션을 디자인하고 구현해 낼 수가 있겠죠? 51

액티비티는 기본적으로 세 가지 상태로 존재할 수 있습니다. resumed 액티비티가 화면에 나타나 있는 상태이고 포커스를 가진 상태입니다. 실행중인 상태로 간주할 수 있습니다 paused 다른 액티비티가 화면에 올라오고 포커스를 가져간 상태이지만, 아직은 화면에 보이는 상태입니다. 무슨 말이냐면, 다른 액티비티가 foreground에 나왔지만, 부분적으로 투명하거나 아니면 전체 화면을 다 차지하고 있지는 않은 상태라는 뜻입니다. 멈춰진(paused) 액티비티는 완벽하게 살아있는 상태(Activity 객체가 메모리에 아직 살아있고, 모든 정보를 유지하고 있고, 윈도우 매니저에 연결된 상태)이지만, 심각한 메모리 부족에 시달리면 시스템이 종료 시켜버릴 수도 있는 상태이기도 합니다. stopped 액티비티가 완벽하게 다른 액티비티에 의해 눈에 띄지 않는 상태입니다. Stopped 상태의 액티비티는 여전히 살아있지만, 사용자에게는 더 이상 보이지도 않고, 어디선가 메모리가 필요하다 하면 강제 종료될 수도 있습니다 52

액티비티의 상태가 변화할 때, 시스템은 콜백 메소드를 통해 통보해 줍니다 모든 콜백 메소드는 액티비티의 상태가 변화할 때 적절한 작업을 수행하도록 재정의 할 수 있는 것들입니다. 어떤 것들이 있고, 기 본적으로 어떻게 구현이 되는지 볼까요? public class ExampleActivity extends Activity { @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); // The activity is being created. } @Override protected void onstart() { super.onstart(); // The activity is about to become visible. } @Override protected void onresume() { super.onresume(); // The activity has become visible (it is now "resumed"). } 53

@Override protected void onpause() { super.onpause(); // Another activity is taking focus (this activity is about to be "paused"). } @Override protected void onstop() { super.onstop(); // The activity is no longer visible (it is now "stopped") } @Override protected void ondestroy() { super.ondestroy(); // The activity is about to be destroyed. } } 주의: 콜백 메소드를 구현할 때는 어떤 다른 작업을 수행하기 전에, 상위 클래스의 해당 메소드를 반드시 먼저 호출 해 줘 야합니다 54

액티비티 라이프 사이클내에 자리잡은 세 가지 내부 순환고리라는 것도 알아두면 좋아요 oncreate()에서 시작해서 ondestroy()가 호출되는 사이에 일어나는 entire lifetime 여러분의 액티비티는 화면 레이아웃과 같은 액티비티 전반(global)에 쓰이는 정보들이 oncreate()에서 셋업되어야 하고, ondestroy()에서는 모든 남아있는 리소스들을 놔줘야 합니다. onstart()에서 시작해서 onstop()이 호출되는 사이에 일어나는 visible lifetime 이 기간 동안에는 사용자는 화면 상에 나타난 액티비티를 볼 수도 있고, 이것과 상호 작용을 할 수도 있습니다. onstop() 메소드는 다른 액티비티가 시작해서 현재의 것이 더 이상 보이지 않을 때 호출되기 때문에. 이 기간 동안 여러분은 액티비 티가 사용자에게 보여지기 위해 필요한 리소스들을 유지하도록 해줘야 합니다. 액티비티가 화면에 나왔다 뒤로 숨었다를 반복할테니, 액티비티의 entire lifetime 동안 onstart()와 onstop()은 몇 번이고 호출될 수 있습니다. onresume()에서 시작해서 onpause()이 호출되는 사이에 일어나는 foreground lifetime 이 기간동안에 액티비티는 화면상 다른 액티비티의 앞에 있게 되고 사용자 입력 포커스도 쥐게 됩니다. 디바이스가 sleep 상태가 되거나 다이얼로그가 나타나는 등의 일이 수시로 일어납니다. 이러한 잦은 변환때문에 이 두 메소드 안의 코드는 가벼워야 할 것입니다. 전환때마다 시간이 걸리면 좋지 않겠죠? 55

activity 액티비티 lifecycle과 Callback method 앞서 본 메소드들이 액티비티의 상태에 따라 호출되는 순서와 연관성을 그림으로 그려보면 오른쪽과 같습니다. 꼭 기억해 두세요. 안정성 있는 어플리케이션을 디자인하고 구현하기 위해서는 반드시 기억해야할 부분입니다. 56

액티비티 lifecycle과 Callback method, 순환고리까지 액티비티의 라이프사이클과 콜백 메소드, 방금 봤던 세 가지 형태의 순환 고리를 생각하면서 그림을 다시 살펴 보도록 합 시다. foreground lifetime visible lifetime 57

액티비티 상태변화와 Callback method호출 하나 꼭 기억할 것!!! Process!= Application 안드로이드 어플리케이션은 하나 이상의 액티비티와 그것들을 포함하는 리눅스 프 로세스이며, 어플리케이션은 프로세스 가 끝난 후 에도 살아있을 수 있습니다. 다 시 말 해, 액 티 비 티 의 lifecycle 은 프 로 세 스 의 lifecycle과 묶여 있지 않습니다. 프로세스는 액티비 티를 위 한 일 회 용 컨 테이너 일 뿐이라고 생각하면 됩니다. 58

액티비티의 콜백 메소드 간단히 보기 oncreate() 액티비티가 처음 생성될 때 호출됩니다 onstart() 액티비티가 사용자에게 보여질 때(실제 나타날 때) 호출됩니다 onresume() 액티비티가 사용자와 상호 작용(interacting)을 시작할 때 (할 수 있을 때) 호출됩니다 onpause() 시스템이 다른 액티비티를 다시 시작하려고 할 때 호출됩니다. onstop() 액티비티가 더 이상 사용자에게 보여지지 않을 때 호출됩니다 ondestroy() 시스템에 의해(메모리 부족 등의 이유로) 소멸되기 전에 호출됩니다 onrestart() 멈춰있던(stopped) 액티비티가 다시 시작할 때 호출됩니다. onpause(), onstop(), ondestroy() 메소드의 경우, 이 메소드가 실행된 후에 시스템이 프로세스를 죽일 수 있습니 다.(다른 메소드는 왠만해선 보호가 됩니다). onpause()가 실행되고 난 이후엔 어플리케이션이 간직해야하는 정보가 (제때 저장해 두지 않는 다면) 어떤 시점에 사라질 지도 모른다는 뜻도 됩니다. 따라서, 저장해야되는 정보가 있다면 onpause()메소드에서 해줘야 가장 안전합니다. 어쨌이든 onpause()는 실행될테니까요. 59

콜백 메소드는 어떤 용도로 사용하면 좋을까? oncreate() 메소드 내에서는 설정과 관련된 일회적 초기화를 수행하세요 액티비티가 처음 시작하면, oncreate() 메소드가 호출됩니다. oncreate() 메소드는 Bundle 이라는 하나의 파라메터를 갖으며 새롭게 시작하는 액티비티일 경우엔 Bundle은 null 입니다. 만약에 이 액티비티가 메모리 부족 등의 이유로 종료되었다가 다시 실행되는 경우, Bundle 은 액티비티의 이전 상태 정보를 가지고 있게 되며 그 정보들로 인스턴스화 됩니다. 레이아웃이나 변수 선언, 데이터 바인딩과 같은 설정과 관련된 일들을 oncreate()에서 수행하는 것이 좋습니다. setcontentview() 메소드 호출도 이 메소드 내에서 반드시 이루어져야 합니다. onresume() 메소드에서는 화면에 보이기전, 필요한 리소스를 찾아서 초기화 하기에 딱 좋습니다 액티비티 스택의 최상위에 오르게 되어 foreground 프로세스가 될 때, 사용자와 상호 작용을 할 수 있을 때, onresume() 메소드가 호출됩니다. 액티비티가 실행되는 데 필요한 리소스를 확인하고 찾아오기에 가장 좋은 위치입니다. 보통 그런 리소스들은 프로세스와 밀접한 것들이라서 액티비티 가 전면에 나올 때에만 사용하는 게 좋겠죠? 오디오나 비디오, 혹은 애니메이션을 실행하기에 딱 좋은 위치입니다. 그리고, onpause() 상태에서 다시 시작했을 때도 onresume()이 호출됩니다. 60

onpause() 에서는 어플리케이션의 지속적인 정보를 저장하세요 다른 액티비티가 스택의 최상위에 올라오게 되면, 현재 액티비티는 onpause() 메소드 호 출을 통해 스택의 아래로 내려가게 될 것을 통보 받습니다. 그러므로, onpause() 메소드 내에서 오디오나 비디오 등을 실행중이라면 멈춰야 하겠죠. 그리고 액티비티가 소멸되거나 다시 살아나지 않을 경우를 대비해 데이터를 저장하는 등의 일이 이루어져야 합니다. 일반적으로 onresume()에서 획득된 리소 스를 onpause() 에서 놔 줍니다. onpause() 메소드가 완료되기 전까지는 다음 액티비티가 화면상에 나타나지 않습니다. 항상 액티비티가 운영체제에 의해 종료될 때를 대비해야 합니다 화면에 나타나지 않은 액티비티들은 언제 종료될 지 모릅니다. 옆에 그림에서 보듯 onpause()가 호출된 다음에도 액티비티가 종료될 수 있습니다. onstop(), ondestroy() 가 호출되지도 않은 상태에서 말이죠. 그러므로, 가능한 onpause()에서 리소스들을 놔주거나, 저장할 게 있으면 저장하도록 하 세요. 61

액티비티의 프로세스는 언제 죽을 지 몰라요. 하지만, 액티비티가 강제로 죽는 걸 피할 수는 있습니다. Foreground에 있으면 죽지 않아요. 메모리가 모자라는 상황이 되면, paused, stopped, destroyed 상태인 액티비티의 프로세스는 안드로이드 운영체제가 죽일 수가 있습니다. 이말은 전면(foreground)에 있지 않은 액티비티는 종료(shutdown) 가능하다는 뜻이기도 하고, 액티비티가 전면에 있으면 종료될 일은 없다는 뜻이기도 하네요. 백그라운드로 내려가기 전에 잡고 있던 자원을 가능한 많이 놔주면 죽을 확률도 떨어지고요. 그리고, onpause()가 호출된 후에 액티비티가 죽는다면, onstop()이나 ondestroy()가 호출되지 않습니다. onpause()에서 액티비티가 사용하던 자원을 많이 포기할 수록, 백그라운드에 있는 동안 액티비티의 프로세스가 죽을 가능성이 적어질 것입니다. 혹시나 죽더라도 너무 걱정은 마세요.onSaveInstanceState()이 있거든요. 액티비티가 죽어도 액티비티 스택에서 액티비티가 제거 되는 것은 아닙니다. 대신, 그 액티비티가 onsaveinstancestate()를 구현해서 사용하고 있다면 액티비티의 상태 정보를 Bundle객체에 저장할 수 있습니다. (일부 View 데이터는 자동으로 저장되므로 사용자 정의 데이터에 대해서만 그리하면 됩니다). 그리고, 나중에 사용자가 이 액티비티를 실행하면, oncreate()가 호출되면서 Bundle객체가 파라메터로 전달됩니다. 62

onpause()말고도 정보를 저장하는 또 다른 수단이 있군요! 액티비티가 일시정지(paused)되거나 멈추었을 때(stopped)에도, 액티비티의 상태 정보는 유지됩니다. Activity 객체가 여전히 메모리에 남아 있기 때문입니다. 하지만, 메모리가 부족한 상태라면 시스템은 액티비티를 소멸시켜버립니다. 메모리에 있던 Activity 객체를 없애버리는 거죠. 이렇 게 되면 시스템은 일시정지나 멈춤 상태 이전의 액티비티 정보로 다시 액티비티를 시작하게 할 수가 없습니다. 그 대신 사용자가 그 액티비티로 다시 돌아가고자 하면 시스템은 Activity 객체를 다시 생성하게 되죠. 하지만, 사용자는 Activity 객체가 소멸되어 버렸는지, 그 후에 다시 생성된 것인지 알 수가 없기 때문에, 아마도 소멸되기 이전의 상 태를 기대할 것입니다. 잘 디자인된 어플리케이션이라면 당연히 사용자의 기대를 져버려선 안되겠죠? 이러한 상황에서도 액티비티의 상태 정보를 보존하도록 하려면, 그러한 정보를 저장한 후 시스템이 액티비티를 재생성할 때 저장한 정보로 복구할 수 있도록 추가적인 메소드를 구현해 주면 됩니다. 그 추가적인 콜백 메소드가 바로 onsaveinstancestate() 입니다 63

onpause()에서 모두 저장하면 되는데, 왜 onsaveinstancestate()를? onsaveinstancestate()는 시스템이 리소스 부족으로 인해 부득이 하게 액티비티를 강제로 소멸시켜 야 할 경우를 대비한 것입니다. 사용자가 원해서 종료하는 것이 아니므로, 사용자의 편이를 위한다면 원래 상태로 복구해 줄 수 있어야 하지 않겠습니까? 그러한 이유로 사용자가 Back키를 눌러 액티비티를 직접 종료할 경우에는 onsaveinstancestate()를 호출하지도 않습니다. (사용자가 Back키를 눌렀다는 것은 사용자가 이 액티비티의 활동에 더 이상 관심이 없다는 것이며, 다시 원래대로 복구할 필요도 없다고 판단하여 호출하지 않는 것입니다) 그런 일들은 onpause()에서도 가능하지 않나요? 물론, 가능합니다. 하지만, 액티비티에는 다수의 View객체가 포함될테고, 그 각각의 View 객체가 갖는 일시적인 정보들, 그 외에 액티비티의 멤버 변수들도 존재할 수 있겠죠. 또한 기본적으로 관리해야 할 (어플리케이션 전체어서 사용되는) 지속적인 정보들도 있을 수 있습니다. onpause()나 onstop()에서 이 모든 것에 대한 다야한 정보를 일일이 저장하고, 나중에 해당 액티비티가 foreground도 돌아오거나 다시 생성될 때 해당 정보들로 다시 복구해야 한다면 상당히 번거롭고 복잡한 처리가 필요할 것입니다. 그래서, 액티비티의 일시적인 정보에 대해서는 그 정보를 손쉽게 저장하고, 재생성될 때 복구 또한 쉽도록 이 메소드를 준비한 것 입니다. onsaveinstancestate()은 일시적인 액티비티 인스턴스의 정보를 저장하기 위해, onpause()는 어플리케이션 에서 지속적으로 필요한 정보를 저장하기 위해 사용하시면 됩니다.. 64

onsaveinstancestate() 시스템은 액티비티가 소멸되도록 하기 이전에 이 메소드를 호출하며, Bundle 객체를 전달합니다. (Bundle 객체는 액티비티에 대 한 상태 정보를 저장할 수 있는 객체로써 putstring()이라는 메소드를 이용해서 이름-값(name-value) 쌍으로 저장합니다) 그리고 나서, 시스템이 액티비티의 프로세스를 죽이고, 이 후에 사용자가 다시 액티비티로 돌아가려 하면 oncreate() 메소드에 그 Bundle 객체를 전달해서 그 안에 담긴 액티비티의 상태 정보를 이용해서 복구하도록 할 수가 있습니다. 한 가지 주의할 점은, 액티비티가 소멸되기 전에 반드시 이 메소드가 호출된다고 보장할 수는 없다는 것입니다. 앞서 언급한 것처럼, 사용자가 Back키를 눌러서 액티비티를 종료한다면 호출이 되지 않습니다. 단순히 백그라운드로 액티비티가 물러날 때에도 당연히 호출되지 않습니다. Activity 클 래 스 는 물 론, View 계 층 내 의 모 든 것 들 은 onsavainstancestate() 메 소 드 를 이 미 구 현 하 고 있 으 며, Activity 의 onsaveinstancestate()을 호출할 경우 액티비티에 등록된 모든 View의 onsaveinstancestate()를 호출하여 해당 상태 정보들을 저장하므로, 추가적으로 저장해야하는 정보가 있을 경우에만 재정의하면 됩니다. (콜백 메소드에서 했던 것처럼, 상위 클래스의 구현메소드를 먼저 호출한 후에 추가 저장이 이루어져야 하겠죠?) 65

oncreate( ) The system recreates the activity The system resumes the activity* Activity restores the user changes Activity is running Another activity comes in front of the activity Activity is running Another activity comes in front of the activity User navigates back to the activity onsaveinstancestate( ) Activity saves the user changes onsaveinstancestate( ) Activity saves the user changes Process is killed* Activity is no longer visible User navigates back to the activity Activity is no longer visible Other applications need memory * There s no need to restore state, because the activity is intact * User changes are lost 66

onsaveinstancesate() 호출 시점 onsaveinstancestate()에 대한 호출은 onstop() 이 호출되기 전에 이루어지며, onpause() 이전에 이 루어 질 수도 있 으나 그것 들 보장할 수는 없습니다 67

액티비티 간단 요약 액티비티 하나로만 끝나는게 아니라 어플리케이션에는 다양한 액티비티가 다수 존재할테고 이 액티비티간의 협업으로 원하는 일이 이루어질텐데 그럼 액티비티와 액티비티간에 대화도 필요할테고.. 이걸 효과적으로 처리하기 위해선 어떻게 해야하나... 이런 고민? 그것을 다음 장부터 설명하려고 합니다. 68

참고 69

안드로이드 에뮬레이터 안드로이드 SDK에 포함된 에뮬레이터는 실제 디바이스가 아닌 윈도우나 맥, 리눅스 같은 운영체제 위에서 앱을 실행할 수 있도록 해 줍니다. 에뮬레이터에서 앱을 실행하기 전에 먼저 안드로이드 가상 디바이스(AVD, Android Virtual Device)를 생성해 줘야 합니다. 여러분이 테스트해 보고자 하는 디바이스의 특성(하드웨어나 스크린 사이즈 등)을 정의하는 별도의 AVD를 생성해 줄 수도 있으며, 다수의 디바이스 환경에서 여러분이 작성한 앱을 테스트 해보고자 한다면, 각각의 디바이스 특징에 맞게 여러 개의 AVD를 생성해서 각각 테스트 해볼 수도 있습니다 여러분이 사용하는 컴퓨터의 키보드와 마우스를 이용해서도 대부분의 안드로이드 제스쳐(gesture)와 컨트롤을 에뮬레이터 상에서도 재현할 수는 있습니다. 하지만 실제 디바이스가 아니다보니 한계가 있기도 합니다. 70

Gesture Tap Double tap Long Press Drag Swipe Fling Pinch Emulator Action Click the mouse Double-click the mouse Click and hold the mouse Click, hold and drag the mouse Click and hold the mouse, move the pointer in the swipe direction and release the mouse Click and hold the mouse, move the pointer in the flick direction and quickly release Press and hold the Ctrl key. Two circle that simulate the two touches will appear. Move the circles to the start position, click and hold the mouse and drag the circles to the end position. Android gestures on the emulator 71

Control Emulator Action Control Emulator Action Back ESc Search F5 Call/dial button F3 *(right softkey) Sift-F2 or Page Down button Camera Ctrl-KEYPAD_5, Ctrl-F3 Rotate left KEYPAD_7, Ctrl-F11 End call button F4 Rotate right KEYPAD_9, Ctrl-F12 Home Home button Toggle cell networking on/off F8 Menu(left softkey) F2 or Page Up button Volmune up button KEYPAD_PLUS, Ctrl-F5 Power button F7 Volume down button KEYPAD_MINUS, Ctrl-F6 Android hardware controls on the emulator 72

Thanks For Listening John Doe, 27 September 2011 73