안드로이드베이직 & 클래식안드로이드입문서 www.kandroid.org 운영자들풀양정수운영진김은영 김남국공동번역
목차 1. 안드로이드란무엇인가? 1.1. 주요특징 1.2. 안드로이드아키텍처 1.3. 애플리케이션 1.4. 애플리케이션프레임워크 1.5. 라이브러리 1.6. 안드로이드런타임 1.7. 리눅스커널 2. 애플리케이션기초 2.1. 애플리케이션컴포넌트 2.2. 액티비티와태스크 2.3. 프로세스와쓰레드 2.4. 컴포넌트생명주기 3. 사용자인터페이스 3.1. 개요 3.2. 레이아웃선언하기 3.3. 메뉴생성 3.4. 다이얼로그생성 3.5. UI 이벤트처리 3.6. 사용자에게통보하기 3.7. 스타일과테마적용 3.8. 커스텀컴포넌트제작 3.9. 어댑터뷰를사용한데이터바인딩 3.10. 일반적인레이아웃오브젝트 3.11. 안드로이드가뷰를그리는방법
4. 리소스와에셋 4.1. 리소스와국제화 4.2. 사용가능한리소스타입 5. 인텐트와인텐트필터 5.1. 인텐트오브젝트 5.2. 인텐트확정 6. 데이터저장공간 6.1. 프레퍼런스 6.2. 파일 6.3. 데이터베이스 6.4. 네트워크 7. 컨텐트프로바이더 7.1. 컨텐트프로바이더기초 7.2. 컨텐트프로바이더쿼리하기 7.3. 프로바이더데이터수정하기 7.4. 컨텐트프로바이더생성 7.5. 컨텐트 URI 요약 8. 보안및퍼미션 (Permission) 8.1. 보안아키텍처 8.2. 애플리케이션사인하기 8.3. 사용자 ID와파일접근 8.4. 퍼미션사용하기 8.5. 퍼미션선언및강제 8.6. URI 퍼미션
9. AndroidManifest.xml 파일 9.1. 매니페스트파일구조 9.2. 파일규약 9.3. 파일특성 9.4. <action> 9.5. <activity> 9.6. <activity-alias> 9.7. <application> 9.8. <data> 9.9. <grant-uri-permission> 9.10. <instrumentation> 9.11. <intent-filter> 9.12. <manifest> 9.13. <meta-data> 9.14. <permission> 9.15. <permission-group> 9.16. <permission-tree> 9.17. <provider> 9.18. <receiver> 9.19. <service> 9.20. <uses-configuration> 9.21. <uses-library> 9.22. <uses-permission> 9.23. <uses-sdk> 10. 그래픽 10.1. 개요 10.4. 2차원그래픽 10.5. OpenGL 을사용하는 3차원그래픽
11. 오디오및비디오 11.1. 오디오및비디오재생 11.2. 오디오캡쳐 11.3. 안드로이드지원미디어포맷 12. 로케이션과맵 12.1. 로케이션서비스 12.2. 구글맵외부라이브러리 13. App 위젯 13.1. 기초 13.2. 매니페스트에 App 위젯선언하기 13.3. AppWidgetProviderInfo 메타데이터추가하기 13.4. App 위젯레이아웃생성하기 13.5. AppWidgetProvider 클래스사용하기 13.6. App 위젯설정액티비티생성하기 14. AIDL 을사용하여원격인터페이스디자인하기 14.1. AIDL 을사용하여 IPC 구현하기 14.2. IPC 메쏘드호출하기 15. 애플리케이션사인하기 (Signing) 15.1. 개요 15.2. 사인전략 15.3. 사인을위한기초셋업 15.4. 디버그모드에서사인하기 15.5. 공식릴리즈를위해사인하기 15.6. 개인키보안유지
16. 애플리케이션버전부여 16.1. 애플리케이션버전설정 16.2. 최소시스템 API 버전지정하기 17. 배포를위한준비 : 체크리스트 17.1. 애플리케이션릴리즈준비이전단계 17.2. 애플리케이션최종컴파일이전단계 17.3. 애플리케이션컴파일이후단계 18. 애플리케이션배포하기 18.1. 안드로이드마켓에배포하기 19. 성능을위한설계 19.1. 소개 19.2. 오브젝트생성을피하라 19.3. 네이티비 (Native) 메쏘드를사용하라 19.4. 인터페이스 (Interface) 보다버추얼 (Virtual) 을선호하라 19.5. 내부적인 Getters/Setters를피하라 19.6. 캐쉬필드룩업 (Lookup) 19.7. 상수를 Final로선언하라 19.8. Caution 을가지는 Loop 문법확장을사용하라 19.9. Enums을피하라 19.10. 내부클래스를가지는패지지영역 (Scope) 을사용하라 19.11. 부동소수점을피하라 19.12. 약간의샘플성능숫자들 19.13. 마무리노트 20. 응답성을위한설계 20.1. 무엇이 ANR 을유발하는가? 20.2. 어떻게 ANR 을피할것인가?
20.3. 응답성강화하기 21. 무결절성을위한설계 21.1. 데이터를누락하지마라 21.2. 원시데이터를드러내지마라 21.3. 사용자를방해하지마라 21.4. 해야할것이많다면, 쓰레드에서하라 21.5. 단일액티비티스크린에오버로드를주지마라 21.6. 시스템테마를확장하라 21.7. UI가다양한스크린해상도에서작동하도록디자인하라 21.8. 네트워크가느리다는것을가정하라 21.9. 터치스크린또는키보드를가정하지마라 21.10. 디바이스배터리를절약하라 22. 용어집
1. 안드로이드란무엇인가? 안드로이드는운영체제와미들웨어그리고핵심애플리케이션을포함하고있는모바일디바이스를위한소프트웨어스택 Stack이다. 안드로이드 SDK 는 Java 프로그래밍언어를사용하여안드로이드플랫폼상의애플리케이션을개발하기위해필요한도구들과 API를제공한다. 주요특징 y 애플리케이션프레임워크컴포넌트에대한재사용및치환replacement 를가능하게함. y 달빅 (Dalvik) 가상머신모바일디바이스를위해최적화됨. y 통합브라우저오픈소스웹킷 WebKit 엔진기반. y 최적화된그래픽자체제작된 2D 그래픽라이브러리와 OpenGL ES 1.0 스펙 ( 하드웨어가속은선택사항임 ) 에기반의 3D 그래픽에의해강화됨 y SQLite 정형화된데이터저장공간을위한것. y 미디어지원일반적인오디오, 비디오그리고정지still 이미지포맷들을지원 (MPEG4, H.264, MP3, AAC, AMR, JPG, PNG, GIF) y GSM 테크놀로지 ( 하드웨어의존적 ) y 블루투스, EDGE, 3G와 WiFi ( 하드웨어의존적 ) y 카메라, GPS, 나침반과가속도계 ( 하드웨어의존적 ) y 풍부한개발환경디바이스에뮬레이터, 디버깅툴, 메모리및성능프로파일링그리고이클립스통합개발환경 IDE을위한플러그인포함. 14 ㅣ 1 장
2. 애플리케이션기초 안드로이드애플리케이션은 Java 프로그래밍언어로작성된다. 컴파일된 Java 코드 - 애플리케이션에필요한임의의데이터와리소스파일과함께 는 SDK 에존재하는 aapt 유틸리티에의해안드로이드패키지로묶여지며, 이렇게하나로압축된아카이브 archive 파일에는.apk 접미사가부쳐진다. 이파일은모바일디바이스에안드로이드애플리케이션을배포하고설치하기위한수단이다 ( 사용자들이자신의모바일디바이스에다운로드하게되는파일이바로이파일이다 ). 하나의.apk 파일안에있는모든코드는하나의애플리케이션으로간주된다. 다양한방법으로각각의안드로이드애플리케이션은그것자신의세계내에서in its own world 존속한다. 디폴트로모든애플리케이션은자신의리눅스프로세스내에서실행된다. 안드로이드는임의의애플리케이션코드가실행될필요가있을때그프로세스를시작시키며, 그것이더이상필요치않고다른애플리케이션이시스템자원을요구할때그프로세스를종료시킨다 shuts down. 각각의프로세스는자기자신의 Java 가상머신을가진다. 그러므로애플리케이션코드는다른모든애플리케이션코드와는격리되어실행된다. y 디폴트로각각의애플리케이션에는고유한리눅스유저user ID가부여된다. 애플리케이션을구성하는파일들은해당사용자와해당애플리케이션그자신에게만보여지도록퍼미션 permission이설정된다 - 비록, 다른애플리케이션에게도그파일을보여줄방법이있기는하지만. 두개의애플리케이션에대해동일한유저user ID를공유할수있도록배치하는것이가능하다. 그런경우에두개의애플리케이션은각자다른애플리케이션의파일을볼수있을것이다. 시스템자원을절약하기위해동일한 ID를가지는애플리케이션은또한동일한리눅스프로세스안에서실행되도록배치되며, 동일한가상머신을공유한다. 20 ㅣ 2 장
3. 사용자인터페이스 개요 안드로이드애플리케이션안에는사용자인터페이스는뷰 View 와뷰그룹 ViewGroup 오브젝트를사용하여만들어진다. 많은종류의뷰와뷰그룹이있는데, 그들각각 은뷰 View 클래스의자손들 descendant 이다. 뷰오브젝트들은안드로이드플랫폼상의사용자인터페이스를표현하는기본단위이다. 뷰클래스는텍스트필드와버튼처럼완전하게구현된 UI 오브젝트들을제공하는 위젯widget 이라불리는서브클래스에대한기반를제공한다. ViewGroup 클래스는리니어 linear, 태뷸러 tabular, 그리고랠러티비 relative 같은다른종류의레이아웃아케텍쳐를제공하는 레이아웃 layouts 이라불리는서브클래스에대한기반을제공한다. 뷰오브젝트는하나의데이터구조인데, 그구조의속성들에는스크린의특정직사각형영역에대한레이아웃파라메터들과컨텐트를저장하고있다. 뷰오브젝트는그안에있는직사각형의스크린영역에대해측정measurement, 레이아웃, 그리기drawing, 포커스변화, 스크롤링, 그리고키 / 제스쳐상호작용을제어한다. 또한뷰는사용자인터페이스내의오브젝트처럼사용자와의상호작용지점이며, 해당상호작용이벤트의리시버이다. 뷰계층구조 (Hierarchy) 안드로이드플랫폼상에서, 여러분은다음페이지에나오는그림에서보여지듯이뷰와뷰그룹노드들의계층구조를사용하는액티비티의 UI를정의한다. 이계층구조는여러분이그것을필요로하는형태에따라단순할수도복잡할수도있으며, 여러분은안드로이드에미리정의된위젯과레이아웃의집합또는여러분이직접만든커스텀뷰를사용하여그것을만들수있다. 58 ㅣ 3 장
4. 리소스와에셋 (Asset) 리소스는안드로이드애플리케이션의필수불가결한부분이다. 일반적으로. 이것들은여러분의애플리케이션에서포함해서레퍼런스하고자하는이미지, 오디오, 비디오, 텍스트문자열, 레이아웃, 테마등과같은외부요소들이다. 모든안드로이드애플리케이션은리소스를위한디렉토리 (res/) 와에셋을위한디렉토리 (assets/) 를가진다. 에셋은그것을가지는애플리케이션이매우적기때문에드물게사용된다. 여러분이원시바이트 bytes를읽을필요가있을때, 여러분은에셋으로데이터를저장할필요가있을뿐이다. 리소스와에셋에대한디렉토리모두여러분의프로젝트디렉토리의최상위에, 여러분의소스코드디렉토리와나란히존재한다. 리소스resources 와 에셋assets 의차이는외관상많지않다. 그러나일반적으로여러분은외부컨텐트를저장하기위해에셋을사용하기보다는리소스를더자주사용할것이다. 실제차이는, 리소스디렉토리에놓인어떤것은안드로이드에의해컴파일된 R 클래스를통해, 애플리케이션에의해쉽게접근가능하다는것이다. 에셋디렉토리안에있는모든것은원시파일포맷으로유지될것이며, 그것을읽기위해, 여러분은바이트스트림으로파일을읽기위한에셋매니저 AssetManager를사용해야한다. 그러므로파일과데이터를리소스 (res/) 에보관하는것은그것에대한접근을용이하게만든다. 이토픽의문서에서, 여러분은안드로이드애플리케이션에서일반적으로사용되는표준리소스의종류와여러분의코드에서그것을레퍼런스하는방법에관한정보를찾을수있을것이다. 리소스와국제화 Internationalization은, 안드로이드가프로젝트리소스를이용하는방법에대해더많이공부하기위한여러분의시작점이다. 그런다음에사용가능한리소스타입문서는다양한리소스타입의개요와그들의스펙에대한레퍼런스를제공한다. 156 ㅣ 4 장
5. 인텐트와인텐트필터 애플리케이션의핵심컴포넌트세개 - 액티비티, 서비스, 브로드캐스트리시버 - 는인텐트intent라고불리는메시지를통해서활성화된다. 인텐트메세징은동일애플리케이션내에존재하는컴포넌트또는다른애플리케이션내에존재하는컴포넌트들간의다소더딘 late( 역주 : start-up 시점이아님 ) 런타임바인딩을위한도구이다. 인텐트자체, 즉인텐트오브젝트는수행되어야하는오퍼레이션에대한추상적인설명을보유하고있는데이터구조이다 또는, 브로드캐스트의경우에는, 발생했고그리고공표된어떤것에대한것이다. 각각의컴포넌트타입에따라인텐트를전달하는별도의메커니즘이존재한다. 인텐트오브젝트는액티비티를런치하거나또는어떤것을새로수행할이미존재하는액티비티를얻기위해서, Context.startActivity() 또는 Act ivity.startactivityforresult() 에전달된다. 인텐트오브젝트는서비스를초기화하거나또는실행중인서비스에새로운지시를전달하기위해, Context.startService() 에전달된다. 유사하게, 인텐트는호출하는컴포넌트와그것의대상이되는서비스간의커넥션을확립하기위해, Context.bindService() 에전달된다. 만약서비스가아직실행되고있지않다면, 필요에따라서비스를초기화할수있다. Context.sendBroadcast(), Context.sendOrderedBroadcast(), Context.sendStickyBroadcast() 와같은브로드캐스트메쏘드들중어떤것에전달되는인텐트오브젝트는그것에관심을갖는모든브로드캐스트리시버들에게전달된다. 많은종류의브로드캐스트들은시스템코드내에서만들어진다. 각각의경우에있어서, 안드로이드시스템은인텐트에응답할적절한액티비티, 서비스, 또는브로드캐스트리시버집단을찾으며, 필요하다면그것들을인스턴스화한다. 이러한메세징시스템내에는어떤한오버랩도존재하지않는다 ; 브로드캐스트인텐트는브로드캐스트리시버에게만전달되며, 결코액티비티나서비스 200 ㅣ 5 장
6. 데이터저장공간 일반적인데스크탑운영체제는파일을다른애플리케이션이읽을수있도록저장하기위해, 모든애플리케이션이사용할수있는보편적파일시스템을제공한다 ( 아마약간의접근제한설정을가진다 ). 안드로이드는다른형태의시스템을사용한다. 안드로이드상에서, 모든애플리케이션의데이터 ( 파일을포함함 ) 는그애플리케이션에게프라이빗private하다. 하지만안드로이드는또한 - 컨텐트프로바이더를통해서 - 그것의프라이빗 private 데이터를다른애플리케이션에게보여주기위해, 애플리케이션에대한표준방법을제공한다. 컨텐트프로바이더는애플리케이션데이터에읽기 / 쓰기접근을제공하는애플리케이션의선택사항에속하는컴포넌트이다. 그읽기 / 쓰기접근은그것이부과할수도있는제약의조건에따른다. 그컨텐트프로바이더는데이터를요청하고수정하는것에대한표준구문과, 그리고리턴된데이터를읽는것에대한표준메커니즘을구현한다. 안드로이드는이미지, 오디오그리고비디오파일과개인컨택정보와같은표준데이터타입에대한다수의컨텐트프로바이더를지원한다. 컨텐트프로바이더를사용하는것에대한더많은정보에대해서는 7장. 컨텐트프로바이더를보라. 여러분이다른애플리케이션에게자신의애플리케이션데이터를내보내길원하던또는원하지않던간에, 여러분은그것을저장하는방법이필요하다. 안드로이드는데이터를저장하고가져오기위해다음의네가지메커니즘을제공한다 : 프레퍼런스 Preferences, 파일, 데이터베이스, 그리고네트워크이그것이다. 216 ㅣ 6 장
7. 컨텐트프로바이더 컨텐트프로바이더는데이터를저장하고가져오며, 그것에대한접근을모든애플리케이션에게가능하게한다. 이것은애플리케이션들간에데이터를공유할수있는유일한방법이다 ; 모든안드로이드패키지가접근할수있는보편적인저장공간은존재하지않는다. 안드로이드는일반적인데이터타입들 ( 오디오, 비디오, 이미지, 개인컨택정보, 기타등등 ) 에대한몇개의컨텐트프로바이더를포함하고있다. 여러분은 android.provider 패키지에서그것들중의몇개의목록을볼수있다. 여러분은그것들이보유하고있는데이터를위해이러한프로바이더에게쿼리 query할수있다 ( 비록, 어떤것에대해서는 여러분이데이터를읽기위한적절한퍼미션을획득해야하지만 ). 만약자기자신의데이터를퍼블릭 public하게만들고자한다면, 여러분은두가지옵션을가진다 : 자기소유의켄텐트프로바이더 (ContentProvider 서브클래스 ) 를만들거나, 또는이미존재하는프로바이더에그데이터를추가할수있다 - 만약그곳에같은타입의데이터를제어하는것이있고, 여러분이그곳에쓰기위한퍼미션을가지고있다면. 이문서는컨텐트프로바이더사용에대한소개이다. 여기에서는기본적인것들에대해간단히설명한후, 컨텐트프로바이더를쿼리하는방법, 컨텐트프로바이더에의해관리되는데이터를수정하는방법, 그리고여러분소유의컨텐트프로바이더를만드는방법을설명한다. 컨텐트프로바이더기초 컨텐트프로바이더라는덮개 cover 아래에있는데이터를실제로저장하는방법은컨텐트프로바이더를설계한사람에게달려있다. 하지만모든컨텐트프로바이더는데이터추가, 수정, 삭제와같은프로바이버를쿼리하고그결과를리턴받는보편적인인터페이스를구현한다. 222 ㅣ 7 장
8. 보안및퍼미션 (Permission) 안드로이드는각각의애플리케이션과시스템내의각영역들이, 자신의고유한프로세스상에서실행되는멀티프로세스시스템이다. 애플리케이션과시스템간의대부분의보안은애플리케이션에할당된유저User나그룹 ID와같은표준리눅스설비를통해프로세스레벨에서강제된다. 보다섬세한추가적인보안기능은퍼미션permission 메커니즘에의해제공된다. 퍼미션은특정프로세스가수행할수있는특정오퍼레이션에제약을부가한다. 그리고데이터의특정영역에대한임시적접근을부여하는 URI 별퍼미션이있다. 보안아키텍처 안드로이드보안아키텍처의핵심디자인측면에서는, 디폴트로다른애플리케이션과운영체제, 또는사용자에게나쁜영향을미칠수있는어떤오퍼레이션을수행할수있는퍼미션을가진애플리케이션도존재할수없다. 이것은 ( 컨택또는이메일과같은 ) 사용자의개인적인데이터에대한읽고쓰기및다른애플리케이션의파일에대한읽고쓰기, 네트워크상의접근, 디바이스에대한활성상태유지등을포함한다. 애플리케이션의프로세스는보안안전판 sandbox이다. 그것은기본적인안전판에의해제공되지않는추가적인기능들에필요한퍼미션을명시적으로선언하는않고서는, 다른애플리케이션에게혼란을줄수없다. 그것이요구하는이러한퍼미션들은다양한방법들로운영체제에의해제어될수있으며, 일반적으로는자동으로인증서기반으로허용하거나또는불허되며, 사용자에게확인을요청하는것에기반하기도한다. 애플리케이션에의해요청된퍼미션은그애플리케이션내에정적static으로선언된다. 그러므로그퍼미션은애플리케이션의설치전에알수있으며, 그후에는변경될수없다. 242 ㅣ 8 장
9. AndroidManifest.xml 파일 모든애플리케이션은그것의루트디렉토리에 AndroidManifest.xml 파일 ( 정확하게그이름을가짐 ) 이있어야만한다. 매니페스트는안드로이드시스템에게애플리케이션에대한필수적인정보를제공하며, 시스템은애플리케이션의코드중어떤것을실행할수있기전에그정보를가져야한다. 그중에서도특히매니페스트는다음과같은것들을한다. 그것은애플리케이션에대한 Java 패키지를명시한다. 패키지이름은애플리케이션에대한고유한식별자로서사용된다. 그것은애플리케이션의컴포넌트를기술한다 애플리케이션을구성하는액티비티, 서비스, 브로드캐스트리시버, 그리고컨텐트프로바이더. 그것은컴 포넌트각각을구현하는클래스를지정하며, 그것들의기능을공표한다 ( 예를들 어그들이취급할수있는인텐트메시지 ). 이러한선언은컴포넌트가무엇이고, 그것들이 어떤조건하에서런치될수있는가를안드로이드시스템이알게한다. 그것은어떤프로세스가애플리케이션컴포넌트를보유할것인가를결정한다. 그것은 API의보호된영역에접근하기위해, 그리고다른애플리케이션과상호작용하기위해애플리케이션이가지고있어야하는퍼미션이어떤것인가를선언한다. 그것은또한애플리케이션의컴포넌트와상호작용하기위해, 다른애플리케이션이가져야하는것이요구되는퍼미션들을선언한다. 그것은애플리케이션이실행되는동안의프로파일링과다른정보를제공하는인스트루먼테이션instrumentation 클래스를리스트한다. 이러한선언은애플리케이션이개발되어테스트되는동안에만매니페스트안에존재한다. 그것들은애플리케이션이배포되기전에제거된다. 그것은애플리케이션이요구하는 Android API의최소레벨을선언한다. 그것은애플리케이션에링크되어야할라이브러리를리스트한다. 252 ㅣ 9 장
10. 그래픽 안드로이드그래픽은커스텀 2D 그래픽라이브러리와고사양의 3D 그래픽을위한 OpenGL ES 1.0 에의해구동된다. 가장일반적인 2D 그래픽 API들이 drawable 패키지에서발견된다. OpenGL API는 Khronos OpenGL ES 패키지로부터유용하게되었으며, 더불어약간의안드로이드 OpenGL 유틸리티들가추가되었다. 프로젝트를시작할때, 여러분의그래픽에대한요건 (demand) 이무엇인지, 정확하게고려하는것이중요하다. 많은그래픽작업들은많은기술들을사용하여이루어진다. 예를들어다소정적인애플리케이션에대한그래픽과애니메이션은인터렉티비게임이나 3D 렌더링에대한그래픽과애니메이션과는매우다르게구현되어야한다. 여기서우리는여러분이안드로이드상에서그래픽을그리기위해가질수있는몇 가지옵션과그것들이어떤작업에가장잘맞는지에대해논의할것이다. 만약여러분이특별히 3D 그래픽을그리는것에대한정보를찾고있다면, 이페이지는그다지도움을주지못할것이다. 하지만캔버스를사용해서드로잉하기 (on Drawing with a Canvas) 에있는아래의정보는여러분에게뷰계층구조에드로잉 drawing 방법에대한빠른아이디어를제공할것이다. OpenGL ES API 에서제공되는안드로이드 3D 그래픽유틸리티에대한더많은정보를위해서는 3D with OpenGL(OpenGL 을사용하는 3D) 를읽고, 다른 OpenGL 문서들을참고하라. 개요여러분의옵션을고려하라 2D 그래픽을그릴때, 여러분은보통다음의두가지방법중하나로그것을할것이다. 318 ㅣ 10 장
11. 오디오및비디오 안드로이드플랫폼은여러분의애플리케이션이쉽게오디오, 비디오, 이미지를통합할수있도록다양한일반적인미디어타입에대한빌트인 build-in 인코딩 / 디코딩을제공한다. 플랫폼의미디어기능에액세스하는것은꽤수월하다 여러분은인텐트와액티비티메커니즘을사용해서그렇게할수있으며, 이메커니즘은안드로이드의나머지부분들에서도사용된다.. 안드로이드는여러분이여러유형의데이터소스에서오디오와비디오를재생할수있도록한다. 여러분은애플리케이션리소스들 (raw resources) 에저장된미디어파일들, 파일시스템에있는독립된파일들, 혹은네트워크커넥션을통해도착하는데이터스트림에서오디오와비디오를재생할수있다. 애플리케이션에서오디오와비디오를재생하려면미디어플레이어 MediaPlayer 클래스를사용하라. 또한이플랫폼은모바일디바이스하드웨어가그것에서지원되면, 여러분이오디오와비디오를녹음 ( 녹화 ) 할수있도록한다. 오디오와비디오를녹음 ( 녹화 ) 하려면미디어레코더 MediaRecorder 클래스를사용하라. 에뮬레이터는오디오와비디오를캡쳐하는하드웨어를가지고있지않지않다는것에유의하라. 하지만실제모바일디바이스는미디어레코더 MediaRecorder를통해접근할수있는이러한기능들을여러분에게제공할것이다. 안드로이드가빌트인built-in 지원을제공하는미디어포맷리스트에대해서는이후에나오는안드로이드지원미디어포맷을보라. 오디오및비디오재생 미디어는원시리소스, 시스템내의파일, 또는사용가능한네트워크 (URL) 어느곳으로부터든재생될수있다. 여러분은표준출력디바이스로만오디오데이터를재생할수있다 ; 현재그디바 340 ㅣ 11 장
12. 로케이션과맵 로케이션location기반또는맵map기반애플리케이션과서비스들은모바일디바이스사용자에게매우중요한영향력을갖는다. 여러분은이기능을 android. location 패키지와구글맵외부라이브러리를사용해서여러분의애플리케이션에만들수있다. 아래의섹션은그것에대한상세한설명을제공한다. 로케이션서비스 안드로이드는 android.location 패키지내에있는클래스를통해디바이스에의해지원되는로케이션서비스에여러분의애플리케이션이접근할수있도록한다. 로케이션 location 프레임워크의중심컴포넌트는로케이션매니저LocationManager 시스템서비스이다. 그것은아래에있는디바이스가 ( 만약로케이션기능을지원한다면 ) 위치와방향각을결정하기위한 API를제공한다. 다른시스템서비스들처럼, 여러분은로케이션매니저LocationManager를직접적으로인스턴스화해서는안된다. 대신, getsystemservice(context. LOCATION_SERVICE) 를호출함으로써시스템으로부터로케이션매니저 LocationManager 인스턴스를요청해야한다. 일단여러분의애플리케이션이로케이션매니저LocationManager에대한핸들 (handle) 을가진다면, 여러분의애플리케이션은다음의세가지의것을할수있다. y 마지막으로알고있는위치에대하여, 로케이션매니저 LocationManager가알고있는모든로케이션프로바이더 LocationProviders 리스트에게쿼리를하는것. y ( 규칙또는이름으로지정되는 ) 로케이션프로바이더 LocationProvider에현재위치에대 한주기적인업데이트를등록하거나해지하는것. y 만약디바이스가주어진위도 / 경도의주어진근접범위 ( 미터로된반경으로지정됨 ) 내 350 ㅣ 12 장
13. App 위젯 App 위젯들은 ( 홈스크린과같은 ) 다른애플리케이션내에임베디드될수있는축소된애플리케이션뷰이며, 주기적인업데이트를수신한다. 이러한뷰들은사용자인터페이스에서위젯Widget으로써불려진다. 그리고여러분은 App 위젯프로바이더를사용해서그것을배포할수있다. 애플리케이션컴포넌트는 App 위젯호스트라고불리우는다른 App 위젯을보유할수있다. 아래의스크린샷은뮤직 App 위젯을보여준다. 이문서는 App 위젯프로바이더를사용하여 App 위젯을배포하는방식을설명 한다. 기초 App 위젯을생성하기위해서는, 여러분은다음과같은것을필요로한다. AppWidgetProviderInfo 오브젝트 App 위젯의레이아웃, 업데이트빈도, 그리고 AppWidgetProvider 클래스와같은 App 위젯에대한메타데이터를기술한다. 이것은 XML로정의되어야한다. AppWidgetProvider 클래스구현여러분이브로드캐스트이벤트에기초해서프로그램적으로 App 위젯과인터 356 ㅣ 13 장
14. AIDL 을사용하여원격인터페이스디자인하기 각각의애플리케이션이자신만의프로세스에서실행되고, 여러분이애플리케이션의사용자인터페이스와는분리되어있는프로세스상에서실행되는서비스를만들수있기때문에, 가끔여러분은프로세스들간에오브젝트를전달해야할필요가있다. 안드로이드플랫폼상에서하나의프로세스는보통다른프로세스의메모리를접근할수없다. 그렇기때문에프로세스들간의대화를위해서는, 운영체제가이해할수있는프리미티브 primitive 형태로오브젝트를분해하고여러분을위해프로세스의경계를넘어서오브젝트를마샬링marshalling 할필요가있다. 마샬링을하기위한코드를작성하는것은복잡하다. 그래서우리는여러분을위해그것을해주는 AIDL 툴tool을제공한다. AIDL(Android Interface Definition Language, 안드로이드인터페이스정의언어 ) 은안드로이드디바이스에서두개의프로세스가 IPC(Interprocess Communication, 프로세스간통신 ) 를사용해서대화할수있는코드를작성하는데사용되는 IDL 언어이다. 만약여러분이다른프로세스 ( 예를들어서비스 ) 에있는오브젝트의메쏘드를호출해야하는하나의프로세스 ( 예를들어액티비티 ) 내에코드를가지고있다면, 파라메터를먀샬링하는코드를생성하는 AIDL 을사용하면된다. AIDL IPC 메커니즘은 COM 또는 Corba 와유사하지만, 보다가벼운인터페이 스에기반하고있다. 이메커니즘은클라이언트와그것의구현 implementation 간에 값을전달하기위해프록시클래스를사용한다. AIDL 을사용해서 IPC 구현하기 AIDL 을사용해서 IPC 서비스를구현하기위해서는아래의스텝을따라라. 1. 여러분의.aidl 파일을생성하라 이파일은클라이언트에서사용가능한메 쏘드들과필드들을정의하는인터페이스 (YourInterface.aidl) 를정의한다. 370 ㅣ 14 장
15. 애플리케이션사인하기 (Signing) 이문서는모바일디바이스사용자들에게여러분의안드로이드애플리케이션을 배포하기이전에사인하는것에대한정보를제공한다. 개요 안드로이드시스템은설치된모든애플리케이션이인증서를사용해서디지털적으로사인될것을요구한다. 그인증서의개인키private key는애플리케이션의개발자에의해보유된다. 시스템은그인증서를사용자가어떤애플리케이션을설치할수있는지를제어하기위해서라기보다는, 애플리케이션의제작자를식별하고애플리케이션들간의신뢰관계를확립하기위한수단으로사용한다. 인증서는인증당국authority에의해사인될필요는없다 : 안드로이드애플리케이션은자체적으로사인된인증서사용이완전히허용되며, 그렇게하는것이일반적이다. 안드로이드애플리케이션에사인하는것을이해하는데중요한점은다음과같다. 모든애플리케이션은사인되어야한다. 시스템은사인되지않은애플리케이션은설치하지않을것이다. 여러분은애플리케이션에사인하기위해자체적으로사인한인증서를사용할수있다. 인증당국은필요하지않다. 여려분의애플리케이션을배포할준비가되었을때여러분의애플리케이션을알맞은개인키로사인해야한다. 여러분은 SDK 툴tool에의해생성한디폴트키로사인된애플리케이션을배포할수없다. 시스템은인스톨시점에만사인한사람의인증서만료날짜를테스트한다. 사인된애플리케이션의인증서가애플리케이션이설치된이후에만료되더라도애플리케이션은정상적으로동작할것이다. 여러분은키를생성하고여러분의애플리케이션.apk 파일에사인하기위해서 386 ㅣ 15 장
16. 애플리케이션버전부여 버전을부여하는것은여러분의애플리케이션을업그레이드 / 유지보수하기위한 전략의중요한요소이다. 사용자는자신들의디바이스에설치되는애플리케이션버전와설치가가능한업그레이드버전에대한분명한정보를가지는것이필요하다. 다른애플리케이션들은 - 여러분이하나의묶음으로써배포하는다른애플리케이션들을포함함 - 호환성을결정하고의존도를확인하기위해, 시스템에애플리케이션버전을쿼리하는것이필요하다. 여러분의애플리케이션을배포할때사용하는서비스는사용자에게그버전을보여줄수도있도록하기위해그것의버전을여러분의애플리케이션에게질의할필요가있다. 또한배포서비스는호환성을결정하고업그레이드 / 다운그레이드관계를확립하기위해서애플리케이션버전을체크할필요가있을수도있다. 안드로이드시스템은업그레이드, 호환성, 그리고기타등등에대한제약을강제하는enforce 것과같은애플리케이션에대한애플리케이션버전정보를체크하지는않는다. 대신에사용자나애플리케이션스스로가애플리케이션에대한임의의버전제약을강제하는것에대해책임을진다. 안드로이드시스템은애플리케이션의매니페스트의 minsdkversion 애트리뷰트에나타나는시스템버전호환성을체크한다. 이것은애플리케이션이호환가능한최소한의시스템 API를지정하는것을허용한다. 더많은정보는 16 장. 애플리케이션버전부여하기의최소시스템 API 버전지정하기를보라. 400 ㅣ 11 장
17. 배포하기위한준비 : 체크리스트 애플리케이션을배포한다는것은그것을테스트하고적절하게패키징하고안드로 이드모바일디바이스사용자들에게사용가능하도록만든다는것을의미한다. 만약여러분이안드로이드디바이스에설치가가능하도록여러분의애플리케이션을배포하려고한다면, 여러분의배포준비된애플리케이션을얻기위해해야할여러가지일들이있다. 이문서는성공적인릴리지를위해여러분의애플리케이션을준비하는것에대한중요한체크포인트이다. 만약여러분이안드로이드마켓에애플리케이션을배포하고자한다면, 여러분의 애플리케이션을위한구체적준비요구사항을위해 18 장. 애플리케이션배포하기 에서안드로이드마켓에배포하기를보라. 애플리케이션을배포하는방법에대한일반적인정보는 18 장. 애플리케이션배포 하기를보라. 여러분이애플리케이션릴리지준비를고려하기전. 1. 실제디바이스에서여러분의애플리케이션을광범위하게테스트하라. 2. 여러분의애플리케이션에최종사용자라이센스동의를추가하는것을고려하라. 3. 애플리케이션의매니페스트에아이콘과라벨을지정하라. 4. 로깅과디버깅을끄고, 데이터 / 파일들을정리하라. 여러분이애플리케이션의최종컴파일을하기전. 5. 여러분의애플리케이션에버전을부여하라. 6. 알맞은암호키key를얻어라. 406 ㅣ 17 장
18. 애플리케이션배포하기 애플리케이션을배포한다는것은애플리케이션을적절하게테스트하고패키지하 며그것을안드로이드모바일디바이스사용자들에게다운로드또는사이드로드 sideload 할수있도록만드는것을의미한다. 만약여러분이 17 장. 배포하기위한준비에적힌단계들을따랐다면, 그결과는여러분의릴리즈개인키private key를가지고사인된컴파일된.apk 파일이다. 그.apk 내부에서, 애플리케이션은정확하게버전화되어있으며임의의맵뷰 MapView 엘리먼트들은.apk 를사인하기위해사용된것과동일한인증서의 MD5 fingerprint 를등록하여얻은맵 API 키Key를레퍼런스한다. 여러분의애플리케이션은이제배포할준비가되었다. 아래의섹션들은모바일디바이스사용자들에게여러분의안드로이드애플리케이션을배포하는것에관한정보를제공한다. 안드로이드마켓에배포하기 안드로이드마켓은사용자가자신들의안드로이드디바이스에안드로이드애플리케이션을쉽게찾아서다운로드할수있고개발자들에게는안드로이드사용자들에게애플리케이션을쉽게배포할수있는호스트서비스이다. 안드로이드마켓에서여러분의애플리케이션을배포하고자한다면, 여러분은먼저구글계정을사용해서서비스에등록하고서비스규정에동의해야한다. 일단여러분이마켓에등록되면, 원할때면언제라도원하는횟수만큼서비스에애플리케이션을업로드할수있으며, 그런다음여러분이준비될때그것을배포할수있다. 일단배포가되면, 사용자들은그들의안드로이드디바이스에설치된마켓애플리케이션을사용해서애플리케이션을보고, 다운로드받고, 평가할수있다. 414 ㅣ 18 장
19. 성능을위한설계 안드로이드애플리케이션은빨라야한다. 아마도그것은안드로이드애플리케이션이효율적이어야한다고말하는것이더정확할것이다. 즉, 그것은제한된컴퓨팅파워와데이터저장공간, 더작은스크린, 그리고한정적인배터리수명을가진모바일디바이스환경에서가능한한효율적으로실행되여야한다. 여러분이애플리케이션을개발할때, 여러분의듀얼코아개발컴퓨터에서실행되는여러분의애뮬레이터에서는그애플리케이션이충분히잘동작할지라도, 그것이모바일디바이스에서실행될때는그렇게잘동작하지않을지도모른다 - 심지어가장강력한모바일디바이스라도보통의데스크탑시스템의성능과일치할수는없다. 이런이유로, 여러분은다양한모바일디바이스에서가능한최고의성능을낼수있도록효율적인코드를작성하기위해노력해야한다. 일반적으로말해서, 빠르거나효율적인코드를작성한다는것은최소한의메모리할당을유지하고, 타이트한 tight 코드를작성하고, 그리고미묘하게성능이떨어질수있는어떤언어와프로그래밍문구를피하는것이다. 오브젝트 -오리엔티드object-oriented한조건에서, 이러한대부분의작업은메쏘드레벨의코드라인의실제순서, 루프, 그리고기타등등에서일어난다. 이문서는아래의토픽을다룬다. 소개 오브젝트를생성하는것을피하라. 네이티브메쏘드들을사용하라. 인터페이스 (Interface) 보다버추얼 (Virtual) 을선호하라. 버추얼 (Virtual) 보다정적 (Static) 을선호하라. 내부적인 Getters/Setters를피하라. 캐쉬필드룩업 (Lookup) 420 ㅣ 19 장
20. 응답성을위한설계 세상의모든성능테스트에서승리하는코드를작성하는것은가능하다. 그러나사용자가애플리케이션을사용하려할때그것은여전히사용자를거세게화나게하는것도가능하다. 이것들은충분하게응답하지않는애플리케이션들이다 느리다고느끼게하거나, 상당한기간동안동작하지않거나너무시간이오래걸려입력을처리하지못하는애플리케이션들이그것이다. 안드로이드에서, 시스템은사용자에게 ANR( 애플리케이션이응답하지않는다. Application Not Responding) 다이얼로그라고불리는하나의다이얼로그를사용자에게보여줌으로써일정한시간동안불충분하게응답하는애플리케이션을감시한다. 사용자는애플리케이션이계속되도록선택할수는있지만, 여러분의애플리케이션을사용할때마다이러한다이얼로그에대응해야하는것을좋게생각하지않을것이다. 그러므로시스템이사용자에게결코 ANR을표시하지않도록여러분의애플리케이션에응답성 responsiveness을디자인하는것은중요하다. 일반적으로시스템은애플리케이션이사용자입력에응답할수없을때 ANR을보여준다. 예를들어만약하나의애플리케이션이어떤 I/O 오퍼레이션 ( 자주네트워크접속 ) 상에서멈춘다면, 그러면메인애플리케이션쓰레드는들어오는사용자입력이벤트를처리할수없게될것이다. 일정시간이흐른뒤에, 시스템은애플리케이션이움직이지않는상태가되었다고결론내린다. 그리고사용자에게애플리케이션을강제종료시킬수있는옵션을주기위해 ANR을보여준다. 유사하게, 여러분의애플리케이션이복잡한메모리내의구조를만들거나, 또는게임에서다음번이동을계산하는데너무많은시간을사용한다면, 시스템은여러분의애플리케이션이움직이지않는상태라고결론내릴것이다. 위의테크닉을사용해서이러한계산을효율적으로만드는것은항상중요하다. 그러나가장효율적인코드조차도실행하는데는여전히시간이걸린다. 436 ㅣ 20 장
21. 무결절성을위한설계 여러분의애플리케이션이빠르고응답이좋다할지라도, 어떤디자인결정들은여전히사용자에게문제를야기시킬수있다 - 다른애플리케이션또는다이얼로그와계획되지않은상호작용, 데이터의부주의한손실, 의도되지않은멈춤, 기타등등때문에그럴수있다. 이러한문제점을피하기위해, 여러분의애플리케이션이실행되고여러분의애플리케이션에영향을줄수있는시스템상호작용들에있는컨텍스트를이해하는것이도움이된다. 간략하게말하자면, 여러분은시스템그리고다른애플리케이션과끊김없이상호작용하는애플리케이션을개발하기위해노력해야한다. 일반적인무결절성문제는하나의애플리케이션의백그라운드프로세스 - 예를들어서비스또는브로드캐스트리시버 가어떤이벤트에응답하는다이얼로그를팝업할때이다. 이러한현상은특히여러분이애플리케이션을에뮬레이터상에서독립적으로빌드하고테스트할때에는해가없는것처럼보일수도있다. 하지만여러분의애플리케이션이실제디바이스상에서실행될때, 여러분의애플리케이션은백그라운드프로세스가다이알로그를보여줄때사용자포커스를가지지않을수도있다. 그러므로그것은실제동작하는애플리케이션뒤에서그것의다이얼로그를보여줄여러분의애플리케이션을끝낼수있다. 또한그것은현재의애플리케이션으로부터포커스를얻을수도있으며사용자가무엇을하고있던지상관없이 ( 예를들어전화를거는것과같은 ) 그앞에다이얼로그를보여줄수있다. 이러한행동은여러분의애플리케이션또는사용자에게는영향을미치지않을것이다. 이러한문제점을피하기위해, 여러분의애플리케이션은사용자에게노티피케이션을주기위한적절한시스템설비 노티피케이션 Notification 클래스를사용해야한다. 노티피케이션을사용할때, 여러분의애플리케이션은포커스를가져가서사용자를방해하기보다는상태바 status bar에아이콘을보여줌으로써사용자에게이벤트가발생했음을알려줄수있다. 442 ㅣ 21 장
22. 용어집 용어집 아래의리스트는안드로이드플랫폼의기본적인용어들을정의하고있다..apk 파일 (.apk file) 안드로이드애플리케이션패키지파일. 각각의안드로이드애플리케이션은컴파일되어하나의파일로패키지된다. 그것은애플리케이션의코드 (.dex 파일 ), 리소스, 에셋, 그리고매니페스트파일모두를포함하고있다. 애플리케이션패키지파일은어떠한이름도가질수있지만.apk 확장자를사용해야만한다. 예를들어 : myexampleappname.apk. 편의상, 애플리케이션패키지파일은종종.apk 로언급된다. 관련 : Application.dex 파일 (.dex file) 컴파일된안드로이드애플리케이션코드파일. 안드로이드프로그램은.dex (Dalvik Executable) 파일로컴파일된다. 그것은디바이스상의하나의.apk 파일내에 zip 으로압축된다..dex 파일들은자바프로그래밍언어로작성된컴파일된애플리케이션을자동적으로변환함으로써생성된다. 액션 (Action) 인텐트Intent를발송하는것이수행하길원하는어떤것에대한설명. 액션 Action은인텐트에할당된문자열값이다. 액션문자열들은안드로이드또는제3의개발자에의해정의될수있다. 예를들어웹 URL에대한 android. intent.action.view, 또는폰을진동시키는커스텀애플리케이션에대한 com.example.rumbler.shake_phone 이있다. 관련 : Intent 452 ㅣ 22 장