<Andorid> 매니페스트 주요 속성 10가지 및 4대 컴포넌트 및 intent

진섭·2022년 4월 4일
0
post-thumbnail

📌매니페스트

모든 앱 프로젝트는 최상단에 AndroidManifest.xml파일이 있어야 하며 매니페스트 파일은 Android 빌드 도구, Android 운영체제 및 Google Playdp 앱에 관한 필 수 정보를 설명한다.즉 매니페스트는 앱의 환경 설정 파일이다.

매니페스트 코드 구조는 <manifest>, <application>, <activity> 등 여러 태그로 되어 있다.

📌매니페스트 속성

1. <manifest>

AndroidManifest.xml 파일의 루트 요소로, <application> 요소를 포함해야 하며 xmlns:android 및 package 속성을 지정합니다.

형관펜으로 칠해져 있는 부분이 <manifest> 태그이며 <application> 를 포함하고 있다.

기본 문법은 공식문서에서 다음과 같이 되어 있다.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="string"
          android:sharedUserId="string"
          android:sharedUserLabel="string resource" 
          android:versionCode="integer"
          android:versionName="string"
          android:installLocation=["auto" | "internalOnly" | "preferExternal"] >
    . . .
</manifest>

//출처 : https://developer.android.com/guide/topics/manifest/manifest-element(공식문서)

속성

xmlns:android
Android 네임스페이스를 정의합니다. 이 속성은 항상 'http://schemas.android.com/apk/res/android' 로 설정해야 합니다.
//'http://schemas.android.com/apk/res/android'를 적어주는 이유는 XML에서 xmlns는 네임 스페이스를 선언합니다. xmlns를 호출하는 대신 android:idxml는 http://schemas.android.com/apk/res/android:id 를 사용합니다. 이 페이지는 URL이 아닌 URI이며 네임 스페이스를 설명하는 URL이다.

package
Android 앱의 전체 자바 언어 스타일 패키지 이름입니다. 이름에는 대문자 또는 소문자('A'~'Z'), 숫자, 밑줄('_')이 포함될 수 있습니다. 그러나 개별 패키지 이름 부분은 문자로만 시작할 수 있습니다.
빌드 시스템에서는 애플리케이션 패키지(APK)로 앱을 빌드하는 동안 다음 두 가지 이유로 package 속성을 사용합니다.

여기에는 "com.example.rc4_challenge1" 처럼 작성이된다. 이 이름은 Google Play에 앱을 게시하려면 어디에서나 고유해야 하는 애플리케이션 값이다.

작성은 처음 프로젝트를 만들 때 아래와 같이 나온다. 여기서 입력이 가능하다.

Package name 규칙은 주소를 반대로 적듯 적어주면된다.

예) naver.com -> com.naver
여기서 마지막에 프로그램 이름을 적어주면된다.
-> com.naver.calculator

2. <application>

<application> 태그는 애플리케이션의 각 구성요소를 선언하는 하위 요소를 포함하며 모든 구성요소에 영향을 줄 수 있는 속성을 가지고 있습니다

속성

android:allowBackup : 애플리케이션이 백업 및 복원 인프라에 참여하도록 허용할지 여부입니다.
android:icon : 전체 애플리케이션의 아이콘 및 애플리케이션의 각 구성요소의 기본 아이콘입니다.
android:label : 전체 애플리케이션을 나타내는, 사용자가 읽을 수 있는 라벨 및 애플리케이션의 각 구성요소의 기본 라벨입니다.
android:roundIcon : 둥근 형태의 아이콘을 설정하는 속성입니다.
android:supportsRtl: 애플리케이션이 오른쪽에서 왼쪽(RTL) 레이아웃을 지원하는지 여부를 선언합니다.
android:theme : 애플리케이션의 모든 활동의 기본 테마를 정의하는 스타일 리소스 참조입니다. 개별 활동은 고유한 theme 속성을 설정하여 기본값을 재정의할 수 있습니다.

