안드로이드 개발자 가이드는 Android Developers의 문서들을 보고 이해한 내용을 바탕으로 작성한 글입니다.

원문: https://developer.android.com/guide/components/fundamentals?hl=ko

 

들어가며

Android 앱의 모든 구성요소가 포함된 압축파일로 앱 설치시 사용됩니다.

각각의 앱은 샌드박스화 되어있는데, 상세사항은 다음과 같습니다.

  • Android의 시스템은 Linux 멀티유저 시스템과 같고 각각의 앱은 하나의 유저로 볼 수 있습니다.
  • 시스템은 각각의 앱에 고유한 Linux ID를 부여하고, 앱에 포함된 모든 파일은 해당 ID의 권한을 가진 유저만 액세스가 가능합니다.
  • 각 프로세스는 자체적인 VM이 있고, 각 앱은 서로 격리된 상태로 실행됩니다.
  • 각각의 앱은 프로세스로 실행됩니다. 만약 앱의 구성요소중 하나라도 실행되어야 한다면, 프로세스를 실행하고, 필요없거나 메모리가 필요한 경우 프로세스를 종료합니다.

Android 시스템은 최소 권한의 원리를 통해 각 앱은 자신의 작업을 위한 부분만 권한을 가지고 그 이상은 허용되지 않습니다. 이런 방식을 통해 안전한 환경을 구성합니다. 하지만 다른 앱과 데이터를 공유하고 싶은 경우나, 시스템 서비스에 액세스하고 싶은 경우 몇가지 방법이 있습니다.

  • 기본적으로 하나의 앱은 고유한 하나의 사용자 ID를 가지지만 두개의 앱이 같은 ID를 가지게 할 수 있습니다. 이 경우 두개의 앱은 서로의 파일에 액세스 할 수 있습니다. 또한 시스템 리소스를 절약하기 위해 동일한 ID를 가지게 하여 같은 프로세스에서 실행되고 VM을 공유하게 할 수 있습니다. 이렇게 같은 ID를 가지기 위해선 동일한 인증서로 두 앱을 서명해야 합니다.
  • 앱은 사용자의 연락처, SMS, SD카드, 카메라, 블루투스를 비롯한 여러가지 기기데이터에 액세스할 권한을 요청 할 수 있습니다.  

 

앱 구성 요소

각 구성요소는 시스템이나 사용자가 앱에 들어올 수 있는 진입점입니다. 다른 구성 요소에 종속되는 구성 요소도 있습니다.

앱 구성 요소에는 네가지 유형이 있습니다.

  • Activity
  • Service
  • Broadcast Receiver
  • Content Provider

 

Activity

액티비티는 사용자와 상호작용하기 위한 진입점입니다. 액티비티는 화면 하나를 나타냅니다. 예를들어 이메일 앱이라면 새로운 이메일을 표한하는 액티비티, 이메일을 읽는 액티비티, 이메일을 작성하는 액티비티등이 있을 수 있습니다. 각각의 액티비티는 함께 작동하면서 사용자 환경을 구성하는 것은 사실이나 각자 서로 독립되어있습니다. 따라서 카메라 앱등에서 이메일의 작성 액티비티를 동작시켜 찍은 사진을 공유하게 하는 등의 동작을 할 수 있습니다.


Service

서비스는 백그라운드에서 앱을 계속 실행하기 위한 다목적 진입점입니다. 서비스는 백그라운드에서 실행되는 요소로, 오래걸리는 작업이거나 원격 프로세스를 위한 작업을 수행합니다. 따라서 서비스는 사용자 인터페이스를 제공하지 않습니다. 시작된 서비스는 작업이 완료될 때 까지 해당 서비스를 계속 실행하라고 시스템에 지시합니다. 예를들어 백그라운드에서 데이터를 동기화 하거나 앱에서 나간 후에도 음악이 끊기지 않고 재생하는 것을 예시로 볼 수 있습니다. 이 두가지 작업은 서비스의 두가지 유형을 나타냅니다.

  • 음악 재생은 사용자가 인식할 수 있는 작업이므로 사용자에게 알림을 보내고 음악 재생을 포그라운드로 옮기라고 시스템에 지시합니다. 이런 경우 시스템은 서비스의 프로세스가 계속 실행되도록 많은 노력을 기울여야 합니다. 서비스가 중간에 중단되면 사용자가 불만을 느낄 것이기 때문입니다.
  • 정기적인 백그라운드 서비스는 사용자가 실행되고 있다고 인식할 수 없는 작업이므로 시스템은 자유롭게 프로세스를 관리할 수 있습니다. 사용자와 더 관련있는 작업에 의해 RAM이 필요할 경우 이 서비스를 종료할 수 있습니다.(추후 메모리의 여유가 생기면 다시 시작 할 수도 있습니다.)

