반응형

안드로이드의 4대 컴포넌트는 액티비티, 서비스, 콘텐트제공자, 방송수신자 이렇게 4가지를 말합니다. 어플리케이션을 만들때 주요 구성요소이자 안드로이드의 사실상의 모든 구성요소입니다. 각각의 구성요소는 인텐트를 통해서 상호 통신을 합니다. 즉 액티비티에서 다른 구성요소를 호출할때는 인텐트를 거쳐야 한다는 것입니다.


구성요소



Activity(액티비티)

액티비티는 UI 화면을 담당하는 컴포넌트입니다. 액티비티 역할을 하기 위해서는 자바소스에서 Activity클래스를 상속해야 하며 액티비티가 기본적으로 가지고 있는 생명주기 메소드를 재정의하여 원하는 기능을 구현하는 방식으로 제작합니다. 가장 많이 쓰이는 컴포넌트 이기때문에 굉장히 중요하다고 볼 수 있습니다.


Activity(액티비티)의 특징

1. 안드로이드 어플리케이션은 반드시 하나이상의 Activity를 가지고 있어야 합니다.

2. 두개의 액티비티를 동시에 Display할 수 없습니다.

3. 다른 어플리케이션의 액티비티도 불러낼 수 있습니다.

4. 액티비티 내에는 프래그먼트(Fragment)를 추가하여 화면을 분할시킬 수 있습니다.


public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

굉장히 익숙하신 코드죠? 이게 바로 액티비티입니다.



2. Service(서비스)

서비스는 백그라운드에서 실행되는 프로세스를 의미합니다. 서비스는 화면이 존재하지 않습니다. 하지만 서비스도 애플리케이션의 구성요소이므로 새로 만든 후에는 항상 매니페스트에 등록을 해주어야 합니다. 메인 액티비티에서 서비스를 시작하고 싶은 경우에는 startService()라는 메서드를 이용해 서비스를 실행시킬 수 있습니다.


서비스

Service(서비스)의 특징

1. 화면이 없습니다. 그저 백그라운드에서 돌아가는 컴포넌트입니다.

2. 한번 시작된 서비스는 어플리케이션이 종료되도 계속해서 백그라운드에서 돌아갑니다.

3. 모든 서비스는 Service클래스를 상속받아서 사용합니다.

4. 네트워크를 통해서 데이터를 가져올 수 있습니다.



3. Content Provider(콘텐트 제공자)

콘텐트 제공자는 데이터를 관리하고 다른 어플리케이션 데이터를 제공해주는 컴포넌트입니다. 데이터베이스의 데이터를 전달할때 많이 사용합니다. 콘텐트 제공자는 생명주기를 가지고 있지 않습니다.


Content Provider(콘텐트 제공자)의 특징

1. 파일입출력, SQLiteDB, Web등을 통해서 데이터를 관리합니다.

2. 콘텐트 제공자를 통하여 다른 어플리케이션의 데이터도 변경할 수 있습니다.



4. Broadcast Recevier(방송 수신자)

방송 수신자란 안드로이드에서 다양한 이벤트와 정보를 받아 반응하는 컴포넌트입니다. 브로드캐스팅은 메시지를 여러 객체에게 전달하는 방법을 의미하는데 이렇게 전달되는 브로드캐스팅 메시지를 방송수신자라는 어플리케이션의 구성요소를 이용해 받을 수 있습니다.


방송수신자


Broadcast Recevier(방송수신자)의 특징

1. 디바이스에서 발생하는 일 중에서 어플리케이션이 알아야 하는 상황이 발생하면 알려줍니다.

2. 수신기를 통해 디바이스의 상황을 감지하고 적절한 작업을 수행합니다.

3. 대부분 UI가 존재하지 않습니다.


// 추가

1. Activity - 화면 UI를 구성하는 View를 담을 수 있는 그릇이라고 생각하시면 됩니다. 모든 화면이 있는 

                   어플리케이션이라면 Activity가 존재하며 Activity가 존재해야만 화면 구성을 할 수가 있습니다. 

                   Activity를 사용하기 위해서는 manifest.xml 파일에 등록을 해야하고 Activity 생명주기를 

                   잘 이해하셔야 합니다. 다음 포스팅에서 Activity 생명주기에 대해 설명 드리겠습니다.


