본문 바로가기

Android/Theory

Chapter 4. Application Construction

Chapter 4. Application Construction

1. Layout Inflation

 - Inflation

  · XML Layout에 정의된 내용이 Memory 상에서 객체화하는 과정

  · XML Layout File의 경우 Project가 Build되는 시점에 Binary File로 Compile되어 Application에 포함되는데 실제로 실행 시점이 돼서야 Load되어 Memory 상에 객체화된다.

  · Inflation 관련 Class & Method

   ◦ setContentView() Method

1
2
3
4
5
6
7
8
public class MainActivity extends ActionBarActivity {
      @Override
      protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
      }
      ……
}
cs

    ▹ 화면에 나타낼 View를 지정하는 역할과 XML Layout의 내용을 Memory 상에 객체화하는 역할을 한다.

    ▹ Activity의 화면 전체를 설정하며 전체가 아닌 일부 View만을 위한 XML Layout을 Memory 상에 객체화하려면 별도의 Inflation 객체를 사용해아 한다.

    ▹ 보통 Main Layout은 /res/layout/activity_main.xml에 정의되어 있으며 Code로는 setContentView(R.layout.activity_main)로 나타낼 수 있다.

   ◦ LayoutInflater Class

    ▹ 일부 View만을 위한 XML Layout을 Memory 상에 객체화하기 위해 사용되는 Class

    ▹ setContentView()를 이용해 Code를 Main Layout을 화면에 나타내고 그 일부를 분리해 File에 정의한다면 LayoutInflater 객체를 이용해 View Group 객체로 Inflation한 후 Main Layout에 추가되는 과정을 거쳐야 한다.

    ▹ 해당 Class는 System Service로 제공되며 getSystemService() Method를 이용해 참조해 사용해야한다.

    ▹ getSystemService() Method Reference

1
getSystemService(Context.LAYOUT_INFLATER_SERVICE)
cs

     ▸ System Service로 제공되는 기능은 모두 해당 Method를 이용해 객체를 참조해 사용해야 한다.

   ◦ inflate() Method

1
View inflate (int resource, ViewGroup, root, boolean attachToRoot)
cs

    ▹ 지정된 XML 자원에서 새로운 View 계층을 전개한다.

    ▹ Parameter

     ▸ resource : XML Laytout Resource 값을 지정하는 값

     ▸ root : View를 객체화하여 추가할 대상이 되는 부모 Container

     ▸ attachToRoot : 전개될 계층 구조에서 Root 매개 변수에 연결해야할지 여부를 입력한다.(true / false)

   ◦ from() Method

1
static LayoutInflater LayoutInflater.from (Context context)
cs

    ▹ System Service를 이용하지 않고 객체를 참조할 수 있도록 해주는 Method

    ▹ inflate Method와 함께 객체화를 수행 할 수 있다.

    ▹ 함께 사용되는 inflate Method 형식

1
static View inflate(Context context, int resource, ViewGroup root)
cs


2. Screen Construction and Moving Between Screen

 - Android’s Default Constructed Elements

  · Elements

   ◦ Activity

   ◦ Service

   ◦ Broadcast Receiver

   ◦ Content Provider

  · 설명

   ◦ Application이 만들어져 설치되면 Android System은 구성요소들에 대한 정보를 요구하게 되며 해당 내용은 AndroidManifest.xml File에 포함된다.

   ◦ 네 가지 구성요소는 Programmer에 의해 새로 만들어질 때마다 정보를 AndroidManifest.xml File에 포함시켜야한다.

   ◦ activity Tag