바인딩된 서비스는 주로 서비스가 다른 프로세스에 API를 제공될 때 실행됩니다. 프로세스 A가 프로세스B의 서비스에 바인딩 되어 있을 경우, 시스템은 프로세스A를 위해 프로세스B를 실행해야 한다는 것을 인식하게 됩니다. 

 

Broadcast Receiver

브로드캐스트 리시버는 앱이 시스템 전체의 브로드캐스트 알림에 응답할 수 있게 합니다. 브로드캐스트 리시버도 앱으로 들어갈 수 있는 또다른 명확한 진입점이므로 현재 실행되지 않은 앱에도 시스템이 브로드캐스트를 전달할 수 있습니다. 예를 들어 앱이 예정된 이벤트에 대해 알리는 알림을 게시하기 위해 알람을 예약할 경우, 브로드캐스트 리시버에 알람을 전달하면 해당 알람 시간까지 앱을 실행할 필요 없습니다. 각 브로드캐스트는 Intent객체로 전달됩니다.

 

Content Provider

콘텐츠 제공자는 파일 시스템, SQLite 데이터베이스, 웹이나 앱이 액세스 할 수 있는 다른 모든 영구 저장 위치에 저장가능한 앱 데이터의 공유형 집합을 관리합니다. 콘텐츠 제공자를 통해 데이터를 쿼리하거나 허용되는 경우에서는 수정도 가능합니다. 이런 점 때문에 콘텐츠 제공자가 데이터베이스에 대한 추상화로 생각하기 쉬우나 시스템 설계 관점에서 볼 때 핵심 목적이 서로 다릅니다.

 

구성 요소 활성화

위에 언급한 구성 요소중 3가지(액티비티, 서비스, 브로드캐스트 리시버)는 인텐트 라는 비동기식 메시지로 활성화 됩니다. 인텐트는 일종의 메신저라고 생각하면 됩니다. 즉 구성 요소가 어느 앱에 속하든 관계없이 다른 구성 요소로부터 작업을 요청하는 역할을 합니다.

액티비티, 서비스의 인텐트는 수행할 작업을 정의하며, 작업을 수행할 데이터의 URI를 지정할 수 있습니다. 

브로드캐스트 리시버의 경우 인텐트는 단순히 브로드캐스트될 알림을 정의합니다.

콘텐츠 제공자는 인텐트로 활성화 되지 않습니다. 

 

매니페스트 파일

Android 시스템이 앱 구성 요소를 시작하려면 먼저 AndroidManifest,xml을 읽어서 해당 구성 요소가 존재하는지 확인합니다.

매니페스트에는 앱의 모든 구성요소를 선언해야 하고, 앱 프로젝트 디렉토리의 루트에 있어야 합니다.

매니페스트파일은 앱의 구성요소를 선언하는 것 외에 많은 역할을 합니다.

  • 앱이 요구하는 권한(인터넷, 연락처 등)을 식별합니다.
  • 앱의 최소 API 레벨을 선언합니다.
  • 앱에서 사용하거나 요구하는 하드웨어, 소프트웨어 기능(카메라, 블루투스 서비스, 멀티터치 화면)을 선언합니다.
  • 앱이 링크되어야 하는 API라이브러리를 선언합니다.

액티비티, 서비스, 브로드캐스트 리시버, 콘텐츠 제공자는 모두 매니페스트에 선언되어야 하고, 소스에는 포함되어있지만 선언되지 않은 요소들은 실행되지 않습니다.

시스템은 기기에 설치된 다른앱의 매니페스트의 인텐트 필터와 수신된 인텐트를 비교해서 인텐트에 응답할 수 있는 구성요소를 식별합니다.

예를 들어 새 이메일을 작성하는 액티비티가 포함된 이메일 앱을 만든다고 가정하겠습니다.

<manifest ... >
    ...
    <application ... >
        <activity android:name="com.example.project.ComposeEmailActivity">
            <intent-filter>
                <action android:name="android.intent.action.SEND" />
                <data android:type="*/*" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
    </application>
</manifest>

 

... 추가예정

복사했습니다!