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 |