속성은 이 밖에도 많이 있으니 공식 문서를 참조 바랍니다.

https://developer.android.com/guide/topics/manifest/application-element

3. <activity>

애플리케이션의 시각적 사용자 인터페이스 요소를 구현하는 활동을 선언합니다. 모든 활동은 매니페스트 파일의 <activity> 요소로 나타내야 합니다. 여기에 선언되지 않은 활동은 시스템에 표시되지 않으며 실행되지 않습니다.

속성

android:name : 활동을 구현하는 클래스의 이름입니다.
android:exported : 이 요소는 다른 애플리케이션의 구성요소에서 활동을 시작할 수 있는지를 설정합니다.

속성은 이 밖에도 많이 있으니 공식 문서를 참조 바랍니다.

https://developer.android.com/guide/topics/manifest/activity-element

4. <intent-filter>

활동, 서비스, broadcast receiver가 응답할 수 있는 인텐트의 유형을 지정합니다. 인텐트 필터는 상위 구성요소의 기능, 즉 활동이나 서비스가 할 수 있는 작업과 수신기가 처리할 수 있는 브로드캐스트의 유형을 선언합니다. 전달된 유형의 수신 인텐트로 구성요소를 열고 이 구성요소에 의미가 없는 인텐트를 필터링합니다.
필터 내용의 대부분은 <action>, <category>, <data> 하위 요소에서 설명됩니다.

속성

android:icon : 필터에 설명된 기능이 구성요소에 있다는 것을 사용자에게 설명할 때 상위 활동, 서비스, broadcast receiver를 나타내는 아이콘입니다.
android:label : 사용자가 읽을 수 있는 상위 구성요소 라벨입니다. 필터에 설명된 기능이 구성요소에 있다는 것을 사용자에게 설명할 때는 상위 구성요소에서 설정한 라벨이 아니라 이 라벨이 사용됩니다.

속성은 이 밖에도 많이 있으니 공식 문서를 참조 바랍니다.

https://developer.android.com/guide/topics/manifest/intent-filter-element

5. <action>

인텐트 필터에 작업을 추가합니다. <intent-filter> 요소에 <action> 요소가 하나 이상 포함되어야 합니다. 인텐트 필터에 <action> 요소가 없으면 필터가 Intent 객체를 허용하지 않습니다.

속성

android:name : 작업의 이름입니다. 일부 표준 작업은 Intent 클래스에서 ACTIONstring 상수로 정의됩니다. 이러한 작업 중 하나를 이 속성에 할당하려면 ACTION 다음에 나오는 string 앞에 'android.intent.action.'을 추가합니다. 예를 들어 ACTION_MAIN이면 'android.intent.action.MAIN'을 사용하고 ACTION_WEB_SEARCH이면 'android.intent.action.WEB_SEARCH'를 사용합니다.

6. <category>

인텐트 필터에 카테고리 이름을 추가합니다.

속성

android:name : 카테고리의 이름입니다. 표준 카테고리는 Intent 클래스에서 CATEGORYname 상수로 정의됩니다. 여기서 할당된 이름은 CATEGORY 다음에 나오는 name 앞에 'android.intent.category.'를 추가하는 방법으로 이 상수에서 파생할 수 있습니다. 예를 들어 CATEGORY_LAUNCHER의 문자열 값은 'android.intent.category.LAUNCHER'입니다.

7. <permission>

이 애플리케이션이나 다른 애플리케이션의 특정 구성요소 또는 기능에 대한 액세스를 제한하는 데 사용될 수 있는 보안 권한을 선언합니다

<permission android:description="string resource"
            android:icon="drawable resource"
            android:label="string resource"
            android:name="string"
            android:permissionGroup="string"
            android:protectionLevel=["normal" | "dangerous" |
                                     "signature" | ...] />

속성