2. Service - Service는 백그라운드에서 실행되는 컴포넌트로 눈에 보이지는 않지만 오랜동안 실행되는 작업이나 

                   원격 프로세스를 위한 작업을 할 때 사용합니다. 앞서 보이지 않다고 말씀드렸듯이 사용자 인터페이스를 

                   제공하지 않습니다. 또한 사용자가 다른 어플리케이션으로 전환하더라도 백그라운드에서 계속해서 실행합니다. 

                   예를 들면 스마트폰으로 음악을 들을 때 보통 앱을 켜고 음악을 선택해 플레이 시킨 다음 다른 앱을 켜도 

                   노래가 계속 흘러나오는 것이 바로 Service를 활용하여 음악 플레이 하는 부분을 구현 한 것입니다. 

                   Activity와 마찬가지로 사용하기 위해서는 manifest.xml 파일에 등록을 해야하고 

                   Activity와 연동 된 수명주기를 잘 이해하셔야 합니다.


3. Broadcast Receive - Broadcast Receive는 안드로이드 단말기에서 발생하는 다양한 이벤트나 정보를 받고 

                                      정보에 따라 반응하는 컴포넌트 입니다. 단말기에서 발생하는 일 중에서 어플리케이션이 알아야 하는 

                                      상황을 계속해서 알려주는 역할을 합니다. 예를 들면 배터리가 없거나 문자나 전화가 왔을 때 

                                      우리가 알고 싶지 않아도 알려주도록 구현되어 있는 것과 같이 Broadcast Receive를 이용해서 

                                      여러 상황을 감지하고 적절한 작업을 수행하는 역할을 합니다.


4. Content Provider - Content Provider는 어플리케이션 간 데이터를 공유하게 해주는 인터페이스입니다. 

                                    안드로이드 시스템의 각종 설정 값 이라던지 SD카드 내의 미디어 등에 접근하는 것이 가능하고, 

                                    다른 어플리케이션에 접근하는 것도 가능합니다. 물론 접근하려는 어플리케이션에서 

                                    정의한 수준의 접근만 가능하게 됩니다. 가장 쉬운 예시가 전화번호부 어플리케이션 입니다. 

                                    이 어플리케이션에 저장되어 있는 DB를 이용하여 많은 어플리케이션들이 사용하고 있습니다. 

                                    페이스북이나 카카오톡 등등 전화번호부를 확인하여 자동으로 친구추가가 되는 기능을 생각하시면 

                                    이해가 쉬울 것 같습니다. 전화번호부 어플리케이션에서 Content Provider를 제공하고 

                                    카카오톡이나 페이스북에서 Content Resolver를 가지고 제공하는 데이터를 읽어 오는 것입니다. 

                                    이와같이 Content Provider는 자신의 데이터를 제공해주는 어플리케이션에서 구현해주는 

                                    컴포넌트라고 생각하시면 됩니다.


반응형
,
반응형

1. 다국어 지원을 위한 values 추가


기본적으로 안드로이드 앱에서 사용되는 문자열들은 res\values\strings.xml에 정의해서 사용합니다.


여러 언어를 지원하려면 새로운 언어를 위한 values 디렉토리를 만들고 그 안에 그 언어로 된 strings.xml을 만들면 됩니다. 새로운 언어를 위한 values 디렉토리의 형식은 values-"언어 코드 2자리(소문자)" 입니다. 예를 들어 영어라면 values-en, 일어라면 values-jp 등으로 만들면 됩니다.


언어 코드는 ISO 639-1의 두자리를 사용하고, 그 코드는 http://www.loc.gov/standards/iso639-2/php/code_list.php 에서 찾아볼 수 있습니다.


아래에 가장 많이 쓸 것 같은 7개 언어를 정리해 봤습니다. (저는 영어, 한국어 이외에는 쓸 일이 없겠네요.)

  • 한국어 ko
  • 영어 en
  • 일어 jp 
  • 중국어 zh 
  • 불어 fr 
  • 독일어 de
  • 스페인어 es

만약 영어처럼 사용하는 지역이 여러 곳인 언어에 대해 특정 지역을 추가로 지정하고 싶으면

ISO 3166-1-alpha-2의 지역 코드 2자리를 values-"언어 코드 2자리(소문자)"-r"지역 코드 2자리(대문자)" 로 붙이면 됩니다. 예를 들어 미국에서 사용하는 영어라고 콕 집어 지정하고 싶으면 en-r에 US를 붙여서 values-en-rUS 로 하면 됩니다.


