APP/안드로이드프로그래밍

Android - Manifest 정리

헬로월드! 2021. 1. 9. 16:41

Manifest

모든 앱 프로젝트는**AndroidManifest.xml 파일이 필수적**이다.

Manifest는 안드로이드 애플리케이션에 대한 각종 정보를 기술한 애플리케이션 명세서이다.

가장 상위 폴더에 매니페스트 파일이 있어야하며, 이 정보는 앱이 실행되기 전에 시스템이 알아야 할 내용을 정의하고 있다.

1. <application>

<application> 태그에 타이틀이나 아이콘, 테마 등과 같은 앱 자체의 정보를 속성으로 지정할 수 있다. 이때 <application> 태그는 매니페스트에 반드시 하나만 있어야한다.

안드로이드 스튜디오에서 프로젝트를 만들면 처음으로 볼 수 있는 매니페스트이다.

 

<manifest> 및 <application> 은 유일하고, 다른 태그들은 여러 번 또는 안 나와도 무방하다.

<manifest> 태그가 시작되고 package="com.example.helloworld" 으로 앱 패키지를 정의한다.

<application> 태그 안에는 백업 기능 사용 여부, 아이콘, 표시되는 앱 이름, 방향 등 앱의 주요 설정 정보를 담고 있다.

<activity> 태그 안에는 intent filter 가 존재하고 <intent-filter> 태그 안에는 <action>태그와 <category> 태그가 존재하여 첫 화면을 결정한다.

2. 앱에서 사용되는 4대 컴포넌트

(액티비티, 서비스, 브로드캐스트 리시버, 컨텐트 프로바이더)

✔ 인텐트란?

어플리케이션 구성요소 간에 작업 수행을 위한 정보를 전달하는 역할을 한다.

인텐트를 가장 손쉽게 사용한 예로 액티비티 간의 화면 전환을 들 수 있다. 애플리케이션이 한 가지 액티비티만으로 이루어지는 경우는 없다. 대부분 여러 개 액티비티, 서비스 등으로 구성되어 필요한 작업을 수행하는 구조로 이루어져 있다.

이때 어떤 컴포넌트에서 다른 컴포넌트를 호출하고 싶다는 의사표현을 해야하는데

안드로이드에서 이러한 의사표현의 수단으로 인텐트 객체를 사용한다.

4대 컴포넌트는 각각 인텐트에 의해 활성화된다.

 

  • <activity> : Activity

4대 구성요소 중 하나로 Activity 를 정의한다. 사용자에게 보여주는 UI 화면이다. 하나의 어플리케이션에는 최소 1개 이상의 Activity 가 존재해야한다. manifest 파일에 선언되지 않은 Activity 는 시스템이 표시하지 않으며 실행되지 않는다.

 

  • <service> : Service

UI 없이 백그라운드 작업을 수행하는 구성요소이다. Activity 와 비교하면 이해가 쉽다. Activity 가 사용자에게 직접 보이는 화면이라면, Activity 가 종료되어 있는 상태에서도 동작하기 위해 만들어진 구성요소이다.

예를 들어, 전화 앱을 켜놓지 않은 상태에서 전화를 받을 수 있는 것은 백그라운드에서 서비스가 돌아가고 있기 때문이다.

 

  • <receiver> : Broadcast Receiver

system 전반에서 특정 이벤트에 대해 응답하는 역할을 한다. 배터리가 부족할 때, 스크린이 캡쳐될 때, 파일 다운로드가 완료되었을 때 등 이러한 행위는 broadcast receiver 를 통해 응답받을 수 있다.

다만 broadcast receiver 자체는 이벤트를 확인하는 기능만 담당할 뿐 사용자에게 이벤트를 알리지는 않는다. 개발자는 이를 알리기 위해서는 notification, Toast 를 사용하여 알림을 전달해야한다.

예를 들어, 핸드폰에서 에어팟 연결이 해제 되었을 경우 서비스에서 실행되고 있는 음악을 일시정지 시키려면, 브로드캐스트 리시버를 통해 이어폰 연결이 해제되었다는 정보를 수신하고 서비스를 종료해야한다.

 

  • <provider> : Contents Provider

앱 내에서 사용할 수 있는 데이터를 공유하기 위한 구성요소로 앱은 Content Provider에만 접근하며 필요한 데이터를 얻어올 수 있다.

일반적으로 어플리케이션에서 자료를 저장할 때 DB를 주로 사용한다. 이때 한 어플리케이션 내에 저장되어 있는 DB에는 해당 앱 외에 다른 앱이 접근하는 것이 불가능하다.

그렇다면 다른 앱이 데이터에 접근할 수 있는 방법은 없는 것인가? 그렇지 않다.

외부 어플리케이션이 마음대로 내 DB에 접근하지 못하게 하면서 동시에 내가 가진 DB 중 원하는 것들만 공유할 수 있도록 해주는 역할을 하는 것이 바로 Contents Provider 이다.

