매니페스트 & 컴포넌트 & Intent

Lee Gayoung·2022년 9월 28일
0

UMC 3기

목록 보기
3/10

💡매니페스트 (Manifest)

  • 매니페스트(Manifest)란?
    Manifest는 안드로이드 Android 빌드 도구, Android 운영체제 및 Google Play 등 애플리케이션에 대한 각종 필수 정보를 기술한 목록(명세서)이다. 정확히 <AndroidManifest.xml>라는 이름을 가진 매니페스트 파일은 프로젝트의 가장 상위 폴더에 위치해야 한다.
    -> 앱의 실행 이전에 시스템이 알아야 하는 정보가 포함되어 있다.

모든 앱 프로젝트에는 Manifest 파일이 필수적이다.

해당 파일에는 패키지 이름 앱 ID, 앱의 권한, 앱의 구성 요소(컴포넌트), 기기 호환성이 포함되어야 한다.

🌟 Manifest 주요 속성 10가지

  1. <manifest>
    AndroidManifest.xml 파일의 루트 요소로 단 하나의 <application> 요소를 포함해야 한다. 네임스페이스를 지정해주는 xmlns:android 속성과 package 속성을 지정한다.

  2. <application>
    매니페스트 파일은 단 하나의 <application> 요소를 포함해야 한다. <application>는 애플리케이션의 각 구성 요소를 선언하고 모든 구성요소에 영향을 줄 수 있는 속성을 가진 하위 요소를 포함한다. 이 중 여러 속성(icon, label, permission, process, taskAffinity, allowTaskReparenting)이 구성 요소의 해당 속성에 기본값을 설정한다. 그 외의 속성(debuggable, enabled, description, allowClearUserData)은 애플리케이션의 값을 전체적으로 설정하며 구성 요소별로 재정의할 수 없다.

  3. <activity>
    안드로이드 애플리케이션을 구성하는 component 중 activity를 정의합니다. 애플리케이션의 시각적 사용자 인터페이스 요소를 구현하는 액티비티(Activity 하위 클래스)를 선언한다. 모든 액티비티는 매니페스트 파일의 <activity> 요소를 나타내야 한다. 선언되지 않은 액티비티는 시스템에서 표시되지 않으며 실행되지 않는다.

  4. <service>
    안드로이드 애플리케이션을 구성하는 component 중 service를 정의한다. Activity와 달리, 서비스에는 시각적 사용자 인터페이스가 없다. 서비스는 오래 실행되어야 하는 백그라운드 작업이나 다른 애플리케이션에서 호출할 수 있는 리치 커뮤니케이션 API를 구현하는 데 사용된다. 모든 서비스는 매니페스트 파일의 <service> 요소로 나타내야 한다다. activity와 마찬가지로 여기에 선언되지 않은 서비스는 시스템에 표시되지 않으며 실행되지 않는다.

  5. <receiver>
    안드로이드 애플리케이션을 구성하는 component 중 broadcast receiver을 정의한다. broadcast receiver를 사용하면 애플리케이션의 다른 구성요소가 실행되고 있지 않을 때도 시스템이나 다른 애플리케이션에서 브로드캐스트팅하는 인텐트를 애플리케이션에서 수신할 수 있다. <receiver> 태그 안에 intent filter을 정의하여 어떠한 브로드캐스트 메시지에 반응할지를 지정할 수 있다.

  6. <provider>
    안드로이드 애플리케이션을 구성하는 component 중 content provider를 정의한다. content provider는 어플리케이션 내의 데이터베이스를 다른 애플리케이션가 공유할 수 있도록 해주는 역할을 한다. 애플리케이션의 모든 content provider은 manifest 파일의 <provider> 요소에서 정의해야 한다. 그러지 않으면 시스템에서 인식되지 않고 실행되지 않는다.

  7. <intent-filter>
    Activity, Service, Broadcast Receiver가 응답할 수 있는 인텐트의 유형을 지정한다. 인텐트 필터는 상위 구성요소의 기능, 즉 활동이나 서비스가 할 수 있는 작업과 수신기가 처리할 수 있는 브로드캐스트의 유형을 선언한다. 전달되는 유형의 수신 인텐트로 구성요소를 열고 이 구성요소에 유의미하지 않은 인텐트를 필터링한다.

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

  9. <category>
    <intent filter> 밑에 <category>t 요소를 정의하여 component의 유형이 무엇인지 정의할 수 있다.

  10. <uses-permission>
    앱이 올바르게 작동하기 위해 사용자가 반드시 부여해야 하는 시스템 권한이다. 여기에 정의된 권한은 애플리케이션 설치시 해당 어플리케이션이 어떤 권한을 요구하는지를 사용자에게 보여준다.

