안드로이드 프로젝트에는 반드시 포함되어야 하는 파일이 있다. 그것은 바로 AndroidManifest.xml파일 이다. Manifest 파일은 프로젝트의 Source Set의 루트에 위치해야 한다.
(별도의 루트를 성절하지 않았다면 src/main에 위치해야 한다.)
Manifest 파일은 앱에 대한 필수적인 정보를 Android Build Tool과 Android OS, 그리고 Google Play에 제공한다.
Manifest의 주요 속성을 알아보자.
<manifest>, <application>, <activity>, <service>, <receiver>, <provider>, <intent-filter>, <action>, <category>, <uses-permission> 순으로 정리되어 있다.
1. <manifest>
- AndroidManifest.xml 파일의 루트 요소로 단 하나의 <application> 요소를 포함해야 한다. Namespace를 지정해주는 xmlns:android 속성, package 속성을 지정한다.
2. <application>
- 1번에 나와있듯이 Manifest 파일에는 단 하나의 <application> 요소를 포함해야 한다. <application>은 앱의 각 구성요소를 선언하고 모든 구성요소에 영향을 줄 수 있는 속성을 가진 하위 요소를 포함한다. 이 중 여러 속성(icon, label, permission, process, taskAffinity, allowTaskReparenting)이 구성요소의 해당하는 속서에 기본값을 설정한다. 그 외에 속성들(debuggable, enabled, description, allowClearUserData)은 앱의 값을 전체적으로 설정하며 구성요소별로 재정의 할 수 있다.
3. <activity>
- <activity>는 앱의 시각적 사용자 인터페이스 요소를 구현하는 액티비티(Activity 하위 클래스)를 선언한다. 모든 액티비티는 Manifest 파일의 <activity> 요소를 나타내야 한다. 여기에 선언되지 않은 액티비티는 시스템에서 표시되지 않으며 실행되지도 않는다.
4. <sevice>
- <service>는 <activity>와 다르게 시각적 사용자 인터페이스가 없다. <service>는 오래 실행되는 백그라운드 작업이나 다른 앱에서 호출할 수 있는 리치 커뮤니케이션 API를 구현하는 데에 사용된다. 모든 서비스는 Manifest 파일의 <service> 요소로 나타내야 하고, <activity>와 마찬가지로 여기에 선언되지 않은 서비스는 시스템에 표현되지 않으며 실행되지도 않는다.
5. <receiver>
- <receiver>는 Broadcast receiver라고도 하는데, 이를 사용하면 앱의 다른 구성요소가 실행되고 있지 않을 때에도 시스템이나 다른 앱에서 broadcasting하는 Intent를 앱에서 수신할 수 있다. <receiver>안에 intent-filter를 정의하여 어떠한 broadcast 메시지에 반응할지 지정해 줄 수 있다.
6. <provider>
- <provider> 즉, Content provider는 앱 내의 데이터베이스를 다른 앱이 공유할 수 있도록 해주는 역할을 한다. 앱의 모든 content provider는 Manifest 파일의 <provide>요소에서 정의된다. 그렇지 않으면 시스템에서 인식되지도 않고 실행되지도 않는다.
7. <intent-filter>
- Activity, Service, Receiver가 응답할 수 있는 Intent의 유형을 지정한다. <intent-filter>는 상위 구성요소의 기능, 즉 활동이나 서비스가 할 수 있는 작업과 수신기가 처리할 수 있는 Broadcast의 유형을 선언한다. 전달되는 유형의 수신 Intent로 구성요소를 열고, 이 구성요소에 무의미한 Intent를 필터링한다.
8. <action>
- <action>은 intent-filter에 작업을 추가한다. <intent-filter>요소에 <action>요소가 하나 이상 포함되어야 한다. Intent-filter에 <action>요소가 없으면 필토가 Intent 객체를 허용하지 않는다.
9. <category>
- <intent-filter> 밑에 정의하여 component의 유형이 무엇인지 정의할 수 있다.
10. <uses-permission>
- 이는 앱을 올바르게 작동하게 하기 위해 사용자가 반드시 부여해야 하는 시스템 권한이다. <uses-permission>에 정의된 권한은 앱 설치시 해당 앱이 어떤 권한을 요구하는지를 User에게 보여준다.
11. Intent
- Intent는 구성요소 간의 통신을 할 수 있게 하는 역할을 한다. 앱에 포함된 구성요소 외에 다른 앱의 구성요소와도 통신할 수 있다.
- 명시적 Intent(자신의 의도가 명확한 Intent): 특정 Component, Activity를 명확히 특정해 실행할 경우 사용한다.
- ex) A Activity에서 B Activity 실행을 호출할 경우
- 암시적 Intent: 동작을 특정하긴 했지만 실행될 대상이 달라질 수 있는 경우 사용한다.
- ex) 특정 URL을 실행하라는 액션을 요청한 경우, 웹 브라우저 기능을 가진 다수의 앱이 호출될 수 있다.
- 명시적 Intent(자신의 의도가 명확한 Intent): 특정 Component, Activity를 명확히 특정해 실행할 경우 사용한다.