ThemeGallery PowerTemplate
Download
Report
Transcript ThemeGallery PowerTemplate
4. 인텐트와 서비스
인텐트(Intent)
Intent : ‘의도’(사전적 의미)
- 실행시킬 대상에 대한 정보를 담은 오브젝트
- 컴포넌트, 클래스와 같은 명확한 대상을 지정하거나 데이터의
유형과 이를 가지고 수행할 행동(action)을 지정
컴포넌트(액티비티, 서비스, 브로드캐스트 리시버 등)의
전환을 위해 인텐트 사용
RestaurantFinder의 인텐트
- 전화걸기
- 맵을 이용한 길 안내
- 리뷰 페이지 방문
Unlocking Android
2
인텐트 클래스 활용
인텐트 클래스들은 안드로이드에서 애플리케이션들간의
의사전달을 위한 네트워크의 역할 수행
특정 시간에 작업이 수행되도록 하기 위해 필요한 것이
무엇인지 애플리케이션이 본질적으로 제공하려는 기능이
무엇인지 고려
인텐트 클래스는 지연 바인딩(late binding)을 통해 작업에
대한 컴포넌트와 연결
디커플링(decoupling)을 통해 상위 애플리케이션이나
시스템의 변경 없이도 수정과 업데이트를 쉽게 처리
Unlocking Android
3
인텐트의 정의
인텐트는 액션, 데이터, 카테고리 등의 속성을 조합하여 표현
인텐트 엘리먼트
- Extras : 추가 데이터를 번들(bundle) 형태로 인텐트에 전달
- Component : 인텐트, 옵션, 타입, 카테고리를 사용하기 위한
명시적 패키지와 클래스 지정
- Type : 명시적인 MIME 타입 지정
- Category : 인텐트에 대한 추가 메타 데이터
- Data : URI 형태로 표현되는 작업을 위한 데이터
- Action : 액션을 가리키는 공인된 문자열
Unlocking Android
4
인텐트 호출 (예제 4.1)
intent = new Intent(Intent.ACTION_VIEW, Uri.parse(this.link));
startActivity(intent);
// Uri를 분석하여 action _view 호출
intent = new Intent(Intent.ACTION_VIEW, Uri.parse(“geo:0,0?q=
“+this.location.getText().toString())); // 좌표데이터 이용
startActivity(intent);
intent = new Intent(Intent.ACTION_CALL, Uri.parse(“tel:”
+phoneString)); // 전화번호로 전화를 걸 수 있는
startActivity(intent);
Unlocking Android
5
인텐트 레졸루션(Intent resolution)
암시적 인텐트의 URI를 분석하여 late binding 처리
액티비티, 브로드캐스트 리시버, 서비스는 인텐트 핸들러로
등록 가능
- <intent filter> 앨리먼트로 특정 인텐트를 지정하여
Androidmanifest.xml 파일에 등록 가능
인텐트와 인텐트 필터의 대응
- 액션(action)과 데이터(data)는 대응관계를 가짐
- 특수한 경우 데이터 타입이 대응되거나, 스키마, 권한, 경로의
조합이 대응
Unlocking Android
6
액션과 카테고리
액션과 카테고리는 문자열로 표현
인텐트필터에서 액션이 명시되지 않았다면 인텐트를 통해
불려지는 어떠한 액션과도 대응 가능
인텐트필터는 인텐트가 대응시켜야 하는 것 이상의 추가적인
카테고리를 가질 수 있지만 반드시 인텐트가 명기해야 하는
최소한의 것은 유지
카테고리를 갖지 않는 인텐트 필터는 카테고리가 없는
인텐트만 대응 가능
데이터는 필수 요소가 아님 – 카테고리와 액션만으로 대부분
동작
Unlocking Android
7
데이터 (1/2)
액션과 카테고리가 결정된 다음 데이터 사용
데이터 유형 – URI
- MIME 형식
ex> content://com.google.provider.NotePad/notes
- 스키마(scheme), 권한(authority), 경로(path)의 조합
ex> Weather://com.msi.manning/loc?zip=12345
Unlocking Android
8
데이터 (2/2)
스키마, 권한, 경로
- 스키마가 존재하고 타입이 존재하지 않으면, 인텐트는 어떤
타입과도 대응
- 타입이 존재하고 스키마가 존재하지 않으면, 인텐트는 어떤
스키마와도 대응
- 스키마와 타입이 모두 존재하지 않는다면, 인텐트는 스키마나
타입 중 어떤 것과도 대응되지 않음
- 권한이 지정되었다면, 스키마 또한 반드시 지정
- 경로가 지정되었다면, 스키마와 권한 또한 반드시 지정
Unlocking Android
9
안드로이드 제공 액티비티
액션
URI
설명
Intent.ACTION_VIEW
geo:latitude,longitude
지정된 경로와 위도를 기반으로
지도 프로그램을 실행
Intent.ACTION_VIEW
geo:0.0?q=street+address
특정 주소를 기반으로 지도 프로
그램을 실행
Intent.ACTION_CALL
tel:phone_numbe
전화 프로그램을 실행하여 해당
번호로 전화
Intent.ACTION_DIAL
tel:phone_number
전화 프로그램을 실행하여 해당
번호를 누름 (전화를 걸지는 않음)
Intent.ACTION_DIAL
voicemail:
전화 프로그램을 실행하고 해당
보이스메일 번호를 누름 (전화를
걸지는 않음)
Intent.ACTION_VIEW
http://web_address
해당 URL로 웹 브라우저를 실행
Intent.ACTION_VIEW
https://web_address
해당 URL로 웹 브라우저를 실행
(이 때 보안 프로토콜을 사용)
Intent.ACTION_WEB_SEARCH
plain_text
구글 검색 페이지를 연다
Unlocking Android
10
브로드캐스트 리시버 (1/3)
인텐트의 용도
- 이벤트의 수식을 원하는 리시버에게 브로드캐스팅
- ‘WeatherReporter’에서 사용자가 설정한 지역에 악천후 등의
기상정보가 있을 때 이와 관련된 경고 내용을 디스플레이
- 기상정보를 체크하고 경고 메시지를 보내줄 수 있는 백그라운드
프로세스 필요
Unlocking Android
11
브로드캐스트 리시버 (2/3)
브로드캐스트 메서드
메서드
내 용
sendBroadcast(Intent intent)
인텐트를 브로드캐스팅하기 위한 기본 형식
sendBroadcast(Intent intent, String
receiverrPermission)
브로드캐스트 수신을 위해 리시버들이 반드시 선언해야 하
는 퍼미션 문자열과 같이 인텐트를 브로드캐스팅 함
sendStickyBroadcast(Intent intent)
브로드캐스팅된 뒤 일정기간동안 수신자들이 데이터를 검
색할 수 있게 함. 이 기능을 사용하려면 반드시
BROADCAST_STICKY 퍼미션을 사용하여 선언해야 함
sendOrderedBroadcast(Intent
intent, String receiverPermission)
인텐트를 브로드캐스팅하여 리시버들을 차례대로 호출함
sendOrderedBroadcast(Intent
intent, String receiverpermission,
BroadcastReceiver resulttReceiver,
BroadcastReceiver resulttReceiver,
Handler scheduler, int initialCode,
String initialData, Bundle
initialExtras)
인텐트를 브로드캐스팅한 후 크로드캐스트 리시버에서 리
턴 값을 얻을 수 있음. 모든 리시버들은 브로드캐스트 리시
버 리턴 시에 데이터를 추가하여 보낼 수 있음. 이 메소드를
사용할 때 리시버들은 순서대로 호출됨
Unlocking Android
12
브로드캐스트 리시버 (3/3)
브로드캐스트 액션
액 션
설 명
ACTION_TIME_TICK
매 분마다 현재 시간을 전송
ACTION_TIME_CHANGED
사용하는 기기의 시간이 변경되었을 때
ACTION_TIMEZONE_CHANGED
사용하는 기기의 타임존이 변경되었을 때
ACTION_BOOT_COMPLETED
플랫폼이 부팅을 완료했을 때
ACTION_PACKAGE_ADDED
플랫폼에 새로운 패키지가 추가되었을 때
ACTION_PACKAGE_REMOVED
플랫폼에 패키지가 삭제되었을 때
ACTION_BATTERY_CHANGED
사용중인 장비의 배터리 레벨이나 상태변화가 생겼을 때
Unlocking Android
13
서비스(Service)
장시간 동안 background에서 수행이 필요한 프로세스를 위해
제공
WeatherAlertService
- 사용자의 현재 위치 또는 사용자가 설정한 지역에서 악천후
등의 기상 정보를 제공하기 위한 서비스
- Notification을 통해 수행 중인 애플리케이션에 관계 없이
화면에 알림 기능 제공
Unlocking Android
14
서비스의 목적
백그라운드 작업
- 사용자 인터페이스를 갖지 않는 프로세스
- 음악 파일의 재생 또는 파일의 다운로드와 같은 시간 지속적인
작업의 처리
IPC(Inter – Process Communication)
- 원격접속이 가능한 오브젝트를 생성하고 서비스를 통해 요청된
사항 처리
- 프로세스간 협업을 위해 사용
Unlocking Android
15
서비스의 실행
서비스는 startService() 또는 bindService()를 통해 실행되며,
일단 개시되면 완전히 중단될 때까지 실행을 지속
startService()
- 단발성 서비스의 실행
- 콜백(callback)을 갖지 않음
bindService()
- 지속적 서비스의 실행
- 서비스와 지속적인 상호 작용이 요구되는 경우 사용
Unlocking Android
16
IPC 실행
서로 다른 프로세스에 포함된 컴포넌트 간의 통신은 IPC를
통해 가능
AIDL: Android Interface Description Language
- AIDL 문법을 사용하여 인터페이스를 기술할 수 있으며 이는
AIDL 틀의 입력 파일로 사용됨
- AIDL은 자바 인터페이스와 내부 스텁(stub) 클래스를 순서대로
생성할 수 있도록 하여 원격 접속 가능한 오브젝트를 만드는데
사용
Unlocking Android
17
AIDL에서 사용 가능한 타입
Type
설 명
Import 필요 여부
Java primitives
boolean, byte, short, int, float, double,
long, char
No
String
Java.lang.String
No
CharSequence
Java.lang.CharSequence
No
List
반드시 AIDL에서 허용한 타입들만 사용.
결국 ArrayList로 구현
No
Map
반드시 AIDL에서 허용한 타입들만 사용.
HashMap 형태로 구현
No
Other AIDL
interfaces
기타 AIDL 인터페이스 타입으로 만들어진
모든 것
Yes
Parcelable object
안드로이드 Parcelable 인터페잇를 구현한
오브젝트들
Yes
Unlocking Android
18
스텁과 프록시
stub
- binder를 확장하고 다른 외부 클래스 인터페이스 확장
- 원격접속 가능한 오브젝트의 local 부분
- 인터페이스 타입의 원격 정보를 리턴해주는
asInterface(Ibinder binder) 포함, 호출자는 이 메서드를
통해 원격 오브젝트의 핸들러를 갖거나 원격 메서드 호출 가능
proxy
: asInterface 메서드의 호출에 대응하는 클래스
Unlocking Android
19
퍼블리싱(publishing)
원격 인터페이스의 노출
퍼블리싱을 위해서는 Service를 상속받고 onBind() 메서드를
통해 IBinder를 리턴하는 클래스 생성
Stub 클래스는 원격접속이 가능한 인터페이스를 확장하여
구현된 내용을 리턴
원격 인터페이스의 노출을 통해 다른 프로세스에서 서비스에
대한 바인딩을 가능하게 함
Unlocking Android
20
서비스 바인딩
액티비티에 의해 bindService가 호출되면 ServiceConnection
오브젝트는 여러 콜백들을 서비스로부터 액티비티에 반환
콜백은 onServiceConnected(ComponentName ClassName,
IBinder binder) 메서드 형태로 발생
플랫폼에서는 IBinder 타입의 onBind 결과를
onServiceConnected 메서드로 넘겨서 호출자로 하여금 사용을
가능하게 함
Unlocking Android
21
서비스 바인딩 절차
[INTERFACE_NAME].aidl의 형태로 인터페이스 정의
.aidl 파일에 필요한 자바 인터페이스 생성(이클립스에서는
자동으로 생성됨)
생성된 [INTERFACE_NAME}.stub 클래스를 확장하여
인터페이스 메서드 구현
onBind() 메서드를 사용하여 클라이언트에 인터페이스 노출
ServiceConnection으로 서비스를 바인딩하여 원격접속 가능한
오브젝트의 핸들을 얻고 사용
Unlocking Android
22
binder와 parcelable
IPC를 가능하게 하는 IBinder와 Binder의 핵심은
IBinder.transact와 Binder.onTransact 메서드
AIDL을 사용하여 정의한 메서드는 트랜잭션 처리를 통해
동기적으로 처리
AIDL로 정의한 인터페이스 메서드들을 통해서 보내고 받는
모든 오브젝트들은 트랜잭트(transact) 사용
전달되는 오브젝트들은 바인더 트랜잭트 메서드에서 로컬/원격
프로세스의 경계를 넘어 데이터를 보내기 위해 반드시 파서러블
형태로 처리되어야 함
AIDL이 지원하는 타입 이외의 데이터 처리를 위해서는
파서러블 구현이 요구됨
Unlocking Android
23