이에 대한 코드는 https://www.iso.org/obp/ui/#search/code/ 에 잘 나와 있습니다.



2. 다국어 지원을 위한 strings.xml 의 예제


한국어와 영어를 지원하는 앱의 예를 들어보도록 하겠습니다. 슬프지만, 영어를 할 줄 아는 사람이 전세계적으로 보면 더 많기 때문에 기본은 영어로 하고 한국어를 추가하도록 하겠습니다.


1) res\values\strings.xml


영어로 된 strings.xml은 다음과 같습니다.


1
2
3
4
5
6
7
8
<resources>
    <string name="app_name">Sample</string>

    <string name="hello">Hello</string>
    <string name="android">android</string>
    
    <string name="some_key">ca-app-pub-3930256*^^*99962527/6300978111</string>-->
</resources>


2) res\values-ko\strings.xml


한글을 위해 values-ko 디렉토리를 만들고 그 안에 strings.xml을 새로 만듭니다. 이 때 기본(영어) strings.xml와 내용이 동일하다면 아래처럼 생략해도 무방합니다. 특히 some_key와 같이 복잡한 내용이라면 한 곳에서 관리하는 것이 좋아보입니다. 하지만, 기본적으로 안드로이드에서는 모든 항목에 대해 별도로 나눠서 관리하는 것을 더 좋아하는 것도 같습니다.


1
2
3
4
5
<resources>
    <string name="app_name">예제</string>

    <string name="hello">안녕</string>
</resources>



3. 다국어 사용 예제


관리는 나눠서 하지만, 사용할 때는 동일하게 하는 것이 안드로이드의 다국어 지원 방식의 장점입니다. 익숙할테니 짧게 살펴보겠습니다.


1) xml


AndroidManifest.xml이나 layout 등에서는 다음 @string/app_name 처럼 사용하면 됩니다.

이 경우라면 기기 설정을 한국어로 한 경우라면 앱의 아이콘 아래 이름이 '예제'가 될 것이고, 나머지 경우라면 'Sample'이 될 것입니다.

 

1
2
    <application
        android:label="@string/app_name"


2) java


Activity와 같은 소스에서는 다음처럼 사용합니다.


1
        mTextView.setText(R.string.hello);



4. 앱 배포


만약 위의 예제처럼 두 개의 strings.xml이 다른 경우에는 배포를 위해 apk를 만들 때 다음과 같은 에러를 볼 수 있습니다.


Error:Execution failed for task ':app:lintVitalRelease'.

> Lint found fatal errors while assembling a release target.

To proceed, either fix the issues identified by lint, or modify your build script as follows:

...

android {

    lintOptions {

        checkReleaseBuilds false

        // Or, if you prefer, you can continue to check for errors in release builds,

        // but continue the build even when errors are found:

        abortOnError false

    }

}

...


이 경우 lint를 무시하고 싶다면 에러 메시지에서 말하는 것처럼 app 수준의 build.gradle에 아래처럼 추가하면 됩니다.


1
2
3
4
5
6
7
8
9
android {
    ...
    lintOptions {
        checkReleaseBuilds false
        // Or, if you prefer, you can continue to check for errors in release builds,
        // but continue the build even when errors are found:
        abortOnError false
    }
}



5. 예외


strings.xml에 정의한 것만으로는 부족할 때가 있는데 대표적인 경우가 다른 값들과 결합해서 문자열을 만들 때 입니다. 예를 들어 상품을 판매한다고 할 때 "이 상품은 1,000원입니다." 라고 한국어로 표현하는 것을 영어로 한다면 "It costs 1 USD." 처럼 문법이나 화폐 단위에 따라 문자열을 별도로 구성해줘야 할 필요가 생깁니다.


이런 경우에는 다음처럼 기기의 언어 코드를 가져와서 직접 적합한 문자열을 만들 수 있습니다.


