[NEXT] 화면 재갱신이 되는 안드로이드 앱 만들기 - 네트워크에 독립하는 구조로 변경YoungSu Son항상 네트워크에 연결되어있지 않다는 가정으로, 앱의 아키텍처를 변경합니다.
앱을 실행시 로컬 DB의 데이터를 읽으며, 백그라운드 서비스에서 주기적으로 데이터를 긁어옵니다. (추후 gcm push로 변경합니다.)
데이터 삽입시 화면을 자동 갱신할려면? 어떠한 구조를 가져야 할까요?
그리고 view holder 패턴도 다룹니다.
반복적인 작업이 싫은 안드로이드 개발자에게Sungju Jin갑을병정 산업구조에서 갑돌이의 잦은 요구사항 변경 통보를 받아보셨을 겁니다. 사람들에게 받은 스트레스를 풀려고 '그래! 난 개발자닌깐' 하고 자리에 앉아서 코드를 짜는데 반복적인 작업을 하다보면 ‘내가 이걸 왜 하고 있나’ 라는 생각까지 들기도 합니다.
안드로이드 작업을 하다보면 다음과 같은 반복적인 작업을 하는 것을 느꼈을 겁니다.
반복적인 보일러(Boiler)코드를 줄일 수 있는 오픈소스를 소개하고자 합니다.
[NEXT] 화면 재갱신이 되는 안드로이드 앱 만들기 - 네트워크에 독립하는 구조로 변경YoungSu Son항상 네트워크에 연결되어있지 않다는 가정으로, 앱의 아키텍처를 변경합니다.
앱을 실행시 로컬 DB의 데이터를 읽으며, 백그라운드 서비스에서 주기적으로 데이터를 긁어옵니다. (추후 gcm push로 변경합니다.)
데이터 삽입시 화면을 자동 갱신할려면? 어떠한 구조를 가져야 할까요?
그리고 view holder 패턴도 다룹니다.
반복적인 작업이 싫은 안드로이드 개발자에게Sungju Jin갑을병정 산업구조에서 갑돌이의 잦은 요구사항 변경 통보를 받아보셨을 겁니다. 사람들에게 받은 스트레스를 풀려고 '그래! 난 개발자닌깐' 하고 자리에 앉아서 코드를 짜는데 반복적인 작업을 하다보면 ‘내가 이걸 왜 하고 있나’ 라는 생각까지 들기도 합니다.
안드로이드 작업을 하다보면 다음과 같은 반복적인 작업을 하는 것을 느꼈을 겁니다.
반복적인 보일러(Boiler)코드를 줄일 수 있는 오픈소스를 소개하고자 합니다.
[방송통신대 컴퓨터과학과] 2020년 1학기 전공 컴퓨터 그래픽스 과제물 제출본Lee Sang-Ho
[방송통신대 컴퓨터과학과] 2020년 1학기 전공 모바일 앱 프로그래밍 기말평가 제출본
1. 교과목명
모바일 앱 프로그래밍
페이지
1/9
작성자
이상호
확인자
정광식 교수
승인자
정광식 교수
작성일
2020-07-17
제목
2020학년도 1학기 출석수업대체시험 실습과제
파일명
[방송통신대 컴퓨터과학과] 모바일 앱
프로그래밍_기말평가_20200621.hwp
- 1 -
2020학년도 1학기 과제물(기말추가시험 제출용)
❍ 교과목명 : 모바일 앱 프로그래밍
❍ 학 번 : 201934-363698
❍ 성 명 : 이상호
2. 제목
2020학년도 1학기 출석수업대체시험 실습과제
작성일
2020-07-17
페이지
2/9
- 2 -
I. AlertDialog객체와 Builder 객체의 관계를 설명하시오. (20점)
Ÿ AlertDialog 객체는 사용자와 애플리케이션 사이의 기본적인 통신 수단으로서 protected로 인해 간접
적으로 내부 클래스인 Builder를 통해 생성된다. 즉 그림 1에서와 같이 AlertDialog 객체를 생성하기
위해서 Builder 객체를 생성한 후 해당 메서드 (setMessage, setTitle, setIcon 등) 호출하여 AlertDialog
의 설정을 초기화해야 한다. 또한 Build에서 create 그리고 AlertDialog에서 show 메서드를 통해 제어
할 수 있다.
Ÿ 각 AlertDialog 및 Builder 객체에 대한 세부 정보는 다음과 같다.
Ÿ AlertDialog 객체
- 문자열 메시지 또는 제목이나 아이콘도 출력할 수 있으며 버튼을 통해 사용자의 입력을 받을 수
있다.
- 해당 객체를 생성하기 위해서 우선 AlertDialog.Builder 객체를 생성하고 이 객체의 메소드들을 호
출해서 객체 생성 전에 필요한 속성을 지정한다.
Ÿ Builder 객체
- 메시지, 아이콘 및 각종 버튼 등의 속성 정보들이 다양해서 생성자를 통해서 하나씩 모두 지정하
기 번거로우므로 별도의 Builder 객체의 메소드를 이용하여 정의한다.
- 이러한 Builder 객체는 우선 생성한 후 필요한 메소드를 호출할 수 있어 생성자보다 편리하다.
Ÿ 함수 설명
- AlertDialog.Builder(Context context) : Builder 객체를 생성, 이 과정에서 인자인 콘텍스트를 보내고
AlertDialog를 생성하는 액티비티를 전달
- AlertDialog.Builder setMessage (CharSequence message) : AlertDialog의 메시지를 지정 가능
- AlertDialog.Builder setTitle (CharSequence title) : AlertDialog의 문자열을 지정 가능
- AlertDialog.Builder setIcon (int iconld) : AlertDialog의 아이콘을 지정 가능
- AlertDialog show() : AlertDialog를 생성하고 화면으로 출력하지 않음
- AlertDialog create() : 화면 출력
그림 1. AlertDialog와 Builder 객체의 흐름도.
3. 제목
2020학년도 1학기 출석수업대체시험 실습과제
작성일
2020-07-17
페이지
3/9
- 3 -
II. 액티비티 호출과 Intent 객체의 관계에 대해서 설명하시오. (15점)
Ÿ 인텐트는 복수의 액티비티로 구성된 애플리케이션으로서 주요 컴포넌트 (브로드 캐스트 리시버, 서
비스, 컨텐츠 프로바이더 등)들이 수행할 작업에 대한 정보를 내포하며 작업 결과를 반환할 때 사
용된다. 즉 함수에서 인수나 반환 값의 역할처럼 입력을 받는 액티비티를 호출할 경우 사용자가 입
력한 정보가 무엇이지 반환해야 하는데 이러한 상황에서 인텐트가 사용된다.
Ÿ 일반적으로 액티비티를 호출하는 메서드는 startArtivity(intent intent)로서 인텐트 객체 하나 만을 인
수로 취하고 내부에 부가 정보 (호출 상태, 요청 작업)가 포함되어 있다. 따라서 액티비티를 호출하
기 앞서 요청 작업에 대한 정보가 인텐트 객체에 먼저 정의되어야 한다.
그림 2. 액티비티 호출과 Intent 객체의 흐름도.
Ÿ 각 인텐트 객체 및 액티비티 호출에 대한 세부 정보는 다음과 같다.
Ÿ 인텍트 객체
- 자주 사용되는 인텍트 생성자는 다음과 같다. 즉 우선 Intent(Context packageContext, class<?> cls)
생성자는 내부의 서브 액티비티를 호출할 때 주로 사용되며 액티비티 클래스를 구현하는 컨텍스
트와 호출될 액티비티의 클래스 정보가 인수로 전달된다. 이 과정에서 컨텍스트는 호출자의 정보
로서 주로 this이며 cls는 호출되는 액티비티의 클래스 정보를 의미한다.
- Intentintent =newIntent(MainActivity.this, SubActivity.class); startActivity(intent);에서 호출자는 메인 액
티비티 자신이고 SubActiviy를 호출하는 명령어이다. 이 경우 startActivity 메소드는 인텐트의 정보
를 참조하여 MainActivity를 부모로 하는 SubActivity를 호출한다.
- 명시적 인텐트의 경우 인텐트에 호출할 대상 컴포넌트가 분명히 명시되어 있는 것을 정의하고 같
은 응용 프로그램내의 서브 액티비티를 호출할 때 사용한다. 이때 권한만 있다면 외부 응용 프로
그램의 액티비티도 호출할 수 있다.
- 암시적 인텐트에서는 호출 대상이 분명히 정해지지 않은 인텐트를 암시적 인텐트 (implicitintent)라
고 하며 주로 외부 응용 프로그램의 컴포넌트를 호출할 때 사용한다.
- 안드로이드 시스템에는 인텐트의 정보를 참조하여 호출된 적절한 컴포넌트를 검색하는 알고리즘
4. 제목
2020학년도 1학기 출석수업대체시험 실습과제
작성일
2020-07-17
페이지
4/9
- 4 -
이 작성되어 있으며, 안드로이드 시스템은 적절한 컴포넌트를 찾기 위해 설치된 모든 응용 프로그
램의 컴포넌트를 조사한다.
- 인텐트를 명확히 하기 위해 여러 가지 정보들(Action, Data, Type, Category, Component 등)이 포함
되어야 한다. 특히 해당 정보들을 생성자로 전달하여 초기화할 수 도 있고 객체를 생성한 후 메서
드로 변경하거나 조사할 수도 있다.
- 인텐트의 정보 명세에서 Action의 경우 프로그래머가 실행하고자 하는 동작을 의미하며 인텐트를
통한 수행 작업을 지정한다. 이 경우 BroadcastReceiver(BR) 컴포넌트는 발생 사건에 대한 정보를
알려준다. 또한 시스템이 미리 정의해 놓은 동작을 사용할 수도 있고 사용자가 임의의 동작을 정
의할 수도 있다. 그 밖에 Action의 종류가 다양하기 때문에 getAction 및 setAction 메서드를 통해
다양한 변수 타입을 정의한다.
- 인텐트의 정보 명세의 Data에서는 Action을 실행하는 데 필요한 상세 데이터를 제공한다. 대부분의
Action은 수행 작업에 필요한 정보를 Data로 지정한다. 예를 들면 ACTION_EDIT 액션에 대해서는
편집의 대상이 되는 파일을 지정해야 하고 ACTION_CALL의 경우 전화를 걸 대상을 지정해야 한
다.
- 이러한 Action의 목적이 되는 대상은 광범위하기 때문에 임의의 대상을 유일하게 가리킬 수 있는
URI (UniformResource Identifier) 타입으로 되어 있다. 이 URI는 웹 사이트 주소인 URL, 로컬 저장
장치의 파일 경로, 주소록의 레코드 하나까지도 유일하게 지정할 수 있는 범용적인 형식으로서
getData/setData 메소드를 통해 Data에 접근한다.
- 따라서 Action과 Data 속성은 다음과 같이 ~에 대한 ~동작으로 정의할 수 있으므로 대개의 경우는
이 두 정보만으로도 대상 컴포넌트를 찾을 수 있다.
- 정확하고 상세한 처리를 위해 추가적인 정보가 더 필요한 경우 (Action을 처리할 수 있는 적합한
컴포넌트가 둘 이상이거나 Data의 타입이 애매한 경우) Type, Category, Component, Extras 속성들도
가급적 상세하게 지정해야 한다.
표 1. 인텐트 객체에 대한 상세 정보 (액션, 대상, 설명).
5. 제목
2020학년도 1학기 출석수업대체시험 실습과제
작성일
2020-07-17
페이지
5/9
- 5 -
Ÿ 액티비티 호출
- 안드로이드 응용 프로그램을 구성하는 주요 단위(컴포넌트)의 하나로서 4개의 주요 컴포넌트
(Activity, ContentProvider, BroadcastReceiver, Service)가 있다.
- 윈도우와 유사한 개념과 유사하나 하나의 화면을 관리하는 주체라고 이해하는 것이 좋다.
- 사용자와의 인터페이스를 구성하나 그 자체는 출력 기능이없으므로 직접적으로 보이지 않는다.
- 사용자에게 실제로 보이는 것은 View이며 액티비티는 반드시 내부에 View나 ViewGroup을 가져야
화면에 출력될 수 있다. 액티비티가 생성될 때마다 호출되는 setContentView 메소드가 액티비티 안
에 View를 배치한다.
- 실제 응용 프로그램에서는 한 화면에서 여러 개의 복잡한 동작을 수행할 수 없으므로 기능별로 작
업을 실행할 수 있는 여러 개의 액티비티가 필요하다.
- 여러 개의 액티비티 사이에서 통신할 수 있는 방법 (Intent)이 필요하다.
6. 제목
2020학년도 1학기 출석수업대체시험 실습과제
작성일
2020-07-17
페이지
6/9
- 6 -
III. AdapterView와 Adapter 객체의 관계에 대해서 설명하시오. (15점)
Ÿ Adapter는 화면에 출력될 데이터를 관리하며 AdapterView는 Adapter가 전달한 데이터를 화면에 출
력한다 (그림 3 참조).
Ÿ 그에 따라 AdapterView 및 Adapter 객체에 대한 세부 정보는 다음과 같다.
Ÿ AdapterView 객체
- AdapterView는 여러 개의 자식 View를 통합하여 화면에 표시할 수 있다.
- LinearLayout, RelativeLayout과 같이 배치만 담당하는 레이아웃과는 달리 사용자와 상호 작용도 처
리할 수 있으며 항목의 선택이 가능하다.
- 표시할 항목(데이터)를 Adapter 객체로부터 전달받아 화면에 출력한다. 이때 항목의 개수는 제한이
없으며 실행 중에 항목이 바뀔 수 있고 표시할 수 있는 데이터의 원본도 다양하다.
Ÿ Adapter에서 ListView 객체
- 여러 개의 항목들을 수직으로 표시하는 위젯 (주소록, 상품 목록 등)으로서 수직 스크롤을 지원하
므로 항목의 개수에는 제한이 없다.
- 따라서 제한된 크기의 화면에 많은 자료 (문자열, 이미지 등)를 출력하기 어렵기 때문에 ListView
를 사용하여 화면을 위/아래로 스크롤할 수 있도록 출력한다.
- ListView가 출력하는 항목 (데이터)은 임의의 View이며 레이아웃을 사용하면 어떠한 형태로든 정
보를 표현할 수 있다. Adapter로부터 받은 항목들을 수직으로 펼쳐서 보여준다.
Ÿ Adapter 객체
- 배열을 원본으로 사용할 때는 아래와 같이 ArrayAdapter를 초기화한다.
- ArrayAdapter (Context context, int textViewResourceId, List<T> objects 또는 Context context, int
textViewResourceId, T[] objects)에서 1번째 인수의 경우 현재 콘텍스트인 액티비티(this)를 넘겨주고
- 2번째 인수 : 항목을 표기할 레이아웃의 형태(리소스 ID)를 결정한다. 그리고 3번째 인수 : Adapter
로 공급될 데이터의 원본인데 두 가지 타입에 대해 오버로딩되어 있다.
그림 3. AdapterView와 Adapter 객체의 흐름도.
7. 제목
2020학년도 1학기 출석수업대체시험 실습과제
작성일
2020-07-17
페이지
7/9
- 7 -
Ÿ ListView 객체
- ListView는 직접 레이아웃을 정의할 수도 있으나 Adapter 객체에서 미리 정의된 레이아웃을 사용
할 수도 있다. 시스템이 미리 정의해 놓은 레이아웃이므로 android.R.layout 뒤에 ID만 지정하면 된
다.
- setAdapter 메소드 호출의 경우 Adapter 객체가 준비되었으면 ListView의 setAdapter 메소드를 호출
하여 Adapter 객체를 ListView와 연결한다.
- Adapter는 ListView에 출력할 데이터 원본을 가지고 있으며 이 데이터 원본을 출력할 View를 생성
하여 ListView에게 제공한다.
- 이러한 ListView는 Adapter가 제공한 데이터를 사용자에게 보여주며 터치 입력을 받아 항목 선택
및 스크롤을 처리한다.
표 2. ListView 레이아웃 정의.
8. 제목
2020학년도 1학기 출석수업대체시험 실습과제
작성일
2020-07-17
페이지
8/9
- 8 -
IV. 콜백 메소드를 통한 이벤트 처리, 리스너 인터페이스를 통한 이벤트 처리, 액티비티를
통한 리스너의 구현, View를 통한 리스너의 구현의 차이에 대해서 논하시오. (20점)
Ÿ 콜백 메소드를 통한 이벤트 처리
- 콜백 메소드는 특정 이벤트가 발생했을 때 시스템에 의해 자동으로 호출되는 메소드로서 java 코
드를 작성해 놓으면 이벤트 발생시의 동작을 정의할 수 있다.
- 사용자와 상호 작용하는 주체가 View이므로 이벤트에 대한 콜백의 정의는 주로 View가 재정의하
여 제공한다.
- 사용자가 화면을 터치할 때 키를 누르거나 떼는 등의 이벤트가 발생하면 콜백 메소드가 호출되고
발생한 이벤트에 대한 정보가 인수로 전달된다.
- 또한 콜백 메소드를 재정의하면 특정 이벤트가 발생할 시점에 시스템에 의해 자동으로 호출되므
로 특정 이벤트의 발생 시점뿐만 아니라 상세한 정보까지 얻을 수 있다.
Ÿ 함수 설명
- boolean onTouchEvent (MotionEvent event) : 터치 스크린 모션 이벤트를 다루고 싶을 때 실행되는
메소드
- boolean onKeyDown (intkeyCode,KeyEvent event) : 키를 눌렀을 때 호출되는 메소드
- boolean onKeyUp (intkeyCode,KeyEvent event) : 키를 눌렀다 뗄 때 호출되는 메소드
Ÿ 리스너 인터페이스를 통한 이벤트 처리
- 리스너(Listener)는 특정 이벤트를 처리하는 인터페이스이며 이벤트 발생을 처리한다.
- 대응되는 이벤트를 받는 하나의 메소드가 선언되어 있으며 모두 View의 내부 인터페이스로 선언
되어 있다.
- 대표적인 리스너 인터페이스와 메소드는 다음과 같다.
- boolean onTouch (Viewv, MotionEvent event) : 이벤트 핸들러로서 터치 이벤트가 뷰에 보내졌을 때
호출되는 메소드
- boolean onKey (Viewv, intkeyCode, KeyEvent event) : 하드웨어 키 값이 뷰에 보내졌을 때 호출되는
메소드
- void onFocusChange (Viewv,boolean hasFocus) : 뷰의 포커스 상태가 변화되었을 때 호출되는 메소
드
- 이벤트를 처리하려면 리스너 인터페이스가 리스너의 추상 메소드인 이벤트 핸들러를 구현해야 한
다.
- 리스너 인터페이스를 구현한 다음에는 이벤트가 발생했을 때 이벤트 핸들러가 호출되도록 View에
리스너 인터페이스를 연결해야 한다.
- 즉 어떤 리스너 인터페이스가 어떤 이벤트를 처리한다는 것을 등록해야 한다.
- 등록 메소드는 리스너 인터페이스별로 따로 준비되어 있으며 set+리스너의 이름 형식을 따른다.
- 터치 이벤트 발생시 View에서 터치 이벤트가 발생하면 setOnTouchListener 메소드로 등록된 리스너
인터페이스의 onTouch 메소드(이벤트 핸들러)가 호출될 것이다.
- onTouch 메소드(이벤트 핸들러)로는 이벤트와 관련된 정보가 event 인수로 전달된다.
- 리스너 인터페이스는 여러 View에 의해 공유될 수 있으므로 어떤 객체에서 발생한 이벤트인지를
View 인수로 전달받는다.
- 콜백 메소드는 특정 클래스에 소속되므로 이벤트를 받는 객체가 정해져 있는데 비해 리스너 인터
페이스는 임의의 View에 대한 이벤트를 처리할 수 있으므로 반드시 View 객체를 전달받아야 한
다.
- 콜백 메소드는 상속을 받아야만 재정의할 수 있는데 비해 리스너는 인터페이스일 뿐이므로 임의
의 클래스가 구현하여 사용할 수 있다.
- 리스터 인터페이스가 요구하는 onTouch 메소드 (이벤트 핸들러)를 구현하기만 하면 이벤트 핸들러
로 등록할 수 있다.
9. 제목
2020학년도 1학기 출석수업대체시험 실습과제
작성일
2020-07-17
페이지
9/9
- 9 -
- View를 상속받을 필요없이 View 객체에도 바로 붙일 수 있으며 Button이나 TextView같은 위젯에
서도 이벤트 처리가 가능하다.
- 그러나 리스너 인터페이스 구현을 위해 별도의 클래스를 하나 더 선언해야 한다.
- 모든 이벤트에 대해 클래스를 만든다면 소스 코드의 양도 많아지고 각 클래스마다 다른 명칭을 부
여해야 한다.
Ÿ 액티비티를 통한 리스너의 구현
- 리스너 인터페이스의 구현 클래스를 따로 선언해도 되나 기존에 존재하는 클래스에서 리스너의
구현이 가능하다.
- 앞서 TouchListener는 리스너를 구현하는 역할만 할뿐 그 외에는 아무런 기능도 가지지 않는다.
- 최소한 액티비티 하나는 존재하므로 액티비티가 리스너 인터페이스를 구현하는 것이 가능하다.
- 액티비티는 Activity를 이미 상속(extends)받으나 리스너 인터페이스는 개수에 상관없이 얼마든지
구현할 수 있다.
- 선언문에서 리스너 인터페이스를 상속받고 본체에 이벤트 핸들러를 구현하기만 하면 된다.
- 별도의 클래스를 추가로 선언하지 않고 액티비티가 리스너 인터페이스를 직접 구현한다.
- 액티비티가 인터페이스를 자체적으로 구현하므로 별도의 클래스를 선언할 필요가 없으며 액티비
티 객체가 이미 존재하므로 리스너 인터페이스를 생성할 필요도 없다.
- 그러나 리스너 인터페이스가 구현된 View는 액티비티에 강하게 종속되고 리스너 인터페이스가 구
현된 View를 다른 액티비티에 재사용할 경우 분리하여 다른 액티비티로 옮겨야 한다.
- View와 관련된 메소드가 View 자신에게 포함되어 있지 않고 부모가 구현을 해주기 때문에 독립성
이 떨어진다.
Ÿ View를 통한 리스너의 구현
- View를 생성하고 클래스 선언문이 있으므로 View 자신이 필요로 하는 리스너 인터페이스를 상속
받아 구현한다.
- 이벤트 처리를 위해 필요한 onTouch 메소드(이벤트 핸들러)를 이벤트가 발생한 View가 스스로 처
리하는 것이다.
- 이벤트를 처리하는 메소드를 내부에 포함하기 때문에 구조상 깔끔하고 View의 재사용에도 유리하
다.
- 액티비티의 부담도 줄어들고 코드의 가독성이 향상된다.