android:description : 권한에 관한 사용자가 읽을 수 있는 설명으로 라벨보다 길고 더 많은 정보를 제공합니다. 사용자에게 다른 애플리케이션에 권한을 부여할지 여부를 묻는 등 사용자에게 권한을 설명하기 위해 표시될 수 있습니다.
이 속성은 문자열 리소스의 참조로 설정해야 하며 label 속성과 달리 원시 문자열일 수 없습니다.
android:icon : 권한을 나타내는 아이콘의 드로어블 리소스 참조입니다.
android:label : 권한 이름으로, 사용자에게 표시될 수 있습니다.
애플리케이션을 개발하는 동안 편의를 위해 라벨을 직접 원시 문자열로 설정할 수 있습니다. 그러나 애플리케이션을 게시할 준비가 되면 사용자 인터페이스의 다른 문자열처럼 현지화할 수 있도록 라벨을 문자열 리소스의 참조로 설정해야 합니다.

속성은 이 밖에도 많이 있으니 공식 문서를 참조 바랍니다.

https://developer.android.com/guide/topics/manifest/permission-element

8. <provider>

콘텐츠 제공자 구성요소를 선언합니다. 콘텐츠 제공자는 애플리케이션에서 관리되는 데이터에 관해 구조화된 액세스를 제공하는 ContentProvider의 서브클래스입니다. 애플리케이션의 모든 콘텐츠 제공자는 매니페스트 파일의 <provider> 요소에서 정의해야 합니다. 그러지 않으면 시스템에서 인식되지 않고 실행되지 않습니다.

<provider android:authorities="list"
          android:directBootAware=["true" | "false"]
          android:enabled=["true" | "false"]
          android:exported=["true" | "false"]
          android:grantUriPermissions=["true" | "false"]
          android:icon="drawable resource"
          android:initOrder="integer"
          android:label="string resource"
          android:multiprocess=["true" | "false"]
          android:name="string"
          android:permission="string"
          android:process="string"
          android:readPermission="string"
          android:syncable=["true" | "false"]
          android:writePermission="string" >
    . . .
</provider>

속성

android:authorities : 콘텐츠 제공자에서 제공되는 데이터를 식별하는 URI 권한을 하나 이상 보여주는 목록입니다.
android:enabled : 시스템에서 콘텐츠 제공자를 인스턴스화할 수 있는지 여부입니다.
android:directBootAware : 콘텐츠 제공자가 직접 부팅을 인식하는지, 즉 사용자가 기기를 잠금 해제하기 전에 콘텐츠 제공자를 실행하도록 허용할지 지정합니다.

9. <receiver>

broadcast receiver(BroadcastReceiver 서브클래스)를 애플리케이션의 구성요소 중 하나로 선언합니다. broadcast receiver를 사용하면 애플리케이션의 다른 구성요소가 실행되고 있지 않을 때도 시스템이나 다른 애플리케이션에서 브로드캐스트하는 인텐트를 애플리케이션에서 수신할 수 있습니다.

<receiver android:directBootAware=["true" | "false"]
          android:enabled=["true" | "false"]
          android:exported=["true" | "false"]
          android:icon="drawable resource"
          android:label="string resource"
          android:name="string"
          android:permission="string"
          android:process="string" >
    . . .
</receiver>

속성

android:directBootAware : broadcast receiver가 직접 부팅을 인식하는지 여부입니다. 즉, 사용자가 기기를 잠금 해제하기 전에 실행할 수 있는지 여부입니다
android:enabled : 시스템에서 broadcast receiver를 인스턴스화할 수 있는지 여부입니다. broadcast receiver가 인스턴스화될 수 있으면 'true', 인스턴스화될 수 없으면 'false'입니다. 기본값은 'true'입니다.
android:exported : broadcast receiver에서 애플리케이션 외부의 비시스템 소스에서 메시지를 수신할 수 있는지 여부입니다. 수신할 수 있으면 'true', 수신할 수 없으면 'false'입니다. 'false'인 경우 broadcast receiver는 시스템이나 동일한 애플리케이션의 구성요소, 사용자 ID가 같은 애플리케이션에서 보낸 메시지만 수신할 수 있습니다.