1
</activity>
cs

    ▹ Programmer가 만든 activity에 대한 정보를 포함하고 있다.

    ▹ 새로운 activity를 만들면 AndroidManifest.xml에 해당 activity에 대한 정보를 추가해야한다.

 - Activity

  · activity 추가, 요청 및 응답 과정

   ◦ 단계 1) New Activity XML Layout Define

    ▹ Main Layout XML File을 복사하고 수정해 새로운 Activity의 화면 구성을 XML Layout으로 정의

   ◦ 단계 2) New Activity Code Write

    ▹ Main Activity Java Code를 복사하고 수정해 새로운 Activity Code를 작성

   ◦ 단계 3) Request Code Define at Main Activity

    ▹ 새로운 Activity를 띄울 때 사용할 Request Code를 상수로 정의

   ◦ 단계 4) New Activity Launch

    ▹ Button 등의 Event를 처리해 startActivityForResult() Method로 새로운 Activity를 띄우는 Code를 추가

   ◦ 단계 5) Result Code send at New Activity

    ▹ 새로운 Activity에 들어 있는 Button 등의 Event를 처리하여 setResult() Method로 Result를 보내는 Code 추가

   ◦ 단계 6) Result handling Code Write at main Activity

    ▹ onActivityResult() Method를 정의해 Result 처리

   ◦ 단계 7) Activity Tag add at Manifest File

    ▹ 새로운 Activity를 Manifest File에 추가

  · Activity란

   ◦ 일반적으로 화면 하나를 하나의 Activity로 구성한다.

   ◦ 화면을 Activity로 구현하고 화면 간에 이동하는 과정은 각각의 Activity를 필요에 따라 띄우거나 닫는 과정으로 구현된다.

   ◦ activity는 setContentView() Method를 이용해 화면에 보이도록 하는 요소들을 출력하게 된다.

   ◦ 화면을 전환하는 것은 단순히 activity를 띄워주는 것이 아닌 어떤 activity를 띄운 것인지와 띄웠던 activity에게 응답을 받아 처리된다.

  · Intent 객체(3. Intent and Data Deliver 참조)

   ◦ activity를 띄우기 위한 목적으로 사용되며 activity 간에 Data를 전달하는 데에도 사용된다.

  · Intent Method

   ◦ intent Construction

1
Intent(Context packageContext, Class cls)
cs

    ▹ Prameter

     ▸ packageContex

      ▫ 해당 Application에서 참조할 Context 객체

      ▫ 객체를 참조할 시 getApplicationContext() Method를 이용해 참조한다.

     ▸ cls 

      ▫ Intent 객체에 사용할 Class

   ◦ putExtra(String name, String value)

    ▹ Intent 객체에 Data를 넣어주는 Method

    ▹ Parameter

     ▸ name : 추가할 Data의 이름으로 Key라고도 한다.

     ▸ value : 추가할 Data의 실제 값

  · Activity 응답 처리

  · Activity Method

   ◦ startActivityForResult()

1
startActivityForResult(Intent intent, int requestCode)
cs

    ▹ 새로운 activity를 화면에 출력하는 Method

    ▹ 관련 단계 : 4) New Activity Launch

    ▹ Parameter

     ▸ intent : App Component가 무엇을 할 것인지를 담는 메시지 객체

     ▸ requestCode : 정수로 된 Code 값으로 activity를 구분하기 위해 사용

    ▹ 응답에 대한 reseltCode는 중복해도 되지만 requestCode는 중복해서는 안된다.

   ◦ setResult()

1
setResult(int resultCode, Intent data)
cs

    ▹ 현재 activity를 띄운 activity로 응답을 보낼 때 사용하는 Method

    ▹ 관련 단계 : 5) Result Code send at New Activity

    ▹ Parameter

     ▸ resultCode

      ▫ requestCode에 대한 응답 Code

      ▫ 사용되는 값

       ▪ Activity.RESULT_OK : 성공 상수

       ▪ Activity.RESULT_CANCELED : 실패 상수

     ▸ data

      ▫ Intent 객체

   ◦ onActivityResult()

1
onActivityResult(int requestCode, int resultCode, Intent intent)
cs

    ▹ activity가 요청에 대한 응답을 보내오면 해당 응답을 처리하는 Method

    ▹ 관련 단계 : 6) Result handling Code Write at main Activity

    ▹ Parameter

     ▸ requestCode : 정수로 된 Code 값으로 activity를 구분하기 위해 사용

     ▸ resultCode : requestCode에 대한 응답 Code

     ▸ intent : 응답을 보내온 activity로부터 전달한 Intent로 필요한 데이터가 있을 때 넣어 전달한다.