예를 들어, 전화번호부에 등록되어 있는 전화번호 데이터가 자동으로 연동되어 카카오톡에 친구가 추가된다. 이것이 가능한 이유는 전화번호부에 content provider가 전화번호부에 접근할 수 있게 해주는 것이고 카카오톡의 content resolver 가 번호를 요청하여 친구추가에 이용하는 것이다.

3. 권한 (permission)

안드로이드 앱은 민감한 user 정보나 카메라, 인터넷 등 특정 시스템 기능을 사용할 때 반드시 권한을 요청해야한다.

예를 들어, SMS 전송에 대한 권한을 요청하기 위해 Manifest 파일에 다음과 같이 설정한다.

<manifest ...> <uses-permission android:name="android.permission.SEND_SNS"/> </manifest>

4. <intent-filter>

인텐트에는 명시적 인텐트와 암시적 인텐트가 있다.

명시적 인텐트는 호출할 컴포넌트를 콕 찝어 알려주는 것이다.

암시적 인텐트는 호출할 컴포넌트를 정확하게 아는 것이 아닌 인텐트 객체 내 호출 컴포넌트를 찾을 수 있는 정보들만 들어있다.

암시적인 인텐트를 통해 사용자로 하여금 어느 컴포넌트를 사용할지 선택하도록 하고자 할 때 IntentFilter 가 필요하다.

안드로이드 시스템 내부에서 수많은 어플리케이션들에 의해 수많은 인텐트들이 발생하는데 이 중 자신에게 필요한 인텐트만 받기 위해 인텐트 필터가 필요한 것이다.

인텐트 필터가 없다고 해서 인텐트를 받을 수 없는 것은 아니다.

인텐트 필터는 암시적인 인텐트를 받을 때만 필요할 뿐 , 명시적인 인텐트는 인텐트 필터가 없어도 된다.

그렇다면 암시적인 인텐트가 필요한 이유는?

자신이 만든 컴포넌트라면 컴포넌트의 이름을 정확히 알 수 있지만, 다른 사람이 만든 컴포넌트의 이름을 알기는 어렵다. 따라서 명시적 인텐트를 사용하여 호출할 수 없다.

intent-filter 태그 안에는 action 과 category 태그가 존재한다.

인텐트 필터에 들어가는 정보는 <action>태그의 경우 MAIN 이 되어야하고 <category> 태그의 경우 LAUNCHER 되어야 한다.

5. 매니페스트 파일에 들어갈 수 있는 태그 항목들

<action> : 인텐트 필터에 작업을 추가한다.

<activity> : 액티비티 구성 요소를 선언한다.

<activity-alias> : 액티비티의 별명을 선언한다.

<application> : 애플리케이션을 선언한다.

<category> : 인텐트 필터에 카테고리 이름을 추가한다.

<compatible-screens> : 애플리케이션과 호환되는 각 화면 구성을 지정한다.

<data> : 인텐트 필터에 데이터 사양을 추가한다.

<grant-uri-permission> : 상위 콘텐츠 제공자가 액세스할 권한이 있는 앱 데이터의 하위 집합을 지정한다.

<instrumentation>: 애플리케이션과 시스템의 상호작용을 모니터링할 수 있는Instrumentation 클래스를 선언한다.

<intent-filter>: 액티비티, 서비스 또는 Broadcast Receiver가 응답할 수 있는 인텐트 유형을 지정한다. <manifest>:AndroidManifest.xml 파일의 루트 요소이다.

<meta-data> :상위 구성 요소에 제공할 수 있는 추가적인 임의의 데이터 항목에 대한 이름-값 쌍이다.

<path-permission> :콘텐츠 제공자 내에서 특정 데이터 하위 집합에 대한 경로와 필수 권한을 정의한다.

<permission> :이 애플리케이션 또는 다른 애플리케이션의 각 구성 요소나 기능에 대한 액세스를 제한하는 데 사용하는 보안 권한을 선언한다.

<permission-group> : 관련 권한의 논리적 집합에 대한 이름을 선언한다.

<permission-tree> :권한 트리의 기본 이름을 선언한다.

<provider> : 콘텐츠 제공자 구성 요소를 선언한다.

<receiver> : Broadcast Receiver 구성 요소를 선언한다.

<service> : 서비스 구성 요소를 선언한다.

<supports-gl-texture> : 앱이 지원하는 단일 GL 텍스처 압축을 선언한다.

<supports-screens> :앱이 지원하는 화면 크기를 선언하고 앱이 지원하는 것보다 큰 화면에 대해서는 화면 호환성 모드를 활성화한다.

<uses-configuration> : 애플리케이션이 요구하는 특정 입력 기능을 나타낸다.

<uses-feature>:애플리케이션이 사용하는 단일 하드웨어 또는 소프트웨어 기능을 선언한다.

<uses-library> :애플리케이션과 링크되어야 하는 공유 라이브러리를 지정한다.

<ueses-permission>: 앱이 올바르게 작동하기 위해 사용자가 반드시 부여해야 하는 시스템 권한이다.

<uses-sdk>:하나 이상의 Android 플랫폼 버전과의 애플리케이션 호환성을 API 레벨 정수로 표시할 수 있다.