[Android] 앱 기본 요소

정상준·2023년 6월 19일
0
post-thumbnail
post-custom-banner

📚 앱 기본 요소

  • 안드로이드 SDK 도구가 모든 데이터 및 리소스 파일과 함께 코드를 컴파일하여 하나의 APK를 만듭니다. 사용자는 이것을 다운받아서 앱을 실행시킨다.
  • 아카이브 파일 = 알집으로 이해하자
  • 한 개의 APK 파일에는 Android 앱의 모든 콘텐츠가 들어 있으며, Android로 구동하는 기기가 앱을 설치할 때 APK 파일 사용
  • 보안 샌드박스 : 소프트에어환경과 애플리케이션이나 프로세스를 격리시키는 보안 기술로, 제한된 리소스 제공, 액세서 제어 등을 통해 보안한다.
  • Android 시스템은 최소권한의 원리를 유지하여 보안성을 극대화 한다.

📚 앱 구성요소

✏️ 액티비티

액티비티는 사용자와 상호작용하기 위한 시작점으로 화면 하나를 의미한다. 액티비티끼리 서로 독립되어있다.
액티비티는 다음과 같이 시스템과 앱의 주요 상호작용을 돕는다.

  • 사용자가 보고 있는 화면을 추적하여 액티비티를 호스팅하는 프로세스를 시스템에서 계속 실행되도록 한다. (액티비티 수명주기가 있기에 가능)
  • 사용자가 액티비티 이동 or 앱 종료 시 프로세스에 이전에 사용하던 액티비티가 시스템에 남아있을 수 있다. 이 경우 사용자가 다시 사용하던 액티비티로 올 가능성이 높으며, 이때 시스템은 해당 프로세스에 우선순위를 높게해 액티비티 재 실행시 해당 프로세스를 할당해준다. 이렇게 한다면 더 빨리 액티비티를 로드할 수 있으며, 중단된 작업을 이어갈 수 있게 해준다.
  • 앱 종료시 프로세스도 함께 저장되는데, 종료 직전 Intent를 사용하여 현재 액티비티의 상태를 저장하고, 앱 재시행시 이전에 하던 작업을 복원해준다.
  • 시스템은 액티비티 스택을 관리하여 사용자가 뒤로 가기 버튼을 눌렀을 때 이전 액티비티를 자동으로 복원할 수 있도록 한다. 또한, 앱이 백그라운드로 이동하면 시스템은 상태를 저장하고, 다시 포그라운드로 이동할 때 이전 상태를 복원한다.

✏️ 서비스

서비스는 백그라운드에서 앱을 계속 실행하기 위한 진입점이다. 오랫동안 실행되는 작업을 실행하거나, 원격 프로세스를 위한 작업을 수행한다. 서비스는 사용자에게 인터페이스를 제공하진 않는다.
서비스는 두 가지 유형이 있을 수 있는데, 예시로 쉽게 설명하겠다.

  • 백그라운드에서 음악 실행 : 음악 재생은 사용자가 바로 알 수 있어야 하는 작업이므로, 앱은 사용자에게 계속 알림을 보내고 음악 재생을 포그라운드로 옮겨야 한다.
  • 프로그램 설치 : 프로그램 설치와 같은 서비스의 경우 사용자가 실행을 인식할 필요가 없으므로 더 자유롭게 프로세스를 관리할 수 있다. 더 급한 작업이 있을경우 잠시 설치를 중지했다 여유있을 때 다시 실행할 수 있다.

바인딩 된 서비스는 다른 앱에서 실행할 수 있다. 이는 서비스가 다른 프로세스에게 API를 제공해주는 것이다. 그러면 시스템은 이를 알고 있다가 프로세스 A 실행시 바인딩 된 프로세스 B도 함께 실행을 시켜준다.
서비스는 Service 하위 클래스로 구현됩니다.

✏️ Broadcast Receiver