3. Intent and Data Deliver

 - Intent

  · System에 요청을 보낼 시 System이 요구하는 Data의 형태

  · System에서 관리하는 화면을 띄우기 위해선 System으로 요청을 보내야 하며 요청을 보낼 시 System에 맞는 형식(Format)으로 요청해야한다.

  · Application 구성요소 서로 데이터를 전달할 때도 Intent를 사용한다.

  · 구성요소 간 Intent 전달 Method

   ◦ startActivity()

    ▹ Activity를 화면에 출력 시 사용

   ◦ startService()

    ▹ Service를 시작할 때 사용

   ◦ broadcast()

    ▹ broadcasting을 수행할 때 사용

  · Intent의 기본 구성요소

   ◦ Action

    ▹ 수행할 기능

   ◦ Data

    ▹ Action이 수행될 대상 Data

    ▹ 해당 Data의 유형에 따라 System에서 Runtime 시 자동으로 해당 Activity를 찾아 출력하는데 사용

    ▹ Data 유형은 MIME Type에 따라 구분된다.

     ※ MIME

      > 서로 다른 수많은 Computer들 사이에서 서로 상이한 문자 체계 등을 사용하도록 또한 다른 언어 간에 Text를 주고받고 할 수 있게 하는 다목적용 확장 기능에 대한 표준규격

   ◦ Action과 Data의 예

Action

Data

Explain

 ACTION_DIAL

 tel:01077881234

주어진 전화번호를 이용해 전화걸기 화면을 출력

 ACTION_VIEW

 tel:01077881234

주어진 전화번호를 이용해 전화걸기 화면을 출력

URI 값의 유형에 따라 VIEW Action이 다른 기능을 수행함 

 ACTION_EDIT

 content://contacts/people/2

전화번호부 Database에 있는 정보 중에 ID 값이 2인 정보를 편집하는 화면을 출력

 ACTION_VIEW

 content://contacts/people

전화번호부 Database의 내용을 보여줌

  · Intent Constructor

1
2
3
4
5
Intent()
Intent(Intent o)
Intent(String action [, Uri uri])
Intent(Context packageContext, Class<?> cls)
Intent(String action, Uri uri, Context packageContext, Class<?> cls)
cs

  · Intent의 종류

   ◦ 명시적 Intent

    ▹ Intent에 Class 객체나 Component 이름을 지정하여 호출할 대상을 확실히 알 수 있는 경우의 Intent

    ▹ 호출할 대상을 정확히 알고 있는 상태에서 사용되기 때문에 보통 호출할 대상은 Application Program 내에서 처리될 수 있는 대상이 된다.

   ◦ 암시적 Intent

    ▹ Action과 Data를 지정하긴 했지만 호출할 대상이 달라질 수 있는 경우의 Intent

    ▹ MIME Type에 따라 System에서 적절한 다른 Application의 Activity를 찾은 후 띄우는 방식

    ▹ 호출할 대상이 달라질 수 있는 경우이기 때문에 호출 대상은 File과 같은 경우가 많으며 해당 File을 열어 볼 수 있도록 다른 Application Program을 호출하여 사용하며 해당 Program은 File에 따라 달라질 수 있고 종류 또한 여러 개일 수도 있게 된다.

    ▹ Intent 처리과정

     ▸ 설치된 Application에 대한 정보를 알고 있는 System이 Intent를 이용해 요청한 정보를 처리할 수 있는 적절한 Component를 찾아본 다음 사용자에게 그 대상과 처리 사용자에게 결과를 보여준다.

    ▹ 속성

     ▸ Category

      ▫ Action이 실행되는데 필요한 추가적인 정보 제공

     ▸ Type

      ▫ Intent에 들어가는 Data의 MIME Type을 명시적으로 지정

     ▸ Component

      ▫ Intent에 사용될 Component Class 이름을 명시적으로 지정

     ▸ Extras

      ▫ Intent는 추가적인 정보를 넣을 수 있도록 Bundle 객체를 저장

 - Activity Stack & Flag

  · Activity가 관리되는 방식으로 Stack 구조를 이용해 Activity를 쌓아두었다가 상위에 있던 Activity가 사라지면 이전의 Activity를 실행시키는 방식

  · Activity Stack Mechanism

   ◦ 새로운 Activity가 화면에 띄워지게 되면 이전에 있던 Activity는 Activity Stack에 저장되고 새로운 Activity가 화면에 보이는 구조이다.

   ◦ 새로운 Activity를 만들고 Manifest File에 등록하면 해당 Activity는 startActivity() Method를 이용해 실행될 수 있다.

  · Flag

   ◦ Activity 동작 방식을 설정할 수 있도록 도와주는 설정 값

   ◦ 동일한 Activity를 여러 번 실행했을 때 동일한 Activity가 여러 개의 Stack에 들어가 있고 동시에 Data를 여러 번 접근하거나 Resource를 여러 번 사용하는 문제를 해결할 수 있도록 도와준다.

   ◦ Flag Setting Example

