selfstarter

Android 기본요소(4대 Component 정리) 본문

App/Android

Android 기본요소(4대 Component 정리)

selfstarter 2020. 1. 10. 09:10

출처 : https://developer.android.com/guide/components/fundamentals

애플리케이션 기본 요소

  • 여러진입점을 어떻게 제공하는지
  • 사용자가 앱 아이콘 클릭, 알림, 다른앱으로 시작 가능.
  • broadcast receiver, 서비스 등으로 ui 없이 백그라운드 작업을 실행할 수 있음

안드로이드 보안

  • Android SDK 도구는 모든 데이터 및 리소스 파일과 함께 코드를 컴파일하여 하나의 APK 생성
  • APK 파일로 앱 설치 및 콘텐츠 사용 가능
  • 안드로이드 자체가 보안샌드박스(안드로이드 운영체제는 멀티박스 LINUX 시스템. 앱은 다른 앱과 격리된 상태로 실행)
  • 격리되었기에 각 앱이 안전한 환경이고, 최소의 액세스 권한만 가짐

다른 앱 엑세스

  • 두 개의 앱이 같은 Linux 사용자 ID를 공유하도록 설정. ID가 같으면 같은 프로세스에서 실행, VM 공유(같은 인증서로 사용해야함)
  • 연락처, SMS, 저장소, 카메라 등 엑세스 권한 요청할 수 있음(메뉴얼)[https://developer.android.com/training/permissions/index.html]

앱 구성 요소

  • Android 필수 기본 구성 요소(액티비티, 서비스, Broadcast Receiver, 콘텐츠 제공자)
  • 각 구성 요소는 시스템이나 사용자가 앱에 들어올 수 있는 진입점
  • 생명주기가 있고 생성, 소멸 방식 정의
  • 카메라 기능이 필요할 경우 카메라 기능 액티비티를 호출만 하면 됨
  • 이 때 프로세스는 휴대폰의 프로세스에 속하지 않고 카메라 앱에 속한 프로세스가 실행 됨(단일한 진입지점X)
  • 다른 앱에 구성요소를 활성화하려면 인텐트를 밝혀야함

액티비티

  • 사용자와 인터페이스를 포함한 화면 하나로 상호작용하는 진입점
  • 메일앱이라면 이메일작성 액티비티1개, 이메일 리스트 액티비티 1개 등..
  • 액티비티 별로 독립적이므로 다른앱 액세스를 허용할 경우 여러 액티비티 중 1개를 접근할 수 있다
  • 프로세스 시스템에서 계속 실행, 액티비티 우선순위, 프로세스 종료 시 이전 액티비티 복원되도록 도와줌
  • Activity LifeCycle
  • Activity intro

서비스

  • 백그라운드에서 앱을 계속 실행하기 위함(인터페이스 제공x)
  • 음악 재생, 네트워크 통신으로 데이터 가져오기 등..
  • 음악 재생 시 두가지 서비스가 시작되고 각자 시스템 변경을 한다
  • 바인딩된 서비스는 A프로세스가 프로세스B에 바인딩 된 경우 A를 위해 B를 실행해야한다(라이브 배경화면, 알림, 화면보호기, 입력 메서드..)
  • Service참고
  • Service intro

Broadcast Receiver

  • 시스템이 정기적인 사용자 플로우 밖에서 이벤트를 앱에 전달하도록 지원하는 구성 요소
  • 앱이 시스템의 모든 브로드 캐스트 알림에 응답할 수 있게 만듬(현재 실행하지 않은 앱도 가능)
  • 상태 표시줄에 알림을 생성
  • Broadcast Receiver

콘텐츠 제공자

  • 파일시스템, SQLite 데이터베이스, 웹, 앱에 액세스할 수 있는 모든 영구 저장 위치에 저장이 가능한 앱데이터를 관리
  • 콘텐츠 제공자로 수정도 가능(사용자 연락차 콘텐츠 제공자로 연락처를 읽고 쓸 수 있다)
  • URI 네임스페이스에 넣을 데이터를 매핑할 방식을 경저하고, 해당 URI를 다른 엔터티에 전달할 수 있음
  • URI는 웹 URI 처럼 해당 콘텐츠를 소유하기 위한 지표
  • URI는 보안이 좋음. 콘텐츠 제공자를 거쳐야하고, 클립보드에서 해당 URI를 액세스하려고 하면 임시 URI권한을 부여. 해당 데이터만 접근하도록 함
  • ContentProvider
  • 콘텐츠 제공자

구성 요소 활성화

  • 콘텐츠 제공자 외에 액티비티, 서비스, Broadcast Receiver는 인텐트라는 비동기식 메시지로 활성화 됨
  • 인텐트는 다른 구성 요소로 부터 작업을 요청하는 역활을 함(Intent)
  • 인텐트는 명시적 인텐트(전화, 메시지 등..), 암시적 인텐트(사진, 문서 열기)로 나뉜다
  • 액티비티, 서비스는 URI로 요청을 설정할 수 있다
  • Broadcast Receiver는 단순 브로드캐스트될 알람 정의(ex. 베터리 부족 시 작업 문자열만 포함)
  • 콘텐츠 제공자는 Intent 대신 [ContentResolver](https://developer.android.com/reference/android/content/ContentResolver.html 로 작업
  • ContentResolver를 사용하게 되면 콘텐츠 제공자와 정보를 요청하는 구성 요소 사이에 추상화계층이 하나 생김(보안 목적)

구성 요소 활성화 메서드

  • 액티비티는 Intent를 startActivity() 또는 startActivityForResult()에 전달
  • 서비스는 Android 5.0(API 레벨21) 이상에서는 JobScheduler 클래스를 사용하여 작업 예약 가능.Intent를 bindService()에 전달하여 바인딩 가능
  • 브로드캐스트는 sendBroadcast(), sendOrderedBroadcast(), sendStickyBroadcast() 메서드에 Intent 전달
  • 콘텐츠 제공자가 쿼리를 수행하려면 ContentResolver에서 query() 수행
  • 인텐트 및 인텐트 필터

매니페스트 파일

  • 매니페스트 파일(AndroidManifest.xml)을 읽어서 앱 구성 요소가 존재하는지 확인
  • 모든 구성 요소 선언 필요
  • 앱 프로젝트 디렉토리 루트에 있어야 함
  • 앱이 요구하는 모든 사용자 권한(인터넷 엑세스, 사용자 연락처 읽기 액세스) 식별
  • 앱 API 레벨 선언
  • 앱에서 사용하거나 요구하는 하드웨어 및 소프트웨어 기능(ex. 카메라, 블루투스 서비스, 멀티터치 등..) 선언
  • 앱이 링크되어야 하는API 라이브러리(ex. google Maps 라이브러리)선언

매니페스트

  • android:name 특성이 Activity 하위 클래스의 완전히 정규화된 클래스 이름
  • android:label는 액티비티 사용자에게 표시되는 레이블 문자
  • 모든 앱 구성 요소를 선언해야함. 포함되지 않으면 시스템에 표시되지 않고, 실행될 수 없음
  • Broadcast Receiver는 매니페스트에서 선언해도 되고 Broadcast Receiver로 동적으로 생성한 다음 시스템에 등록해도 됨.(registerReceiver() 사용)
  • 액티비티
  • 서비스
  • Broadcast Receiver
  • 콘텐츠 제공자
  • AndroidManifest.xml
    <?xml version="1.0" encoding="utf-8"?>
    <manifest ... >
    <application android:icon="@drawable/app_icon.png" ... >
    <activity android:name="com.example.project.ExampleActivity"
    android:label="@string/example_label" ... >
    </activity>
    </application>
    </manifest>

    구성 요소 기능 선언

  • 암시적 인텐트로 수행할 작업을 사용자가 선택할 수 있다
  • 인텐트를 service에 바인딩할 경우 명시적 인텐트를 사용하여 앱 보호 필요(어떤 앱을 응답할 것인지 모르므로)
  • 앱의 매니페스트에서 엑티비티 선언 시 액티비티의 기능을 선언하는 인텐트 필터를 포함시켜 다른 앱으로 부터 인텐트 응답하게도 가능
  • 인텐트 필터(요소를 해당 구성 요소의 선언 요소에 하위로 추가하면 인텐트 필터 선언 가능)
  • 아래 예제는 이메일을 작성하는 액티비티가 포함된 이메일앱을 빌드 시 Send 인텐트에 응답하는 인텐트 필터 선언
    <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>

앱 요구사항 선언

  • Android폰은 각자 기능이 다르다 > 앱에 필요한 기능이 없는 기기가 있을 수 있다
  • 이런 불상사를 방지하려면 앱이 지원하는 기기 유형에 대한 프로필을 명확하게 정의하는 것이 중요 > 매니페스트 파일에 기기와 소프트웨어 요구사항 선언
  • 정보성이지만 외부 서비스(ex. Google Play)가 선언을 읽기도 함
  • 카메라가 필요하고 API레벨 7에 도입된 API 사용 시 매니페스트 파일에 요구사항을 다음과 같이 선언 > 조건이 맞지 않으면 설치 안됨
  • 카메라를 사용하기에 필수가 아니라고 선언 시 required 속성 false
  • 기기호환성
    <manifest ... >
    <uses-feature android:name="android.hardware.camera.any"
    android:required="true" />
    <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="19" />
    ...
    </manifest>

앱 리소스

  • 안드로이드 앱에는 다양한 앱리소스가 존재(ex.이미지, XML, 사운드 파일 등..)
  • Android 프로젝트에 포함하는 리소스마다 SDK 빌드 도구가 고유한 정수 ID로 정의
  • 이 ID로 앱코드에서 리소스나 XML로 정의된 다른 리소스에서 참조 가능(이미지 drawable/에 이미지 저장 시 R.drawable.image 라는 리소스 ID 생성)
  • 여러 기기에 대응되는 리소스를 제공할 능력이 있음(다국어 지원)
  • 리소스에 대해 한정자 제공. 기기 방향에 따라 레이아웃이 달라지는 것도 레이아웃의 디렉토리 이름으로 적용 가능
  • 리소스
  • 앱 아키텍처 가이드
Comments