💡안드로이드의 컴포넌트

  • 컴포넌트(Component)란?
    컴포넌트는 여러 애플리케이션을 개발할 때 사용하는 개념이다.
    애플리케이션의 구성 요소이며 애플리케이션을 구성하는 독립된 실행 단위라고 할 수 있다.

안드로이드에서는 클래스를 사용하여 컴포넌트를 개발한다.
그러나 애플리케이션을 구성하는 모든 클래스가 컴포넌트에 해당하지는 않는다.
앱을 구성하는 클래스는 크게 일반 클래스컴포넌트 클래스 2가지로 구분된다.

  • 일반 클래스
    앱이 실행될 때 클래스의 객체 생성부터 소멸까지의 생명주기를 개발자 코드에서 관리한다.
    앱의 구성 요소인 컴포넌트가 아니라 개발자가 임의의 목적으로 만든 클래스인 것이다.

  • 컴포넌트 클래스
    개발자가 만들지만 생명주기는 안드로이드 시스템에서 관리하는 클래스이다.

🌟안드로이드의 4대 컴포넌트

  1. 액티비티
    화면을 구성하는 컴포넌트이다. 앱 화면을 안드로이드 기기에 출력하려면 액티비티를 만들어야하며, 앱이 실행되면 액티비티에서 출력한 내용이 안드로이드 기기에 나타난다.

  2. 서비스
    백그라운드 작업을 하는 컴포넌트이다. 화면 출력 기능이 없기 때문에 서비스가 실행되더라도 화면에는 출력되지 않는다. 화면과 상관없이 백그라운드에서 장시간 실행해야 할 업무를 담당한다.

  3. 콘텐츠 프로바이더
    앱의 데이터를 공유하는 컴포넌트이다. 안드로이드 기기에는 많은 앱이 설치되어 있고, 앱 간에 데이터를 공유해야할 수도 있다. 하나의 앱이 자신의 데이터를 다른 앱에 공유하려면 콘텐츠 프로바이더가 필요하다. 공유받는 앱에서는 콘텐츠 프로바이더를 이용해서 데이터에 접근한다.

    ex) 카카오톡 앱에서 프로필 변경: 갤러리 앱의 사진을 사용해서 변경할 때 콘텐츠 프로바이더를 이용하여 데이터를 주고받는다.
  4. 브로드캐스트 리시버
    시스템 이벤트가 발생할 때 실행되게 하는 컴포넌트이다. 여기서 이벤트는 화면에서 발생하는 사용자 이벤트가 아니라 시스템에서 발생하는 특정 상황을 의미한다.

    ex) 부팅 완료, 배터리 방전 같은 상황을 말한다.

컴포넌트는 안드로이드 시스템이 생명주기를 관리하지만 개발자가 생성한다. 컴포넌트 클래스를 생성할 때에는 지정된 클래스를 상속받도록 작성해야한다. 액티비티는 Activity, 서비스는 Service, 콘텐츠 프로바이더는 Contentprovider, 브로드캐스트 리시버는 BroadcastReceiver 클래스를 상속받는다.

💡인텐트 (Intent)

  • 인텐트(Intent)란?
    '컴포넌트를 실행하기 위해 시스템에 전달하는 메시지'라고 정의할 수 있다. 기능을 수행하는 함수를 제공하는 클래스가 아니라 데이터를 담는 클래스이다. 이 데이터는 컴포넌트를 실행하는 정보이며 이 정보가 담긴 인텐트 객체를 시스템에 전달하면 컴포넌트가 실행된다. 외-내부의 4대 컴포넌트 통신을 맡고 있는 것이 인텐트이다.

인텐트 정보의 주 목적은 특정 컴포넌트에 대한 실행 정보를 넣어서 해당 컴포넌트를 실행하고, 실행되는 컴포넌트에 원하는 데이터를 전달하는 것이다.

인텐트에는 명시적 인텐트암시적 인텐트의 두 가지 방법이 존재한다.

  1. 명시적 인텐트 (Explict intent) : 인텐트의 의미가 명확할 때 사용.
    명시적 인텐트는 보안상 자기 패키지 내부의 액티비티를 실행할 때만 사용한다.
    즉, 직접 만든 액티비티 등의 컴포넌트로 전환할 때 사용된다.

  2. 암시적 인텐트 (implict intent) : 인텐트의 의미가 불명확할 때 사용.
    특정 구성 요소의 class name에 대한 정보는 필요 없지만 수행 작업을 선언하여 외부에 공개할 목적으로 사용된다.

🌱 참고 자료

  1. Do it! 깡쌤의 안드로이드 앱프로그래밍 with 코틀린 (강성윤)
  2. Android Manifest 파일 역할과 기능
  3. 매니페스트 주요 속성 10가지
  4. 명시적 인텐트 % 암시적 인텐트
  5. 인텐트 (명시적, 암시적)

0개의 댓글