1
2
3
4
5
6
7
8
        Locale mLocale = getResources().getConfiguration().locale;
        String language = mLocale.getLanguage();

        if (language.contains("ko"))
            //한국어인 경우 처리
        else if (language.contains("ko") {
            //한국어가 아닌경우 처리
        }


이상으로 안드로이드 앱에서 다국어를 지원하는 방법을 살펴봤습니다. 




출처: http://zeany.net/49 [소소한 IT 이야기]

반응형
,
반응형

디렉토리 구조

 파일, 폴더

 설명

 asets 폴더

 리소스 폴더이다.

 최초는 비어 있는데, 이 안에 비디오, 오디오 등의 파일을 저장한다.

 bin 폴더

 컴파일된 결과 파일이 저장된다.

 gen/R.java

 프로젝트 내의 각종 개체에 접근할 수 있는 ID를 정의한다.

 툴이 자동으로 관리하므로 직접 편집해서는 안된다.

 res

 문자열, 이미지 등 애플레케이션에서 사용할 리소스 파일

 src

 애플리케이션 소스코드 

 AndroidManifest.xml

 프로젝트의 버전이나 이름, 구성 등에 대한 정보를 가진다.

 default.properties

 프로젝트의 빌드 타겟이 명시되어 있다.

 proguard.cgf

 프로젝트의 빌드 타겟이 명시되어 있다.

 .classpath

 소스 파일의 위치, 출력 폴더, 공통 라이브러리 위치 등에 대한 정보가 기록되어 있다.

 .project

 빌드 순서와 방법 등이 명시되어 있다.

 리소스, 프리 컴파일, 자바 컴파일, APK 생성 순으로 빌드됨을 알 수 있다.

 

 

 

 

리소스 디렉토리

리소스 디렉토리는 이미지를 넣는 drawable 디렉토리와

레이아웃 XML 파일을 넣는 layout디렉토리 등으로 이루어져 있다.

 

기본 프로젝트에 자동으로 생성되지 않은 raw, xml 디렉토리 등은 직접 생성하면 된다.

 

어떤 모드에서라도 동일하게 보여지고 싶다면 res/layout/ 디렉토리에 작성해야 하며,

모드별로 각각 다르게 보여주고 싶다면, res/layout-port/, res/layout-land/에 작성한다.

 

 리소스

설명 

 res/drawable-hdpi

 hdpi에서 보여질 이미지

 res/drawable-ldpi

 ldpi에서 보여질 이미지

 res/drawable-mdpi

 mdpi에서 보여질 이미지

 res/drawable-xhdpi

 xhdpi에서 보여질 이미지

 res/drawable-nodpi

 밀도(density)에 상관없이 보여질 이미지

 res/layout/

 사용자 인터페이스 레이아웃을 정의하는 XML 파일

 res/layout-port/

 사용자 인터페이스 레이아웃을 정의하는 XML 파일(세로 모드)

 res/layout-land/

 사용자 인터페이스 레이아웃을 정의하는 XML 파일(가로 모드)

 res/menu/

 메뉴를 정의하는 XML 파일

 res/values/

 문자열 등의 각종 값을 정의하는 파일

 res/xml/

 XML 형태로 저장된 다양한 파일

 res/raw/

 기타 파일(mp3, mp4 등)

 

자세한 부분은

http://developer.android.com/guide/practices/ui_guidelines/index.html

여기서 참조한다.

 

 

 

매니페스트 구조

 <uses-permission />

 애플리케이션이 필요로 하는 권한

 <permission />

 외부 액티비티나 서비스가 필요로 하는 권한

 <instrumentation />

 액티비티가 실행되는 등의 주요 이벤트가 발생했을 때,

 애플리케이션의 어떤 부분을 호출할지를 지정(기록, 모니터링 등)

 <uses-library />

 추가로 필요로 하는 라이브러리 지정(구글 맵스)

 <uses-sdk />

 애플리케이션이 필요로 하는 안드로이드 버전

 <application />

 애플리케이션과 관련된 정보


반응형
,
반응형


안드로이드는 기본적으로 리눅스 커널 위에 탑재된 안드로이드 런타임인 DVM(Dalvik Virtual Machine, 달빅 가상 머신)에서 동작한다. 이를 그림으로 간단히 표현하면 다음과 같다.



안드로이드의 주요 컴포넌트를 각 영역별로 정리하면 다음과 같다.


  • 애플리케이션(APPLICATIONS): 자바로 개발된 애플리케이션이 위치하는 영역이며, 이메일 클라이언트, SMS 프로그램, 달력, 지도, 브라우저, 주소록 등의 애플리케이션이 탑재되어 있다. 또한 우리가 자바로 개발한 애플리케이션이 탑재되는 영역이 바로 여기이다.

  • 애플리케이션 프레임워크(APPLICATION FRAMEWORK): 애플리케이션 프레임워크는 애플리케이션을 개발하기 위해 필요한 각종 API를 제공하는 영역이다. 이 영역에 있는 각종 API를 사용하면 화면에 버튼이나 텍스트 등을 표현하거나 주소록 같은 다른 애플리케이션의 데이터를 사용할 수도 있다. 또한 이미지, 문자열 등의 여러 데이터를 접근하거나 애플리케이션의 생명주기(lifecycle)를 관리하는 API도 이 영역에서 제공한다.

  • 라이브러리(LIBRARIES): 안드로이드에서 사용할 수 있는 다양한 C/C++ 라이브러리를 제공하는 영역이다. 이 영역의 라이브러리는 모두 애플리케이션 프레임워크를 통해 개발자가 사용할 수 있게 하고 있다. BSD(버클리 소프트웨어 배포판)를 기반으로 한 표준 C 시스템 라이브러리가 임베디드 리눅스 기반의 디바이스에 맞게 수정되어 있으며, PacketVideo의 OpenCore를 기반으로 한 미디어 라이브러리는 MPEG4, H.264, MP3, AAC, AMR, JPG, PNG 등의 파일들을 지원한다. 서피스 매니저(surface manager)는 2D, 3D 그래픽를 지원하며, WebKit은 브라우저 기능을 지원한다. 그리고 임베디드용으로 개발된 데이터베이스 엔진인 SQLite(에스큐엘라이트)를 제공하고 있다.

  • 안드로이드 런타임(ANDROID RUNTIME): 안드로이드는 자바 기반으로 동작하지만 JVM(자바 가상 머신, Java Virtual Machine)을 그대로 사용하지 않고 DVM(달빅 가상 머신, Dalvik Virtual Machine)을 사용하고 있다. 그래서 작성된 소스 코드(.java)는 자바 컴파일러에 의해 클래스 파일(.class)로 컴파일되며, 클래스 파일은 DX 컴파일러에 달빅 바이트 코드로 변환되며 달빅 실행파일(.dex, Dalvik Executable)과 최적화된 달빅 실행파일(.odex, Optimized Dalvik Executable)로 저장된다. 이 파일들은 안드로이드 기기에서 실행되기 그리고 달빅은 메모리가 작은 소형 기기에서도 효율적으로 동작할 수 있도록 최적화되어 있다. 참고로 안드로이드 4.4(킷캣) 이전에는 Dalvik 기반이었지만 4.4에서는 ART가 새롭게 도입되었으며 안드로이드 5.0(롤리팝)부터는 ART 기반으로 변경되었다.

  • 리눅스 커널(LINUX KERNEL): 안드로이드는 리눅스 커널 3.0.1(안드로이드 4.0)을 기반으로 하며, 이를 통해 보안, 메모리 관리, 프로세스 관리, 네트워크 스택과 각종 드라이버를 제공한다.

TIP & TECH 달빅(Dalvik)
안드로이드는 자바 코드로 작성하기 때문에 자바 가상 머신(JVM, Java Virtual Machine) 상에서 동작한다고 생각할 수 있지만 실제로는 달빅 가상 머신(DVM, Dalvik Virtual Machine) 상에서 동작한다. 달빅은 자바 코드를 최적화시켜 소형 기기에서도 잘 작동할 수 있도록 해주며 자바 바이트 코드를 변환해서 확장자가 dex(Dalvik Executable)인 바이트 코드를 생성한다. 또한 달빅은 JIT(Just In Time) 컴파일 방식을 사용하기 때문에 앱을 실행할 때마다 바이트 코드를 머신 코드로 변경하며 이 과정에서 추가적인 메모리를 필요로 한다.안드로이드 4.4(킷캣)까지만 사용되었으며 5.0(롤리팝)부터는 ART로 변경되었다.

TIP & TECH ART(Android Run Time)
안드로이드 5.5(롤리팝)부터 기본으로 채택되었으며 다음과 같은 장점을 가지며 하위호환성을 위해 달빅과 동일한 바이트코드를 사용한다.

  • AOT(Ahead-of-time) 컴파일
  • 가비지컬렉션 기능 향상
  • 디버깅 지원 기능 향상

ART에서 채택한 AOT 컴파일은 앱이 실행될 때 바이트 코드를 변환하는 대신에 앱이 설치될 때 DEX 바이트 코드를 머신 코드로 변환하는 작업을 한다. 그래서 설치 시간이 길어지지만 실행시간은 짧아지는 장점이 있다.

반응형
,