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 를 통해 전달됩니다.
별도의 화면을 가지고 있지는 않지만 상태표시줄에 알림을 생성해 사용자로 하여금 이벤트가 발생했음을 전달할 수 있습니다.
리소스
리소스는 코드 이외에 프로그램 동작에 필요한 여러 구성요소들을 말합니다. 예를들어 설정 파일이나 이미지, 사운드, 데이터, 텍스트, 다국어 등의 정보들을 말합니다.
리소스 이름 규칙
안드로이드 프로젝트 생성시 기본적으로 생성되는 리소스 파일들이나 파일내에서 사용되는 name, id 값들이외 추가되는 리소스들에 대한 이름에 대해 강제되는 규칙은 없습니다. 다만 일반적으로 다음과 같은 규칙에 따라 작성하는 것을 원칙으로 하고 있습니다.
모든 리소스에 무리해서 적용할필요는 없고 리소스 유형에 따라 what_description, where_description 등 유연하게 적용하되 일관된 규칙에 따라 작성하면 됩니다.
[what]_[where]_[description]_[size]
- what: 리소스가 무엇인지 의미, ex) activity, fragmnet …
- where: 어디에서 사용되는지 의미, ex) main, user, settings …
- description: 리소스에 대한 간단한 설명, ex) title, content, profile …
- size: 아이콘이나 이미지등의 경우 크기 표시, 24dp, small … (optional)
주의할점은 리소스 이름은 R 클래스의 필드로 바뀌기 때문에 자바 식별자 규칙에 따라 숫자로 시작할 수 없으며 소문자로 작성해야 합니다. 즉 a~z, 0~9, ‘_’ 조합으로 작성.
id 와 name
id 는 레이아웃 xml 리소스 파일에서 UI 위젯들을 구분하기 위해 사용하고 name 의 경우 values 폴더의 리소스 파일에서 해당 리소스들을 구분하기 위한 이름으로 사용합니다.
<EditText
android:id="@+id/et_addr"
... />
<Button
android:id="@+id/btn_login"
... />
<string name="app_name">IntentExam</string>
새로운 아이디를 부여하는 경우 @+id/아이디
형식으로 사용하고 정의된 리소스를 사용하는 경우에는 @리소스 파일명/리소스 이름
형식으로 사용 합니다.
리소스 폴더
res 폴더에는 다양한 리소스(Resource) 파일들이 위치 합니다.
- drawable: 앱에서 사용하는 모든 이미지가 위치하는 폴더
- layout: activity_main.xml 을 비롯해 Activity 의 레이아웃 파일이 위치
- mipmap: 프로그램 런처 아이콘이 위치. 해상도에 따라 서로 다른 크기의 이미지가 포함됨. 예를들어 medium (mdpi), high (hdpi), or extra-extra-extra-high (xxxhdpi). ic_launcher.xml은 모든 dpi 에 적용되는 파일임.
- values: 프로그램 코드에서 직접 작성(하드코딩)하는 문자열, 색상, 크기, 스타일 등을 분리해둔 파일이 위치하는 폴더로 코드내 문자열 값등을 직접 사용하는 것에 따른 문제(향후 변경 이나 다국어 처리)르 해결하기 위한 방법임.
colors.xml
,dimens.xml
,strings.xml
,styles.xml
이 기본적으로 생성되어 있음.
<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 파일을 직접 작성하는 것이 빠를수도 있습니다.
기본적으로 Activity 마다 해당 Activity 를 위한 레이아웃 xml 파일이 있어야 합니다.
Android manifest 파일
안드로이드 프로그램은 일반적인 프로그램과 같이 main()
블럭이 없습니다.
개발자가 만드는 프로그램 코드는 안드로이드 시스템에 의해 관리되며 라이프사이클을 가지게 됩니다.
AndroidManifest.xml
파일은 개발자가 만든 프로그램에 대한 정보(Android 빌드 도구, Android 운영체제 및 Google Play에 앱에 관한 필수 정보)를 안드로이드 시스템에 전달하는 역할을 담당 합니다. Activity를 비롯해 앱을 구성하는 각종 컴포넌트 및 관련 정보들은 반드시 이곳에 등록되어야 합니다.
안드로이드 스튜디오를 사용하게 되면 관련된 컴포넌트등을 생성할 때 기본적인 정보가 등록되게 되며 필요시 직접 수정할수 있습니다.
앱의 기본적인 정보 이외에도 많은 설정이 포함되며 대표적인것은 다음과 같습니다.
- 앱에서 요구하는 모든 사용자 권한(예: 인터넷 액세스, 사용자의 연락처에 대한 읽기 액세스)을 식별.
- 어느 API를 사용하는지를 근거로 앱에서 요구하는 최소 API 레벨을 선언.
- 앱에서 사용하거나 요구하는 하드웨어 및 소프트웨어 기능(예: 카메라, 블루투스 서비스, 멀티터치 화면)을 선언.
- 앱과 연결된 API 라이브러리(Android 프레임워크 API 제외)(예: Google Maps라이브러리)를 선언.
<?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>
실습 및 참고자료
실습: 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");
- d는 Debug 모드로 개발을 위해 모니터링 하는 용도의 메시지.
- i는 Info 모드로 단순한 정보 예를들어 프로그램 시작, 메시지 수신 등 메시지 출력.
- e는 Error 모드로 에러메시지 출력에 사용.
참고자료
- 앱 리소스 개요: https://developer.android.com
- 앱 매니페스트 개요: https://developer.android.com