본문 바로가기

Android/공부

[Manifest 정복] 2. 매니페스트(Manifest)에서의 앱 구성 요소, 인텐트 필터, 아이콘 및 레이블

안녕하세요, 닉네임간편입니다. 앞선 시간에는 매니페스트의 간략한 개요 및 package 속성에 대해서 알아보았는데요, 이번 시간에는 뒤이어서 매니페스트에서 선언해야 하는 주요 요소들에 대해 알아보겠습니다.

1. 앱 구성 요소

메니페스트에선 앱 구성 요소들을 선언합니다. 아래 예시는 액티비티(Activity)의 하위 클래스인 MainActivity를 선언한 것입니다.

<activity android:name=".MainActivity">

먼저 앱의 구성 요소에는 액티비티, 서비스, 브로드캐스트 리시버, 콘텐츠 제공자가 있습니다. 각 구성 요소는 시스템이나 사용자가 앱에 들어올 수 있는 진입점이 됩니다. 간략히 설명드리면 다음과 같습니다.

1) Activity

액티비티는 앱 안의 단일 화면을 나타냅니다.

2) Service

서비스는 UI 없이 백그라운드에서 작업을 수행하는 구성 요소입니다.

3) BroadcastReceiver

시스템이 정기적인 사용자 플로우 밖에서 이벤트를 앱에 전달하도록 지원하는 구성 요소입니다.

4) ContentProvider

파일 시스템, SQLite 데이터베이스, 웹상이나 앱이 액세스 할 수 있는 다른 모든 영구 저장 위치에 저장 가능한 앱 데이터의 공유형 집합을 관리합니다.

 

각각의 앱 구성 요소는 모두 매니페스트 파일에 선언해야 합니다.

만일 매니페스트 파일에서 XML 요소를 선언하지 않고 이 구성 요소를 하위 클래스로 지정하면 시스템에서 이를 시작할 수 없습니다.

예를 들어 Activity의 하위 클래스인 MainActivity를 사용하기 위해선 매니페스트 파일에서 <activity> 요소를 통해 선언해야 하며, 그렇지 않으면 시스템에서 동작하지 않습니다.

하위 클래스 이름은 완전한 패키지 이름을 사용해서 지정해야 합니다.

위 예시를 예로 들면 Activity의 하위 클래스는 ".MainActivity"로 선언되었으며, 이는 "com.ssacproject.manytrial.MainActivity"로 해석됩니다.

2. 인텐트 필터

아래 예시는 MainActivity에서 선언된 인텐트 필터(intent-filter)입니다.

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

인텐트는 실행할 작업을 설명하는 메시지 객체로, 다른 앱 구성 요소로부터 작업을 요청하는 데 사용할 수 있습니다. 여기에는 작업할 데이터, 작업을 수행해야 하는 구성 요소의 카테고리 및 기타 지침이 포함됩니다.

액티비티, 서비스, 브로드캐스트 리시버는 인텐트로 활성화됩니다. 다음은 각각의 예시입니다.

1) Activity

새로운 액티비티 화면을 시작하려면 인텐트 객체를 startActivity()로 전달하면 됩니다. 이때 인텐트 객체는 시작할 액티비티를 설명하고 필요한 데이터를 담습니다.

만일 새로운 액티비티를 시작한 다음 거기서 발생한 결과를 수신하려면 startActivityForResult() 메서드를 호출합니다. 그러면 기존 액티비티는 새로운 액티비티로부터 나온 결과를 onActivityResult() 콜백 메서드를 통해 별도의 인텐트 객체로 수신합니다. 그리고 이 인텐트 객체에서 데이터를 받아 처리합니다.

2) Service

API 레벨 21부터는 JobScheduler로 서비스를 시작할 수 있습니다.

그 이전 버전은 인텐트 객체를 startService() 메서드에 전달하면 됩니다. 이때 인텐트 객체는 시작할 서비스를 설명하고 필요한 데이터를 담습니다.

3) BroadcastReceiver

시스템은 기기가 충전을 시작하는 등 시스템 이벤트에 대한 다양한 브로드캐스트를 전달합니다. 인텐트 객체를 sendBroadcast() 메서드에 전달하거나 혹은 sendOrderedBroadcast() 메서드에 전달하면 다른 앱에 브로드캐스트를 전달할 수 있습니다.

 

앱이 인텐트를 시스템에 발행하면 시스템은 각 앱의 메니페스트 파일에 선언된 인텐트 필터에 기초하여 인텐트를 처리할 수 있는 앱 구성 요소를 찾습니다. 시스템은 일치하는 구성 요소의 인스턴스를 시작하고 해당 구성 요소에 Intent 객체를 전달합니다. 두 개 이상의 앱이 인텐트를 처리할 경우 사용자는 어느 앱을 사용할지 선택할 수 있습니다.

앱 구성 요소는 <intent-filter> 요소로 정의되는 인텐트 필터를 몇 개든 가질 수 있으며, 각 인텐트 필터는 해당 구성 요소의 각 기능을 설명합니다.

3. 아이콘 및 레이블

아래 예시는 프로젝트 생성 시 자동으로 선언된 아이콘 및 레이블입니다.

android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"

icon과 label 속성을 사용해 아이콘과 텍스트 레이블을 표시할 수 있습니다.

매니페스트 파일에서 <application> 요소에 설정된 아이콘과 레이블은 모든 하위 요소에 대해 기본 아이콘과 레이블 값이 됩니다.

구성 요소의 <intent-filter>에 설정된 아이콘과 레이블은 구성 요소가 인텐트를 수행하기 위한 옵션으로 제시될 때마다 사용자에게 표시됩니다. 기본적으로 이 아이콘은 <application> 또는 <activity> 요소에서 설정된 아이콘을 상속하지만(여기에 어떤 아이콘이 선택되든), Chooser Dialog에서 더욱 잘 보여주고 싶은 고유한 작업을 제공하는 인텐트 필터의 아이콘이 있다면 해당 아이콘으로 변경할 수도 있습니다.

4. 마무리

이번 시간에는 앞선 시간에 뒤이어서 매니페스트에서 주요하게 선언되는 요소들에 대해서 설명했습니다. 오늘 살펴보았던 앱 구성 요소, 인텐트 필터, 아이콘 및 레이블에 뒤이어서 다음 시간에는 다른 요소들 및 부차적인 요소들에 대해서 살펴보겠습니다.

728x90
반응형