Programming/Android2013. 9. 29. 19:16

Android Development - Application Fundamentals (2/2)


메니페스트 파일(The Manifest File)

참조: http://developer.android.com/guide/components/fundamentals.html


AndroidManifest.xml 파일을 읽음으로 다른 컨포넌트의 존재를 인지할 수 있다. 프로젝트 루트 디렉토리에 이 파일이 존재하며 앱이 사용하는 모든 컨포넌트는 이곳에 선언되어야 한다.


다음과 같은 컨포넌트 왜 다른 것들도 이곳에 선언된다

-  인터넷 접속이나 사용자 연락처 정보 접속같은  앱에 대한 요구 허용

- 앱이 사용하는 API으로 된 앱의 최소 버전 정보

- 카메라, 블루투스 서비스, 멀티 터치 등 앱에의해 사용되거나 요구되는 하드웨어, 소프트웨어 정보

- 구글 맵 라이브러리 같은 링크되어있는 앱에서 사용되는 API 라이브러리

- 기타 정보


컨포넌트 선언 (Declaring components)

- 액티비티: <activity>

- 서비스: <service>

- 브로드케스트 리시버: <receiver>

- 콘텐트 프로바이더: <provider>


액티비티, 서비스, 콘텐트 프로바이더는 메니페이스파일에 선언되어야하지만 브로드케스트 리시버는 이곳에 선언되어도 되고 아니면 코드에 BroadcastReceiver 추상클래스의 객체로 생성된 후 registerReceiver() 메서드로 시스템에 등록될 수 있다.


컨포넌트 선언 능력(Declaring component capabilities)

컨포넌트를 실행을 위해 Intent 객체를 인스턴스화 할때 직접 그 컨포너트를 명시할 수 있다. 그러나 Intent의 진정한 힘은 그 대상 컨포넌트를 숨기는 것이다. intent의 행동에서, 행동의 타입을 간략하게 정의하고 이 행동을 실행할 수 있는 기기의 컨포넌트를 시스템이 찾는것을 허용할 수 있다. intent에의해 명시된 행동을 실행할 수 있는 다수의 컨포넌트가 있다면, 사용자는 이중 하나를 고를 수 있다.


intent에 응하는 컨포넌트를 시스템이 인지할 수 있는 방법은 다른 앱이나 기기의 메니페스트 파일에 주어진 <intent-filter> 태그로 intent를 구별할 수 있다.


예를 들어 하나의 이메일 앱에서 새로운 메일을 작성하는 액티비티는 "send" intent를 응답하기 위해 Intent 필터를 메니페스트에 선언할 수 있다. 앱의 액티비티가 "send" 행동(ACTION_SEND)을 포함한 intent를 만들 수 있다. startActivity() 메소드를 실행시키면서 실행시킬때, 시스템이 이메일 앱의 "send" 액티비티를 찾고 이것을 시작할 수 있다.


나도 이걸 해석하면서 뭔말인지 모르겠어서 intent filter에 대해 검색해보았다. 결론적으로 선언방법으로 명시적/암시적 두가지 방법이 있다. 

1. 명시적 intent는 객체 인스턴스화 할때 타겟 컨포넌트를 인자로 선언하는 방법이고 

2. 암시적 intent는 메니페시트에 필터를 선언하여 intent를 받았을 때 어떤 컨포넌트를 실행할지 결정하는 방법이다.

더욱 자세한 사항은 검색 하시길~ 


앱 요구사항 선언(Declaring application requirements)

안드로이드에 만들어지는 많은 기기들이 존재하고 이 모든 기기가 똑 같은 기능을 제공하지 않는다. 앱이 필요로하는 기능의 결핍을 막기 위해, 메니페스트 파일에 기기와 소프트웨어의 요구사항을 명확하게 명시하는 것이 주용하다. 기기에 따라 대부분의 선언이 정보화 되며 Google Play같은 외부 서비스에서도  기기에서 앱을 찾기 위해 사용자에게 정보를 제공하기 위해 이 정보를 사용한다.


예를들어 만약 앱에서 카메라를 필요로 한다면 메니페스트에 이를 명시해야하고 이 명시를 보고 Google Play에서 이를 실행할 수 없는(Android 2.1 이하 혹은 카메라가 없는 기기)를 선별하여 인스톨이 가능하게 한다.


그러나 앱에서 카메라를 사용한다고 해서 이를 명시하는 것이 필수 요구사항은 아니지만 이에대한 결과에대해 체크해 보야한다.


다음은 중요한 명가지 기기 특성이다.

화면 사이즈와 농도(Screen size and density): <supports-screens>

입력 형태(Input configurations)/하드웨어 키보드 등: <uses-configuration>

기기 특정(Device features): <uses-feature>

플렛폼 버전(Platform Version): <uses-sdk>


다음 번에는 액티비티의 라이프 사이클(Managiing the Activity Lifecycle)에 대해 알아보겠다.

Posted by Brian B. Lee