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