안드로이드 앱에서 발생하는 시스템 또는 앱 간의 브로드캐스트 메시지를 수신하는 컴포넌트이다. 브로드캐스트 메시지는 시스템 또는 앱에서 중요한 이벤트가 발생했을 때 다른 앱이나 컴포넌트에게 알리기 위해 사용된다. Broadcast Receiver도 앱으로 들어갈 수 있는 또 다른 진입점이기 때문에 현재 실행되지 않은 앱에도 시스템이 브로드캐스트를 전달할 수 있다. 대다수의 브로드캐스트는 시스템에서 발생한다.Broadcast Receiver는 사용자 인터페이스를 표시하지 않지만, 상태 표시줄 알림을 생성하여 사용자에게 브로드캐스트 이벤트가 발생했다고 알릴 수 있다.
Broadcast Receiver는 BroadcastReceiver의 하위 클래스로 구현되며 각 브로드캐스트는 Intent 객체로 전달된다

✏️ Content Provider

안드로이드 앱 간의 데이터 공유와 관리를 위한 인터페이스를 제공하는 컴포넌트이다. 즉 다른 앱에서 데이터에 접근하거나 데이터를 공유하기 위해 Content Provider를 사용할 수 있습니다.
자신의 앱이 카메라 앱 내에서 사진을 캡처하는 액티비티를 시작하면, 해당 액티비티는 자신의 앱 프로세스가 아니라 카메라 앱에 속한 프로세스에서 실행된다. 그러므로 대부분의 다른 시스템에서 실행되는 앱과 달리 Android 앱은 단일한 진입 지점이 없다. 쉽게 설명하면 main에서 앱이 무조건적으로 실행된다고 보장되지 않는다.
내 앱이 다른 앱을 실행할 때, 내 앱이 실행시키는 것이 아니라 안드로이드 시스템이 실행시켜준다.
즉 다른 앱을 실행시키려면 시스템에 메시지를 전달하여 인텐트를 밝혀야 한다.

📚 구성 요소 활성화

구성요소 4가지중 액티비티, 서비스, Broadcast Receiver는 인텐트를 활용한 비동기식 메시지로 활성화 된다. 인텐트는 런타임중 각 구성 요소를 서로 바인딩한다.
액티비티와 서비스의 경우, 인텐트는 수행할 작업을 정의하며, 시작되는 구성 요소가 알아야 할 것이 많이 있기는 하지만 그중에서도 작업을 수행할 데이터의 URI를 지정할 수 있다.
Broadcast Receiver의 경우, 인텐트는 단순히 브로드캐스트될 알림을 정의한다.
Content Provider의 경우 인텐트로 활성화 되지 않는다. ContentResolver가 보낸 요청의 대상으로 지정되면 활성화된다. ContentResolver는 Content Provider와 앱 사이에 자리하여, 트랙잭션을 처리하고 수행한다. 이렇게 하면 앱이 직접적으로 Content Provider와 통신하는 것이 아니기에 작업이 간소화되고 보안이 향상된다.

  • activity : Intent를 startActivity() 또는 startActivityForResult()에 전달
  • Service : JobScheduler 클래스를 사용하여 작업을 예약
  • Broadcast Receiver : sendBroadcast(), sendOrderedBroadcast(), 또는 sendStickyBroadcast()와 같은 메서드에 Intent를 전달하면 브로드캐스트를 시작
  • Content Provider :면 ContentResolver에서 query()를 호출

📚 매니페스트

Android 시스템이 앱 구성 요소를 시작하려면 시스템은 우선 앱의 매니페스트 파일, AndroidManifest.xml을 읽어서 해당 구성 요소가 존재하는지 확인한다.
앱은 이 파일 안에 모든 구성 요소를 선언해야 하며, 이 파일은 앱 프로젝트 디렉토리의 루트에 있어야 한다.
뿐만아니라 매니페스트는 다음과 같은 역활을 한다

  • 앱이 요구하는 모든 사용자 권한처리
  • 앱이 사용하는 API를 보고 최소 API 레벨 선언
  • 앱에서 사용하거나 요구하는 하드웨어 및 소프트웨어 기능(예: 카메라, 블루투스 서비스, 멀티터치 화면)을 선언한다.
  • 앱에서 사용될 API 라이브러리 선언

📚 용어 정리

  • 인텐트 : 컴포넌트끼리 통신을 위해 사용되는 정보
    • 명시적 인텐트 : 목적지 컴포넌트를 확실히 함
    • 암시적 인텐트 : 컴포넌트를 지정하지 않고, 원하는 액션이나 데이터 처리를 할 시스템이나 앱을 찾는다
profile
안드로이드개발자
post-custom-banner

0개의 댓글