속성은 이 밖에도 많이 있으니 공식 문서를 참조 바랍니다.

https://developer.android.com/guide/topics/manifest/receiver-element

10. <service>

서비스(Service 서브클래스)를 애플리케이션의 구성요소 중 하나로 선언합니다. 활동과 달리 서비스는 시각적 사용자 인터페이스가 없습니다. 서비스는 오래 실행되는 백그라운드 작업이나 다른 애플리케이션에서 호출할 수 있는 리치 커뮤니케이션 API를 구현하는 데 사용합니다.

<service android:description="string resource"
         android:directBootAware=["true" | "false"]
         android:enabled=["true" | "false"]
         android:exported=["true" | "false"]
         android:foregroundServiceType=["camera" | "connectedDevice" |
                                        "dataSync" | "location" | "mediaPlayback" |
                                        "mediaProjection" | "microphone" | "phoneCall"]
         android:icon="drawable resource"
         android:isolatedProcess=["true" | "false"]
         android:label="string resource"
         android:name="string"
         android:permission="string"
         android:process="string" >
    . . .
</service>

속성

android:enabled : 시스템에서 서비스를 인스턴스화할 수 있는지 여부입니다. 인스턴스화할 수 있으면 'true'이고 인스턴스화할 수 없으면 'false'입니다. 기본값은 'true'입니다.
android:exported : 다른 애플리케이션의 구성요소가 서비스를 호출하거나 서비스와 상호작용할 수 있는지 여부입니다. 할 수 있으면 'true', 할 수 없으면 'false'입니다. 이 값이 'false'이면 동일한 애플리케이션의 구성요소 또는 동일한 사용자 ID를 가진 애플리케이션만 서비스를 시작하거나 서비스에 바인딩할 수 있습니다.
android:foregroundServiceType : 서비스가 특정 사용 사례를 충족하는 포그라운드 서비스임을 지정합니다. 예를 들어 포그라운드 서비스 유형 "location"은 앱이 기기의 현재 위치를 가져올 수 있다는 것을 의미합니다. 일반적으로는 기기 위치와 관련된 사용자가 시작한 작업을 계속하기 위한 목적입니다.

📌4대 컴포넌트

4대 컴포넌트에는 액티비티(activity), 서비스(service), 콘텐츠 프로바이더 (Contents Provider), 브로드캐스트 리시버(Broadcast Receiver) 등이 있으며 각각 다른 기능을 합니다.

액티비티(activity)

화면을 구성하는 컴포넌트이다.

서비스(service)

백그라운드에서 작업하는 컴포넌트이다.

콘텐츠 프로바이더 (Contents Provider)

앱의 데이터를 가져오는 컴포넌트 예) 당근마켓App 에서 상품을 등록할 때 핸드폰 사진 폴더에서 사진을 가져올 수 있다.

브로드캐스트 리시버(Broadcast Receiver)

안드로이드에서 발생하는 이벤트가 발생할 때 실행되는 컴포넌트 예) 문자알림,부팅

📌Intent

정의

일종의 메시지 객체이며 4대 컴포넌트를 실행하기 위해 시스템과 의사소통을 하기 위한 용도로 쓰입니다.

명시적 Intent vs 암시적 Intent

명시적 Intent : 실행하고자 하는 컴포넌트가 명확할 때 사용하는 방식

val intent : Intent =Intent(this, Activity::class.java)

암시적 Intent : 호출할 대상이 달라질 수 있는 경우에 암시적 인텐트를 사용한다.

// Create the text message with a string.
val sendIntent = Intent().apply {
    action = Intent.ACTION_SEND
    putExtra(Intent.EXTRA_TEXT, textMessage)
    type = "text/plain"
}

// Try to invoke the intent.
try {
    startActivity(sendIntent)
} catch (e: ActivityNotFoundException) {
    // Define what your app should do if no activity can handle the intent.
}

0개의 댓글