1
2
3
4
Intent intent = new Intent(getBaseContext(), AnotherActivity.class);    // 1)
intent.putExtra(“startCount”, String.valueOf(startCount));                // 2)
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);                        // 3)
startActivityForResult(intent, REQUEST_CODE_ANOTHER);                    // 4)
cs

    ▹ 1) Intent 객체 생성

    ▹ 2) 부가 Data 삽입

    ▹ 3) Intent Flag 설정(setFlags Method 이용)

    ▹ 4) Intent 출력

   ◦ Flag Value

    ▹ FLAG_ACTIVITY_SINGLE_TOP

     ▸ Activity를 생성할 때 이미 생성된 Activity 중 동일한 Activity가 있으면 그 Activity를 그대로 사용한다.

    ▹ FLAG_ACTIVITY_NO_HISTORY

     ▸ 처음 이후에 실행된 Activity 외에는 Stack에 추가되지 않으며 새로운 Activity를 끝내면 가장 처음화면으로 돌아가게 된다.

    ▹ FLAG_ACTIVITY_CLEAR_TOP

     ▸ 해당 Flag를 설정한 Activity 위에 있는 모든 Activity를 종료시킨다.

 - Additional Data

  · Bundle 객체는 Intent 안에 들어 있기 때문에 put~() Method와 get~() Method를 이용해 Data를 삽입하거나 출력할 수 있다.

  · 기본 Data Type만을 지원하며 문자열의 경우 putExtra() Method와 getExtra() Method를 사용한다.

  · Method

   ◦ put Method

1
2
3
Intent putExtra(String name, String value)
Intent putExtra(String name, int value)
Intent putExtra(String name, boolean value)
cs

   ◦ get Method

1
2
3
String getStringExtra(String name)
int getIntExtra(String name, int defaultValue)
boolean getBooleanExtra(String name, boolean defaultValue)
cs

    ▹ get Method는 Data 값이 없으면 Default로 설정된 값이 반환된다.

    ▹ 전달하고자 하는 Datark 기본 Data Typedl 아닌 객체(Object)인 경우 객체 자체를 전달할 수 없으며 Byte 배열로 변환하여 전달하거나 Serializable Interface나 Parcelable를 구현하는 객체를 만들어 직렬화한 후 전달 가능하다.

    ▹ Serializable Interface보다는 Parcelable Interface가 Android Mechanism에 적합하기 때문에 Parcelable Interface를 보다 권장한다.

    ▹ Percelable Interface Method

1
2
public abstract int describeContents()
public abstract void writeToParcel(Percle dest, int flag)
cs

     ▸ Percelable Interface를 구현해 객체를 직접 전달할 때 필요한 Method로 구현이 필요하다.

     ▸ 위 Method를 구현 후 CREATOR라는 상수가 필요하며 해당 상수는 Parcel 객체로부터 Data를 읽어 들여 객체를 생성하는 역할을 한다. (상수이기 때문에 static final로 구현해야함)


'Android > Theory' 카테고리의 다른 글

Chapter 3. Widget & Layout  (0) 2015.08.19
Chapter 2. About Android II  (0) 2015.08.19
Chapter 1. About Android I  (0) 2015.08.19