04 안드로이드 응용프로그램의 구조

11,649 views
11,483 views

Published on

Published in: Technology, News & Politics
0 Comments
13 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
11,649
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
0
Comments
0
Likes
13
Embeds 0
No embeds

No notes for slide
  • Multimedia 응용프로그램에 대한 다음과 같은 사실들을 알아낼 수 있다.▒ 그 응용프로그램은 com.androidbook.multimedia라는 패키지를 사용한다.▒ 응용프로그램의 버전 이름(version name)은 1.0.0이다.▒ 응용프로그램의 버전 부호(version code)는 1이다.▒ 응용프로그램의 이름과 제목(label)은 자원 파일 /res/values/strings.xml 안의 @string/app_name이라는 문자열 자원에 저장되어 있다.▒ 응용프로그램 아이콘은 /res/drawable디렉터리에 있는 icon이라는 이미지 파일이다(그래픽형식은 PNG일 수도 있고 JPG나 GIF일 수도 있다).▒ 응용프로그램은 네 개의 액티비티들(MainMenuActivity, AudioActivity, MovingActivity,StillActivity)로 구성된다.▒ 응용프로그램의 주 진입점은 MainMenuActivity액티비티다.▒ 응용프로그램 실행에는 다음과 같은 권한들이 필요하다: 오디오 녹음 권한, 기기의 바탕화면 설정 권한, 내장 카메라 접근 권한, 설정 쓰기(변경) 권한.
  • 04 안드로이드 응용프로그램의 구조

    1. 1. 안드로이드 응용프로그램의 구조<br />CHAPTER 04<br />
    2. 2. 목 차<br />안드로이드 응용프로그램의 수명 주기<br />액티비티를 통한 태스크 수행<br />인텐트를 통한 액티비티 전환<br />클래스 이름으로 새 액티비티 띄우기<br />액션과 데이터로 인텐트 만들기<br />인텐트를 통한 추가 정보 전달<br />메뉴를 이용한 응용프로그램 액티비티들과 인텐트들의 조직화<br />서비스와 브로드캐스팅 수신자 다루기<br />안드로이드 액티비티의 수명 주기<br />액티비티 콜백을 이용한 응용프로그램 상태 및 자원 관리<br />액티비티의 정적 자료의 초기화에 적합한 onCreate()<br />액티비티 데이터의 초기화 및 준비에 적합한 onResume()<br />액티비티 자료의 중지, 저장, 해제에 적합한 onPause()<br />Activity 객체가 죽지 않게 하려면<br />액티비티의 필수적이지 않은 상태를 onSaveInstanceState()에서 Bundle에 저장<br />액티비티의 정적 자료 파괴에 적합한 onDestroy()<br />액티비티 전이 관리<br />안드로이드 매니페스트 파일을 이용한 응용프로그램 정의<br />응용프로그램의 신원 관리<br />응용프로그램의 버전 설정<br />응용프로그램의 이름과 아이콘<br />액티비티를 비롯한 응용프로그램 구성요소 등록<br />인텐트 필터를 이용해서 한 액티비티를 응용프로그램의 주 진입점으로 지정하기<br />그 외의 인텐트 필터 설정<br />서비스와 브로드캐스팅 수신자 등록<br />콘텐트 제공자 등록<br />권한 다루기<br />응용프로그램에 필요한 권한 등록<br />응용프로그램이 다른 응용프로그램에게 허락하는 권한들을 등록<br />입력에 관한 하드웨어/소프트웨어 요구사항 지정<br />라이브러리와 안드로이드 SDK 버전 다루기<br />그 외의 응용프로그램 구성 설정들<br />
    3. 3. 안드로이드 응용프로그램의 수명 주기<br />안드로이드 응용프로그램 개발에 쓰이는 용어들을 소개<br />안드로이드 응용프로그램의 전반적인 작동 방식<br />다른 안드로이드 응용프로그램과의 연동 방식<br />
    4. 4. 액티비티를 통한 태스크 수행<br />하나의 액티비티은 응용프로그램이 수행하는 고유한 하나의 태스크 또는 작업을 뜻한다.<br />안드로이드에서 액티비티는 Activity 클래스(android.app.Activity)로 대표된다.<br />응용프로그램의 화면마다 액티비티를 정의하고 구현하는 데 많은 시간을 들이게 된다.<br />간단한 게임 프로그램을 구성하는 다섯 개의 액티비티<br />시동 화면<br />응용프로그램의 주 진입점 역할을 한다. 구체적으로, 잠시 동안 응용프로그램의 이름과 버전 정보를 표시한 후 응용프로그램의 주 메뉴로 들어간다.<br />주 메뉴 화면<br />사용자가 응용프로그램의 핵심 액티비티들 중 하나를 선택할 수 있게 한다.<br />게임 플레이 화면<br />실제 게임 플레이가 벌어지는 화면에 해당한다.<br />고득점 화면<br />게임 고득점들을 표시한다.<br />도움말/프로그램 정보 화면<br />사용자가 게임을 플레이하기 위해 알아야 할<br />정보를 표시한다.<br />액티비티<br />액티비티<br />액티비티<br />액티비티<br />액티비티<br />
    5. 5. 인텐트를 통한 액티비티 전환<br />하나의 인텐트는 “이것”(Uri가 나타내는, 액션의 대상)에게 “이 일”(Action, 액션)을 하고자 한다는 의도(Intent, 인텐트)를 나타낸다.<br />하나의 안드로이드 응용프로그램에 여러 개의 진입점들이 존재할 수 있다.<br />안드로이드 응용프로그램에서는 여러 액티비티들 중 응용프로그램 시동시 기본으로 실행될 주 액티비티(main activity)을 설정할 수 있다.<br />이 설정은 AndroidManifest.xml 파일에서 한다<br />특정 액티비티가 특정 조건에서 시동되게 설정하는 것도 가능하다.<br />예를 들어 음악 응용프로그램이라면 응용프로그램 메뉴에서 실행할 범용적인 액티비티뿐만 아니라, 재생 목록 ID에 따라 특정 재생 목록에 접근한다거나 이름에 따라 특정 아티스트에 접근하는 등의 특별한 진입점 액티비티들을 둘 수 있다.<br />
    6. 6. 클래스 이름으로 새 액티비티 띄우기<br />응용프로그램의 Context 객체에 대해 startActivity() 메서드를 호출<br />이 메서드는 인텐트형식의 매개변수 하나를 받는다.<br />다음의 코드는 명시적인 Intent 객체로 startActivity()를 호출한다.<br />startActivity(new Intent(getApplicationContext(), MyDrawActivity.class));<br />이 Intent 객체는 MyDrawActivity라는 액티비티클래스에 해당하는 액티비티을 요청한다.<br />그냥 현재 액티비티에서 다른 어떤 액티비티으로 넘어가는(이를 전이[transition]라고 한다) 정도라면 이처럼 간단한 코드로 충분하다.<br />“인텐트” 메커니즘을 훨씬 더 견고한 방식으로 사용할 수도 있다. 예를 들어 Intent 객체를 통해서 액티비티들이 자료를 주고받게 할 수도 있다.<br />
    7. 7. 액션과 데이터로 인텐트 만들기<br />인텐트 필터(intent filter)를 이용 특정 조건에따라 액티비티를 선택하게 하는 방식도 가능하다.<br />Intent 객체는 크게 두 부분으로 구성된다.<br />수행할 액션<br />그 작용에 쓰이는 데이터<br />Intent 클래스에는 여러 종류의 액션들이 정의되어 있다<br />ACTION_MAIN<br />한 Activity의 주 진입점을 지정하는 데 쓰인다<br />ACTION_EDIT<br />자료의 편집에 쓰인다. 편집할 자료는 Uri로 지정한다<br />그 외에도, 브라우저나 전화 걸기(Dialer)같은 다른 응용프로그램에 속한 액티비티들과의 통합 지점을 생성하는 등의 다양한 액션들이 존재한다.<br />
    8. 8. 다른 응용프로그램에 속한 액티비티 띄우기<br />적절한 권한이 있다면 다른 응용프로그램에 있는 외부 액티비티들을 띄우는 것이 가능하다.<br />예 ) 고객 관리(CRM) 응용프로그램이라면 연락처 응용프로그램(Contacts)의 액티비티들을 이용해서 연락처 데이터베이스를 조회하고, 특정 연락처를 선택하고, 그 연락처의 고유 식별자를 가져오는 등의 작업을 할 수 있다.<br />외부 액티비티를 시동하는 간단한 인텐트객체를 만드는 방법을 보여주는 코드<br />Uri number = Uri.parse(tel:5555551212);<br />Intent dial = new Intent(Intent.ACTION_DIAL, number);<br />startActivity(dial);<br />흔히 쓰이는 안드로이드 Google 응용프로그램에 관한 여러 액션 종류들과 관련 URI 형식 정리<br />http://d.android.com/guide/appendix/g-app-intents.html<br />개발자들이 직접 참여해서 만드는 인텐트 프로토콜 목록 사이트<br />http://www.openintents.org/en/intentstable<br />
    9. 9. 인텐트를 통한 추가 정보 전달<br />Intent 객체에 추가적인 자료를 포함시키는 것도 가능<br />Intent 객체의 Extras 멤버는 Bundle 형식의 객체를 담는다.<br />Intent 클래스는 그 Bundle 객체에 이름/값 쌍을 저장하거나 조회하기 위한 편의용 메서드들도 제공한다.<br />다음은 Intent 객체에 string 값 하나와 boolean값 하나를 추가하는 예이다.<br />Intent intent = new Intent(this, MyActivity.class);<br />intent.putExtra("SomeStringData","Foo");<br />intent.putExtra("SomeBooleanData",false);<br />
    10. 10. 메뉴를 이용한 응용프로그램액티비티들과 인텐트들의 조직화<br />주 메뉴(main menu)<br />일종의 스위치처럼 작동<br />각 메뉴 항목은 응용프로그램의 각 액티비티을 띄운다<br />예) “게임 플레이” 액티비티를 위한 메뉴 항목, “고득점” 액티비티를 위한 항목, “도움말” 액티비티를 위한 항목 등.<br />드릴다운(drill-down, 펼침 메뉴)<br />일종의 디렉터리처럼 작동<br />하나의 메뉴 항목은 하나의 액티비티에 해당하나, 펼쳐서 나오는 하위항목마다 각자 다른 데이터가 인텐트를 통해서 액티비티에 전달된다.<br />예) 데이터베이스 레코드에 대한 드릴다운 메뉴에서 특정 항목을 선택하면 “레코드 편집” 액티비티가 실행되되, 그 액티비티에게 해당 항목의 ID가 전달되는 식이다.<br />
    11. 11. 서비스와 브로드캐스팅 수신자 다루기<br />서비스 (Service)<br />안드로이드에서 서비스는 사용자 인터페이스가 없는 액티비티<br />백그라운드 프로세스로 실행<br />서드파티의 요청들을 처리하는 웹 서버와 아주 비슷한 방식<br />인텐트를 통해서 실행<br />관련 메서드 :startService(),bindService()<br />안드로이드 응용프로그램이 제공하는 서비스들은 반드시 안드로이드 매니페스트 파일에 등록되어야 한다.<br />브로드캐스팅 (broadcasting, 브로드캐스팅)<br />안드로이드 시스템 전체에 특정 메시지를 브로드캐스팅하는 용도로 Intent 객체를 사용<br />해당 메시지에 관심이 있음을 표명했던 응용프로그램들 모두에게 그 메시지가 전달된다<br />이 때 브로드캐스팅 수신자를 뜻하는 BroadcastReceiver객체가 쓰인다.<br />한 프로그램이 브로드캐스팅의 송신과 수신을 모두 수행하는 것도 가능<br />일반적으로 이런 종류의 Intent 객체는 좀 더 넓은 범위의 대상들에게 특정 사건을 알리는 용도로 쓰인다.<br />Intent에는 이런 용도를 위한 여러 작용 종류들이 정의되어 있다.<br />배터리 수준이 낮아지면 Intent.ACTION_BATTERY_LOW액션이 지정된 Intent 객체가 브로드캐스팅된다.<br />배터리/충전 수준의 변화에 반응할 필요가 있다면, 액션이 ACTION_BATTERY_CHANGED인 Intent 객체의 브로드캐스팅을 들어야 한다.<br />그 외에도 SD 카드의 상태 변화라던가 응용프로그램 설치, 제거, 바탕화면 변화 같은 여러 시스템 사건들에 대한 브로드캐스팅용 Intent 객체들이 있다.<br />
    12. 12. 안드로이드 액티비티의 수명 주기<br />주어진 한 시점에서 단 하나의 응용프로그램 액티비티만이 포어그라운드에서 실행 됨<br />안드로이드 운영체제는 현재 실행 중인 모든 Activity 객체들을 액티비티 스택(activity stack)이라는 자료구조에 담아서 관리한다.<br />새 액티비티가 시작되면<br />스택 제일 위에 있던 Activity 객체(현재 포어그라운드 액티비티에 해당)가 정지되고(paused)<br />새 액티비티에 해당하는 Activity 객체가 스택 제일 위에 추가된다.<br />그 액티비티가 끝나면 해당 Activity 객체가 스택에서 제거되고<br />이전의 Activity 객체가 실행을 재개한다.<br />안드로이드 응용프로그램들은 자신의 메모리, 자원, 데이터뿐만 아니라 자신의 상태도 관리해야 한다.<br />특히 안드로이드 응용프로그램은 매끄럽게 정지, 재개할 수 있어야 한다.<br />* 수명 주기(life cycle) : 한 액티비티가 생성되고 소멸되기까지의 일생<br />
    13. 13. 액티비티 콜백을 이용한응용프로그램 상태 및 자원 관리<br />액티비티 시작이<br />요청됨<br />onCreate()<br />OnStart()<br />onRestart()<br />액티비티가 포어그라운드가 됨<br />액티비티가<br />백그라운드로 감<br />onResume()<br />액티비티가 포어그라운드에서<br />실행됨<br />메모리에서<br />액티비티가<br />삭제됨<br />액티비티가<br />포어그라운드에서 실행됨<br />액티비티가<br />포어그라운드가 됨<br />액티비티가 백그라운드로 감<br />onPause()<br />onStop()<br />onDestroy()<br />
    14. 14. 액티비티의 정적 자료의 초기화에 적합한 onCreate()<br />하나의 액티비티가 처음 시작되면 해당 Activity 객체의 onCreate() 메서드가 호출된다.<br />onCreate() 메서드는 Bundle 객체 하나를 매개변수로 받는다.<br />새로 시작된 Activity의 경우에는 널(null)이 전달된다.<br />주어진 액티비티가 메모리상의 이유로 삭제되었다가 다시 시작된 것이라면 이 Bundle 객체에는 해당 액티비티의 이전 상태 정보가 들어 있게 된다.<br />따라서 액티비티는 그 정보를 이용해서 이전 상태를 복원할 수 있다.<br />흔히 onCreate() 메서드에서는 레이아웃과 데이터 바인딩(data binding) 같은 초기 설정 작업(이를테면 setContentView() 메서드 호출 등)을 수행한다.<br />
    15. 15. 액티비티 데이터의 초기화 및 준비에 적합한 onResume()<br />한 액티비티가 액티비티 스택의 제일 위에 놓이고 액티비티 프로세스가 되면 onResume() 메서드가 호출된다.<br />액티비티의 실행에 필요한 자원들(독점 자원이든 공유 자원이든)을 준비하기에 가장 적합<br />액티비티가 포어그라운드에 있을 때에만 자원들을 유지<br />자원들을 유지하는 데에는 비용이 많이 들기 때문에<br />
    16. 16. 액티비티 자료의 중지, 저장, 해제에 적합한 onPause()<br />다른 액티비티에 의해 액티비티 스택 최상단에서 백그라운드로 밀려나게 될 때 밀려나는 액티비티의 onPause() 메서드가 호출된다.<br />중단<br />이 메서드에서 액티비티는 onResume() 메서드에서 재생을 시작한 오디오나 동영상, 애니메이션을 중단해야 한다.<br />데이터베이스의 커서(Cursor 객체) 같은 자원들도 비활성화해야 한다(자원들을 직접 관리하는 경우).<br />해제<br />onPause() 메서드는 액티비티가 백그라운드에 있는 동안 필요하지 않은 자원들을 해제할 마지막 기회이기도하다.<br />이 시점 이후에 응용프로그램의 실행이 재개되지 않을 수도 있으므로, 여기서 중요한 자료를 저장하거나 마무리할 필요가 있다.<br />저장<br />사용자가 한 필드를 입력하는 즉시 데이터를 저장하는 것이 가능하다.<br />이렇게 하면 사용자 인터페이스와 onPause() 메서드가 간단해진다.<br />취소를 위한 버튼은 제공해야 하지만, 저장을 위한 버튼은 생략할 수 있다.<br />
    17. 17. Activity 객체가 죽지 않게 하려면<br />메모리가 모자라는 상황이 되면, 정지 또는 중지(stop) 또는 파괴된 액티비티의 프로세스를 안드로이드 운영체제가 죽일(kill) 수 있다.<br />포어그라운드에서 실행 중인 액티비티가 강제로 죽는 일은 없다.<br />onPause() 호출 이후에 액티비티가 죽으면 onStop()과 onDestroy() 메서드가 호출되지 않을 수도 있다.<br />onPause()에서 자원을 많이 해제할수록 액티비티가 배경에서 죽을 가능성이 줄어든다.<br />액티비티가 죽어도 액티비티 스택에서 제거되지는 않는다.<br />대신 해당 Activity 객체의 상태가 하나의 Bundle 객체에 저장된다(해당 Activity가 커스텀 자료에 맞게 onSaveInstanceState()를 구현, 사용한다고 할 때).<br />또한 일부 뷰(View) 자료는 자동으로 저장된다.<br />사용자가 이후에 다시 그 액티비티를 활성화하면 onCreate() 메서드가 호출되는데, 이 때 이전에 저장해 두었던 Bundle 객체가 매개변수로 주어진다.<br />
    18. 18. 액티비티의 필수적이지 않은 상태를 onSaveInstanceState()에서 Bundle에 저장<br />메모리가 부족해서 운영체제가 액티비티를 죽이는 경우가 많다면, onSaveInstanceState() 메서드 콜백시 Bundle 객체에 상태 정보를 저장하는 것도 한 가지 방법이 된다.<br />그러나 응용프로그램의 실행에 필수적인 자료들은 onPause() 메서드에서 저장하는 것이 안전하다.<br />onSaveInstanceState() 메서드는 아직 제출되지 않은 필드 자료라던가 사용자에 대한 응용프로그램의 반응성을 높이기 위한 상태 정보 등 필수적이지 않은 정보를 저장하는 곳으로 적합하다.<br />이후 사용자가 해당 액티비티를 다시 활성화하면 그 Bundle이 onCreate() 메서드로 전달된다.<br />이를 이용해서 액티비티는 일시정지 전의 상태를 정확히 복원할 수 있다.<br />onStart() 콜백 메서드 이후에 onRestoreInstanceState() 콜백을 이용해서 이 Bundle의 정보를 읽는 것도 가능하다.<br />
    19. 19. 액티비티의 정적 자료 파괴에 적합한 onDestroy()<br />액티비티가 파괴되기 직전에 onDestroy() 메서드가 호출된다. <br />onDestroy() 메서드가 호출되는 이유는 두 가지이다.<br />액티비티가 자발적으로 자신의 수명을 끝내려 하기 때문<br />자원 부족 때문에 안드로이드가 액티비티를 죽이려 하기 때문<br />안드로이드 운영체제가 액티비티를 죽인 경우 해당 Activity의 isFinishing() 메서드가 false를 돌려준다.<br />이 메서드를 onPause() 메서드에서 사용할 수도 있으나, 그 시점에서 이 메서드가 true를 돌려준다고 해도 이후에 onStop()에서 액티비티가 죽을 수 있음을 주의해야 한다.<br />
    20. 20. 액티비티 전이 관리<br />한 액티비티에서 다른 액티비티로 넘어가는 것을 액티비티의 전이(transition)라고 부른다.<br />때에 따라서는 액티비티 스택에 여러 개의 Activity 객체들이 존재하는 상황도 발생한다. 개발자는 그러한 액티비티 전이에 따른 액티비티의 수명 주기에 주의를 기울일 필요가 있다.<br />영구적인 액티비티 전이<br />스플래시 화면에서 주 메뉴로의 전이<br />응용프로그램 스플래시/시동 화면 액티비티는 일단 주 메뉴 액티비티가 포어그라운드를 차지하고 나면 완전히 폐기된다. <br />이런 전이에는 startActivity() 메서드와 적절한 finish() 메서드를 사용한다.<br />일시적인 액티비티 전이<br />자식 액티비티가 대화상자를 표시한 후 원래(부모)의 액티비티로 돌아가는 것<br />원래의 액티비티는 액티비티 스택에서 정지 상태에 있다가 다시 재개된다.<br />이런 전이에는 startActivityForResult() 메서드와 onActivityResult() 메서드를 사용한다.<br />
    21. 21. 안드로이드 매니페스트 파일을 이용한응용프로그램 정의<br />AndroidManifest.xml<br />안드로이드 응용프로그램마다 하나씩 존재해야 하는, 특정한 형태의XML 파일<br />이 파일은 응용프로그램의 신원(identity)에 대한 중요한 정보를 담는다. <br />응용프로그램의 이름과 버전 정보, 응용프로그램의 구성요소들, 응용프로그램의 실행에 필요한 권한들과 그 외의 응용프로그램 구성 정보<br />이 매니페스트 파일은 안드로이드 프로젝트의 최상위에 놓인다<br />Eclipse 파일 편집창에서 안드로이드 매니페스트 파일을 연 모습.<br />안드로이드 매니페스트 파일의 XML을 직접 수정.<br />
    22. 22. 안드로이드 매니페스트 파일을 이용한응용프로그램 정의<br />안드로이드 매니페스트 파일들은 대부분 루트 요소가 <manifest>이고 그 안에 <application> 요소가 하나 존재한다.<br />다음은 Multimedia라는 응용프로그램의 AndroidManifest.xml 파일이다.<br /><?xml version="1.0" encoding="utf-8"?><br /><manifest<br />xmlns:android="http://schemas.android.com/apk/res/android"<br />package="com.androidbook.multimedia"<br />android:versionCode="1"<br />android:versionName="1.0.0"><br /><application<br />android:icon="@drawable/icon"<br />android:label="@string/app_name"<br />android:debuggable="true"><br /><activity<br />android:name=".MainMenuActivity"<br />android:label="@string/app_name"><br /><intent-filter><br /><action android:name="android.intent.action.MAIN" /><br /><category<br />android:name="android.intent.category.LAUNCHER"/><br /></intent-filter><br /></activity><br /><activity android:name="AudioActivity" /><br /><activity android:name="MovingActivity" /><br /><activity android:name="StillActivity" /><br /></application><br /><uses-permission android:name="android.permission.RECORD_AUDIO" /><br /><uses-permission android:name="android.permission.SET_WALLPAPER"/><br /><uses-permission android:name="android.permission.CAMERA"/><br /><uses-permission android:name="android.permission.WRITE_SETTINGS"/><br /></manifest><br />
    23. 23. 응용프로그램의 신원 관리<br />응용프로그램의 패키지 이름을 <manifest> 요소의 package 특성(attribute)으로 정의해야 한다.<br /><manifest<br />xmlns:android="http://schemas.android.com/apk/res/android"<br />package="com.androidbook.multimedia"<br />android:versionCode="1"<br />android:versionName="1.0.0"><br />
    24. 24. 응용프로그램의 버전 설정<br />개요<br />응용프로그램을 효과적으로 관리하기 위해서는 응용프로그램에 버전을 적절히 부여하는 것이 꼭 필요하다. 버전을 체계적으로 부여하면 혼동이 줄어들고 제품 지원과 업그레이드도 간단해진다.<br /><manifest> 요소에는 버전에 대한 특성<br />버전 이름(android:versionName특성)<br />사용자 친화적인, 개발자가 정의하는 버전 이름<br />버전 부호(android:versionCode특성)<br />안드로이드 운영체제가 응용프로그램 업그레이드를 관리하기 위해 사용하는 번호이다.<br />
    25. 25. 응용프로그램의 이름과 아이콘<br /><application>의요소<br />android:icon : 응용프로그램 아이콘<br />android:label : 응용프로그램의 사용자 친화적 제목<br /><application android:icon="@drawable/icon"<br />android:label="@string/app_name"><br />커스텀 아이콘을 부여하는 법<br />48×48픽셀 크기의 PNG 파일을 만듬<br />Drawable자원으로서 응용프로그램에 추가<br />android:icon특성에 그 아이콘 자원을 지정<br />
    26. 26. 액티비티를 비롯한 응용프로그램 구성요소 등록<br />응용프로그램의 모든 액티비티를 각각 하나의 <activity> 요소로 안드로이드 매니페스트 파일에 등록해야 한다.<br />다음은 AudioActivity라는 Activity 클래스를 정의하는 <activity> 요소이다.<br /><activity android:name="AudioActivity" /><br />이 클래스는 com.androidbook.multimedia패키지 안에 정의되어 있을 것이다.<br />액티비티마다 반드시 <activity> 요소를 정의해야 한다. 그렇지 않으면 그 액티비티는 실행되지 않는다.<br />
    27. 27. 인텐트 필터를 이용해서 한 액티비티를응용프로그램의 주 진입점으로 지정하기<br /><intent-filter><br /><activity> 요소에 인텐트 필터(intent filter)를 정의<br />이 요소에서 액션 종류를 MAIN으로, 액션 범주를 LAUNCHER로 설정하면 현재 <activity> 요소가 정의하는 액티비티가 응용프로그램의 주 진입점이 된다.<br /><activity<br />android:name=".MainMenuActivity"<br />android:label="@string/app_name"><br /><intent-filter><br /><action android:name="android.intent.action.MAIN" /><br /><category android:name="android.intent.category.LAUNCHER"/><br /></intent-filter><br /></activity><br />
    28. 28. 그 외의 인텐트 필터 설정<br />“암묵적”인텐트<br />특정 액티비티가나 구성요소를 지정하지 않는 것<br />운영체제는 그런 암묵적 인텐트들의 처리를 인텐트 필터에 기초해서 결정<br />인텐트 필터는 액티비티와 서비스들, 브로드캐스팅 수신자들에 적용된다.<br />인텐트 필터는 안드로이드 운영체제가 보낸 인텐트들 중 해당 구성요소가 받아들이는 것이 어떤 것인지를 정의한다.<br /><intent-filter><br />적어도 하나의 <action> 요소가 반드시 있어야 한다.<br />추가적으로 <category> 요소와 <data> 요소가 있을 수 있다.<br /><intent-filter><br /><action android:name="android.intent.action.VIEW" /><br /><category android:name="android.intent.category.BROWSABLE" /><br /><category android:name="android.intent.category.DEFAULT" /><br /><data android:scheme="geoname"/><br /></intent-filter><br />이 인텐트 필터는 VIEW라는 미리 정의된 액션을 사용한다.<br />이 액션은 특정 콘텐트의 내용을 표시하는 기능을 한다.<br />이 필터는 BROWSABLE이라는 범주에 속하며 “geoname”이라는 자료 스킴을 사용한다.<br />geoname://로 시작하는 Uri를 가진 인텐트가 전달되면 이 인텐트 필터를 가진 액티비티이 시동된다.<br />하나의 액티비티로 여러 가지 일을 할 수도 있다.<br />그런 경우 별칭(<activity-alias> 요소)을 이용해서 여러 인텐트 필터들과 기타 메타자료들을 적절한 그룹들로 묶음<br />
    29. 29. 서비스와 브로드캐스팅 수신자 등록<br />응용프로그램의 서비스들과 브로드캐스팅 수신자들도 안드로이드 매니페스트 파일에 등록해 두어야 한다.<br />서비스 :<service><br />브로드캐스팅 수신자 :<receiver><br />서비스와 브로드캐스팅 수신자 모두 인텐트 필터를 사용할 수 있다.<br />
    30. 30. 콘텐트 제공자 등록<br />응용프로그램이 콘텐트 제공자로 작용한다면, 그 사실을 운영체제에게 알려주어야 한다.<br /><provider> 요소를 적절히 설정해야 한다.<br />콘텐트 제공자 설정에는 공유하고자 하는 자료의 부분집합 지정, 그 자료에 접근하는 데 필요한 권한 등이 포함된다.<br />* 콘텐트 제공자 : 다른 응용프로그램들이 사용할 공유 자료 서비스를 제공하는역할<br />
    31. 31. 권한 다루기<br />안드로이드 운영체제는 응용프로그램이 자신의 프로세스 공간 바깥의 액션들에는 악영향을 미칠 수 없도록 하기 위해 응용프로그램의 능력을 적절히 제한한다.<br />안드로이드 응용프로그램은 자신만의 가상 기계의 테두리 안에서, 자신만의 리눅스 사용자 계정(그리고 관련 권한들) 하에서 작동한다.<br />
    32. 32. 응용프로그램에 필요한 권한 등록<br />안드로이드 응용프로그램에는 어떠한 권한도 기본적으로 부여되지 않는다.<br />응용프로그램이 어떤 공유 자원이나 특정 기능(연락처 DB, 내장 카메라 등)을 사용하는 방법<br />해당 접근 권한들을 안드로이드 매니페스트 파일에 명시<br />그 권한들은 응용프로그램 설치 시에 응용프로그램에 부여된다.<br />사용자가 그것들을 허락해야만 설치가 진행된다.<br /><uses-permission> <br />안드로이드 매니페스트 파일에서 권한 설정을 위한 요소<br /><uses-permission android:name="android.permission.CAMERA" /><br />Multimedia 응용프로그램의 안드로이드 매니페스트 파일 중 내장 카메라에 대한 접근을 요청<br />요청 가능한 권한들은 모두 android.Manifest.permission클래스에 정의되어 있다.<br />
    33. 33. 응용프로그램이 다른 응용프로그램에게허락하는 권한들을 등록<br /><permission> <br />안드로이드 매니페스트 파일에서 <permission> 요소를 이용해서 응용프로그램 자신만의 권한을 등록하는 것도 가능하다.<br />android:permission특성으로 특정 구성요소(활동, 서비스 등)의권한을 지정해 두면, 다른 응용프로그램들은 해당 권한이 있어야만 그 구성요소에 접근할 수 있게 된다.<br />권한들은 다음과 같은 여러 지점들에서 시행(점검 및 적용)된다.<br />활동이나 서비스를 시작할 때<br />콘텐트 제공자가 제공하는 자료에 접근할 때<br />함수 호출 수준에서<br />Intent 객체로 방송을 보내거나 받을 때<br />권한의 기본적인 보호 수준<br />보통(normal)<br />응용프로그램 안에서 권한들을 세밀하게 시행할 때 좋은 기본값이다.<br />위험(dangerous)<br />기기에 해를 입힐 수도 있는 위험한 활동들에 쓰인다.<br />서명(signature) <br />응용프로그램 자신의 것과 동일한 인증서로 서명된 응용프로그램들이 해당 구성요소에 자유로이 접근할 수 있게 하는 것으로, 통제된 응용프로그램들의 연동을 위한 것이다.<br />비슷한 권한들은 “권한 그룹”이라는 것으로 묶인다.<br />android:permissionGroup특성으로 그 권한이 속할 권한 그룹을 지정할 수 있다.<br />Uri 수준에서 콘텐트 제공자 권한을 시행<br /><grant-uri-permissions> 요소를 이용하면 Uri 수준에서 권한들을 세밀하게 시행할 수 있다.<br />
    34. 34. 입력에 관한 하드웨어/소프트웨어 요구사항 지정<br /><uses-configuration> 요소가 지원하는 여러 구성 특성들<br />
    35. 35. 라이브러리와 안드로이드 SDK 버전 다루기<br />최소 안드로이드 SDK 버전 지정<br />기본적으로 안드로이드 응용프로그램은 안드로이드 SDK의 풀 버전들 모두와 호환된다고 가정된다.<br />특정 버전의 안드로이드 SDK가 꼭 필요한 응용프로그램이라면 그러한 사실을 <manifest> 요소<br />안에서 <uses-sdk> 요소로 명시해야 한다.<br />최소 버전 지정 : <uses-sdk> 요소의 android:minSdkVersion이라는 특성에 해당하는 SDK의 API 수준 번호를 지정<br />예1) 안드로이드 SDK 1.1(릴리스 1) :API 수준 2<br /><uses-sdkandroid:minSdkVersion="2" /><br />예2) 안드로이드 SDK 1.5 : API 수준 3<br /><uses-sdkandroid:minSdkVersion="3" /><br />응용프로그램을 안드로이드 마켓에 발행하기 위해 꼭 필요<br />다른 패키지 링크<br />모든 안드로이드 응용프로그램은 기본적으로 표준 안드로이드 패키지들(android.app 등)에 링크 되고, 자신의 패키지를 인식한다.<br />응용프로그램을 다른 추가적인 패키지들과 링크하려면<br /><application> 요소 안에 <uses-library> 요소로 등록<br /><uses-library android:name="com.mylibrary.stuff" /><br />
    36. 36. 그 외의 응용프로그램 구성 설정들<br /><application> 요소의 여러 특성들을 통해서 응용프로그램 전역 테마들을 설정<br /><instrumentation> 요소를 통해서 응용프로그램의 계장(計裝, instrumentation) 속성들을 설정할 수 있다.<br />안드로이드 문서 참고<br />* 계장 : 소프트웨어 개발에서 말하는 계장은 검사나 계측, 진단 등을 위해서 특정한 코드를 응용프로그램에 암묵적으로 삽입하는 것을 말한다. 구체적인 내용은 안드로이드 SDK의 문서화를 참고하기 바란다.<br />

    ×