2019. 4. 3. 01:36ㆍEngineer/안드로이드 앱 프로그래밍
어제와 오늘은 오늘은 두번째 마당의 챕터3을 공부했다. 정의를 모르는 단어들이 나와 인터넷도 찾아봐야하고, 이전 내용보다 한단계 깊이 들어가니 내용도 조금 더 생각을 요하게 되고, 실습 및 복습까지 하려니 생각보다 시간이 더 걸리는 듯하다. 그래도 빨리 배우는 것보다, 확실하게 배우는 것이 중요하니 조바심을 내지말자~!
Chapter 03. 애플리케이션 구성하기
03-1 레이아웃 인플레이션 이해하기
setContentView( ) : 하나의 자바 소스 코드가 있을 때, 어느 xml파일 이 자바 소스 파일과 매칭되는 것인지 설정하는 메소드. 즉, 화면에 나타낼 뷰를 지정하는 역할. 또하나의 중요학 역할은 xml 레이아웃의 내용을 메모리에 객체화 하는 것.
인플레이션(Inflation) : 자바 파일에서 Xml 레이아웃 파일의 내용을 메모리에 로딩하고 객채화 하는 과정. 자바 파일에서 setContentView( )를 통해 매칭되어있는 Xml 레이아웃 파일은 앱이 실행되는 시점에서 메모리에 로드되어 객체회 됨
setContentView는 액티비티의 화면 전체를 설정하는 역할을 하므로 화면 전체가 아닌 부분 화면을 위한 xml 레이아웃을 메모리에 객체화 하려면 별도의 인플레이션 객체( =LayoutInflater )를 사용해야 함
Xml 레이아웃 파일을 만들지 않고 자바 파일에 직접 넣을 수도 있지만, 자바 소스 코드의 양이 많아지고 복잡해지는 문제가 있으므로 되도록 Xml 레이아웃을 사용한는 것을 권장
03-2 화면 구성과 화면 간 전환
안드로이드 애플리케이션의 네 가지 구성요소 : Activity, Service, Broadcast receiver, Content provider
앱을 만들어 단말에 설치하면 시스템은 앱의 구성요소에 대한 정보를 요구한다 따라서 앱 제작시 안드로이드 애플리케이션의 네 가지 구성요소는 새로 만들 때 마다 manifest 파일에 그 정보(필요한 속성, 권한 등)를 추가해야함.
여러 액티비티로 구성된 앱의 경우, 현재 포커싱된 액티비티에서 단순히 새로운 액티비티를 띄워주는 메소드는 startActivity( )를, 새로 액티비티를 띄우되 띄웠던 액티비티로 부터 다시 원래의 액티비티로 돌아오면서 응답을 받아 처리할 것이 있다면 startActivityForResult( )를 이용
setResult( ) 메소드는 새로 띄운 액티비티에서 이전 액티비티로 인텐트를 전달하고 싶을 때 사용
onActivityResults( ) 메소드는 새로 띄웠던 액티비티가 응답(인텐트)을 보내오면 그 응답을 처리할 때 사용
putExtra( ) 메소드는 인텐트 객체에 데이터를 넣는 가장 간단한 방법
03-3 인텐트 살펴보기
Intent : 어떤 작업을 수행하기 위해 사용되는 일종의 명령 또는 데이터 전달 수단
Intent를 전달 할 수 있는 대표 메소드 : startActivity( ), startActivityForResult( ), startService( ), bindService( ), broadcastIntent( )
Intent의 기본 구성 요소 : Action, Data
Intent의 분류
- Explicit intent : 클래스 객체나 컴포넌트 이름을 지정하여 호출 대상을 확실히 알 수 있는 intent
- Implicit intent : Action과 data는 지정했지만 호출 대상을 명확히 정하지 않은 intent. 안드로이드 시스템에서 적절한 앱의 액티비티를 찾아서 전달. 여러가지 속성을 가질 수 있음 (ex. category, type, component, extra data)
Intent 클래스에 정의된 대표적인 액션 정보 : ACTION_MAIN, ACTION_VIEW, ACTION_EDIT, ACTION_CALL, ACTION_SEND. ...
03-4 액티비티를 위한 플래그와 부가 데이터
액티비티는 '액티비티 스택(Activity Stack)'이 관리하는데 이 스택은 액티비티를 실행되는 순서대로 차곡차곡 쌓아두었다가 가장 상위에 있던 액티비티가 없어지면 그 아래에 있는 액티비티가 다시 화면에 보이도록 도와줌
FLAG_ACTIVITY_SINGLE_TOP : 동일한 액티비티를 여러번 실행했을때 동일한 액티비티가 여러개 스택에 쌇이도록 할 것인지, 1개의 액티비티만 생성하여 사용할지를 설정
FLAG_ACTIVITY_NO_HISTORY : 이 플래그가 설정된 intent를 받으면서 시작된 액티비티의 action 이 후, 다른 Activity를 실행했다가 Back하면 이 액티비티가 아닌, 그 이전 Activity를 보여줌. 즉, 해당 플래그가 설정된 액티비티는 액티비티 스택에 흔적이 남기지 않음
FLAG_ACTIVITY_CLEAR_TOP : 런치하고자 하는 Activity 가 이미 스택 상에 존재하는 경우, 해당 Activity 위에 존재하는 다른 Activity 를 모두 종료
부가 데이터 (Extra data) : 인텐트 안에는 번들(bundle)객체가 들어있는데, 이 번들 객체 안에 넣은 데이터를 의미. 기본 자료형을 넣을 수 도 있고, 바이트 배열이나 Serializable 객체도 넣을 수 있음. 시스템에서 건드리지 않고 다른 애플리케이션 구성요소로 전달 가능. 해시 테이블과 유사하여 키(Key)와 값(value)를 쌍으로 만들어야 함
전달 하려는 data가 객체 자료형인 경우, 객체 자체를 전달 할 수 없으므로 객체의 데이터를 바이트 배열로 변환하여 전달 하거나, serializable 인터페이스(안드로이드에서는 parcelable 인터페이스를 권장)를 구현하는 객체를 만들어 직렬화 후 전달
Parcelable interface는 serializable interface보다 직렬화 하였을때 크기가 작아, 내부 data 전달용으로 효과적임
03-5 액티비티의 수명 주기
액티비티가 처음 실행 될 때 메모리에 만들어지는 과정부터 시작해 실행과 중지, 그리고 메모리에서 해제되는 다양한 상태 정보로를 시스템이 관리
액티비티의 대표적 상태정보
- 실행(Running) : 실행되고 있는 상태. 스택의 최상위
- 일시중지(Paused) : 사용자에게 보이긴하나 일부 가려진 상태
- 중지(Stopped) : 다른 액티비티에 의해 완전히 가려져 보이지 않는 상태
액티비티의 상태 정보가 변화하는 것을 액티비티의 수명 주기라고 함. 상태가 변함에 따라 호출 되는 메소드는 아래 그림과 같음.
앱이 갑자기 중지되거나(onPause메소드가 호출될때) 또는 다시 화면에 나타날 때(onResume 메소드가 호출될때) 앱 데이터의 저장과 복원이 필요한데, 앱 안에서 간단한 데이터를 저장하거나 복원할 때 SharedPreferences를 사용. SharedPreferences는 앱 내부에 파일을 하나 만드는데 이 파일 안에 데이터를 저장하거나 읽어올 수 있도록 함.
03-6 서비스
서비스(Service) : 백그라운드에서 실행되는 프로세스. 어플리케이션 구성요소이므로 시스템이 고나리. 역할은 단말이 항상 실행되어 있는 상태로 다른 단말과 data를 주고 받거나 단말의 상태를 모니터링. 따라서 한번 실행해 두면 실행된 상태가 계속 유지되어야함. 서비스가 비정상적 종료되더라도 재실행
서비스는 화면에 보이지 않으므로 안드로이드 스튜디오에서 logcat 창을 보면서 확인
서비스를 종료하고 싶으면 stopService( ) 메소드를 호출
03-7 브로드캐스트 수신자
브로드캐스팅(Broadcasting) : 메세지를 여러 객체에 전달하는 것. 앱에서 브로드캐스팅 메시지(글로벌 이벤트)를 받고 싶다면 브로드캐스트 수신자(Broadcast Receiver)를 만들어 등록하면됨. 서비스처럼 화면에 없음. 매니페스트에 등록을 하고나, 또는 Java 코드에서도 등록 가능. 수신하고 싶은 메세지를 인텐트 필터를 이용해 등록
브로드캐스트의 분류
- 일반 브로드캐스트 : 비동기적으로 실행되며 모듣 수신자는 순서와 관계없이 실행됨. 효율적이나, 한 수신자의 처리 결과를 다른 수신자가 이용할 수 없고 중ㄱ나에 취소 불가. sendBroadcast( )로 호출
- 순차 브로드캐스트 : 한번에 하나의 수신자에게만 전달되므로 순서대로 실행됨. 중간에 취소하면 그 다음 수신자는 받지 못함. 수신자가 실행되는 순서는 인텐트 필터의 속성으로정할 수 있음. 순서가 같으면 임의로 실행.
03-8 위험 권한 부여하기
위험 권한 : 개인 정보가 담긴 권한에 접근하거나 개인 정보를 만들어 낼 수 있는 단말의 주요 장치에 대한 접근 권한 (ex. 위치, 카메라, 마이크, 연락처, 전화, 문자 센서, SD카드 등)
위험 권한을 취득하기 위해서는 Manifest에 어떤 권한을 얻을 것인지 명시 해야함. 권한을 얻지 못한 상태에서 해당 권한이 필요한 작업을 시도할 경우 SecurityException이 발생되며. log에 흔적이 남음
위험 권한을 부여하는 것은 앱이 실행 중이라면 언제든 가능.
03-9 리소스와 매니페스트
앤드로이드 앱은 크게 '자바 코드'와 '리소스'로 구성
자바 코드 : 앱의 흐름과 기능 정의
리소스 : 사용자에게 보여주기 위해 사용하는 파일이나 데이터를 관리
리소스를 자바 코드에서 분리하는 이유는 코드의 이해가 쉽고, 유지 관리가 용이하기 때문
리소스가 갱신되면 그때마다 리소스의 정보(리소스에 대한 내부적 포인터 정보)를 R.java 파일에 자동으로 기록
리소스는 유형마다 저장 방식과 처리 방식이 다름. 개발자는 내부적으로 리소스의 로딩 및 처리 방법 차이에 따른 사용법을 잘 숙지 하고 있어야 함
assets/ 폴더: 동영상이나 웹페이지와 같은 용량이 큰 데이터를 저장 (빌드 되진 않음)
res/values 폴더 : 문자열, 기타 기본 데이터 타입 저장
res/drawable 폴더 : 이미지 저장
리소스 정보를 코드상에서 사용하려면 Resources 객체를 참조하여 리소스를 읽어 들여야함. Resources 객체는 Context.getResources( ) 메소드로 참조가능
내용이 유익하셨다면 아래 광고 한번 눌러주세요.
홈런볼 사먹고 힘내서 더 유익한 정보로 보답하겠습니다.
(클릭하고 바로 창 닫으셔도 되요. 모두의 시간은 소중하니까요 ^^;)
'Engineer > 안드로이드 앱 프로그래밍' 카테고리의 다른 글
Do it! 안드로이드 앱프로그래밍 8일차 (19.04.16) (0) | 2019.04.16 |
---|---|
Do it! 안드로이드 앱프로그래밍 7일차 (19.04.15) (0) | 2019.04.15 |
Do it! 안드로이드 앱프로그래밍 5, 6일차 (19.04.05) (0) | 2019.04.04 |
Do it! 안드로이드 앱프로그래밍 2일차 (19.03.29) (0) | 2019.03.29 |
Do it! 안드로이드 앱프로그래밍 1일차 (19.03.28) (0) | 2019.03.28 |