웹/모바일 안드로이드 기초

1.4 컴포넌트와 리소스

안드로이드 컴포넌트

컴포넌트는 안드로이드 앱을 구성하는 기본 요소 입니다. 각 구성 요소는 시스템이나 사용자가 앱에 들어갈 수 있는 진입점이 되며 경우에 따라서는 다른 구성 요소에 종속되는 경우도 있습니다.

컴포넌트 종류는 네 가지로 Activity, Service, Content Provider, Broadcast Receiver 가 있으며 각각에 대해서는 3장과 4장에서 자세히 다루게 됩니다.

Activity

UI를 구성하는 기본 컴포넌트로 기본적으로 인터페이스를 포함한 화면 하나를 나타냅니다. 예를 들어 상품목록을 보여주는 화면이 있고 특정 상품을 선택했을때 주문정보 화면이 나타난다고 하면 두개의 서로 다른 Activity로 이루어진 것이라 이해하면 됩니다.

각 Activity 에 대한 연결은 Intent 라는 것을 통해 이루어집니다. 여러 화면으로 구성된 앱을 만드는 것은 설계 패턴을 잘 따라야 합니다. 앱의 성격에 따라 여러 Activity 로 구성하기도 하고 Fragment 를 사용하기도 합니다.

Service

UI 없이 백드라운드로 수행되는 앱의 형태 입니다. 다른 앱을 사용하는 동안 음악이 계속 재생된다거나 네트워크를 통해 데이터를 가지고 오는 작업등이 대표적입니다. 효과적인 백그라운드 작업을 위해 JobScheduler 를 사용할수도 있습니다.

Content Provider

파일시스템, SQLite 데이터베이스 등 앱간의 데이터 공유를 위한 컴포넌트 입니다. 적절한 권한을 가진 앱에 대해 Content Provider를 통해 특정 데이터를 읽고 쓸수 있도록 합니다. 예를 들어 앱에서 주소록에 있는 데이터를 접근하고자 하는 경우를 생각해 볼 수 있습니다.

Broadcast Receiver

특정 이벤트가 발생하는 경우 앱에 전달하도록 지원하는 컴포넌트 입니다. 현재 실행되지 않은 앱에서 시스템이 브로드캐스트를 전달할 수 있는데 예를들어, 특정 시점에 울리는 알람을 설정하는 경우 앱이 실행되어 있지 않아도 해당 시점에 알림을 전달받을 수 있게 됩니다. 배터리 부족 경고역시 Broadcast Receiver 를 통해 전달됩니다.

별도의 화면을 가지고 있지는 않지만 상태표시줄에 알림을 생성해 사용자로 하여금 이벤트가 발생했음을 전달할 수 있습니다.



리소스 파일

res 폴더에는 다양한 리소스(Resource) 파일들이 위치 합니다. 리소스는 프로그램을 구성하는데 필요한 설정파일이나 이미지, 사운드, 데이터, 텍스트, 다국어 등의 정보들을 말합니다.

<resources>
    <string name="hello_txt">Hello World App</string>
</resources>

예를들어 strings.xml에 위와 같이 등록해 두면 코드에서 "Hello World App" 이라는 문자열을 바로 사용하는 것이 아니라 다음과 같이 리소스를 이용하는 것으로 변경할 수 있으며 레이아웃 xml 에서 해당 문자열을 "hello_txt"이라는 키값으로 사용할 수 있습니다.

# 레이아웃 xml 에서 사용하는 경우
<TextView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/hello_txt" />

# 자바 코드에서 사용하는 경우
String string = getString(R.string.hello_txt);


레이아웃 파일

UI(User Interface)를 가지는 응용 프로그램 개발에 있어 가장 중요하면서도 어려운 부분이 레이아웃 입니다. 스마트폰에 설치되어 있는 많은 프로그램들의 화면들과 비슷하게 만들기는 생각보다 많이 어렵습니다.

레이아웃과 UI 디자인 관련 부분은 2. 사용자 인터페이스 에서 보다 자세히 배우게 됩니다.

기본적으로 안드로이드에서는 화면 구성을 xml 파일로 관리 합니다. 이 방법은 프로그램의 코드와 화면을 분리시켜 화면이 변경될 경우에도 코드에 미치는 영향을 최소화 하기 위한 것으로 iOS 역시 비슷한 방법을 사용하고 있습니다.

xml 파일을 직접 손으로 작성하는 것도 가능하며 레이아웃 편집기를 이용해 버튼, 텍스트, 레이아웃, 컨테이너 등을 시각적인 화면에서 편집하는 것도 가능합니다. 물론 레이아웃 에디터를 사용하는 것이 편리하기는 하지만 생산성 측면에서는 xml 파일을 직접 작성하는 것이 빠를수도 있습니다.

[그림: 레이아웃 xml 파일과 레이아웃 편집기]

기본적으로 Activity 마다 해당 Activity 를 위한 레이아웃 xml 파일이 있어야 합니다.



Android manifest 파일

안드로이드 프로그램은 일반적인 프로그램과 같이 main() 블럭이 없습니다. 개발자가 만드는 프로그램 코드는 안드로이드 시스템에 의해 관리되며 라이프사이클을 가지게 됩니다.

AndroidManifest.xml 파일은 개발자가 만든 프로그램에 대한 정보(Android 빌드 도구, Android 운영체제 및 Google Play에 앱에 관한 필수 정보)를 안드로이드 시스템에 전달하는 역할을 담당 합니다. Activity를 비롯해 앱을 구성하는 각종 컴포넌트 및 관련 정보들은 반드시 이곳에 등록되어야 합니다.

안드로이드 스튜디오를 사용하게 되면 관련된 컴포넌트등을 생성할 때 기본적인 정보가 등록되게 되며 필요시 직접 수정할수 있습니다.

앱의 기본적인 정보 이외에도 많은 설정이 포함되며 대표적인것은 다음과 같습니다.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.helloapp">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

@로 시작되는 문자열은 리소스 사용을 의미하고 경로,파일/리소스 키 형식으로 사용 합니다. 새로운 아이디를 부여하는 경우에는 @+id/아이디 형식이 됩니다.


실습 및 참고자료

실습: Hello Android App 개선 - logcat 및 String resource 활용

안드로이드 스튜디오의 다양한 사용법을 익히고 String resource 설정과 logcat 사용등 앞에서 만든 Hello Android App을 개선해 봅니다.

프로젝트 준비

기존 HelloApp 프로젝트를 그대로 사용해도 되고 복사해서 사용해도 됩니다. 단순히 코드 파일만 복사하는 것이 아니라 프로젝트 디렉토리를 통째로 복사해 사용해야 합니다.

String resource 사용

현재 TextView 를 통해 출력하고 있는 “Hello World App”을 String resource 를 사용하는 것으로 변경 합니다.

Logcat 사용

프로그램 실행중 각종 정보의 출력이나 에러메시지 혹은 정보의 확인을 위해 간단한 출력이 필요한 경우 로그 메시지를 출력하도록 할 수 있습니다. 출력 메시지는 안드로이드 스튜디오의 Logcat 패널을 통해 나타납니다. 프로그램에서는 Log.d() 와 같이 메시지를 남길 수 있습니다.

Log.d("MainActivity", "Hello World");

참고자료