반응형

프래그먼트(Fragment)라는 녀석도 있지만, 어플리케이션이 기본적으로 동작하기 위해선 무조건 하나이상의 액티비티가 있어야한다.


보통 메인 액티비티가 그 역할을 한다. 


또 프래그먼트라는 녀석은 결국 액티비티위에서 자신의 생명이 좌지우지 되기때문에 


프래그먼트의 생명주기가 어플리케이션의 생명주기라고 볼 수 없고, 액티비티의 생명주기가 더 맞다고 볼 수 있다. 


따라서 우리는 하나의 액티비티가 어떻게 살다가 죽는지 알아보자 


또. 다른 액티비티와의 관계에 있어서 서로 어떤 프로세스를 거치는지 알아보자.



액티비티 생명주기



1. onCreate()

Activity가 처음 만들어질 때 호출되는 함수이면서, 어플리케이션이 처음 시작할 때 최초로 한번 실행되는 함수이다. 주로 view를 만들거나 view resource bind , data to list 등을 onCreate()에서 담당하며, 이전 상태의 정보를 담고있는 Bundle을 제공한다.


2. onStart()

Activity가 다시 시작되기 전에 호출, Actvitiy가 멈춘 후 호출되는 함수, Activity가 사용자에게 보여지기 직전에 호출되는 함수


3. onResume()

Activity가 비로소 화면에 보여지는 단계, 사용자에게 Focus를 잡은 상태


3-1 onRestart()

Activity가 멈춰있다가 다시 호출될 때 불리는 함수, 즉 Stopped상태였을 때 다시 호출되어 시작될 때 불린다.


---------- 다른 Activity가 호출 되는 경우 ---------- 


4. onPause()

 Activity위에 다른 Activity가 올라와서 focus를 잃었을 때 호출되는 함수. 

 완전 Activity가 가려지지 않은 상태에서 호출되는 함수.

 즉 일부분이 보이거나 투명상태일 경우 호출된다.

 다른 Activity가 호출되기 전에 실행되기 때문에 onPause()함수에서 시간이 많이 소요되는 작업이나, 

 많은 일을 처리하면, 다른 Activity가 호출되는 시간이 지연되기 때문에 많은 일을 처리하지 않도록 주의하자.

 영구적인 data는 여기서 저장한다.


5. onStop()

Activity위에 다른 Activity가 완전히 올라와 화면에서 100% 가려질 때 호출되는 함수. 홈키를 누르는 경우. 

또는 다른 액티비티페이지 이동이 있는 경우. 만약 이상태에서 Activity가 다시 불려지면, onRestart()함수가 호출된다.


6. onDestroy()

Activity가 완전히 스택에서 없어질 때 호출되는 함수, 즉 제거되는 경우. 

finish() 메소드가 호출되거나, 시스템 메모리 확보를 위해 호출된다.


*onStop(), onDestroy() 함수는 호출되지 않을 수 있음.

예) 메모리 부족으로 인해 onStop()을 안 탈 수 있다.



반응형
,
반응형

안드로이드의 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 이야기]

반응형
,