Data : 조원 : 손정일 김태양 Unlocking android chapter.4 Intent&Service
Intent 의 정의 구성 Action – Action 을 가리키는 공인된 문자열 ( 예 : android:intent.action.main) Category – 인텐트에 대한 추가 메타 데이터 Data – URI 형태로 표현되는 작업을 위한 데이터 추가 엘리먼트 Extras – 추가 데이터를 번들 형태의 인텐트로 전달 Component – 인텐트, 옵션, 타입, 그리고 카테고리를 사용하기 위한 명시적 패키지와 클래스 지정 Type – 명시적인 MIME 타입 지정 2
Intent 호출 예제 3 웹 메뉴 항목 설정 지도 메뉴 항목 설정
Intent 호출 예제 4 전화 메뉴 설정
Intent 의 정의 Intent 를 호출하는 두 가지 방법 묵시적 인텐트 (Implicit Intent) 호출 어떤 컴포넌트를 수행시키는 것을 플랫폼이 결정 Action, data, category 를 사용한 Intent resolution 명시적 인텐트 (Explicit Intent) 호출 코드에서 직접 처리할 컴포넌트를 지정 리시버의 특정 클래스 또는 컴포넌트 네임을 통해서 수행 5
Intent resolution 묵시적 인텐트 (Implicit Intent) 의 URI 를 분석하여 지 연 처리 (late binding) Activity, broadcast receiver, service 는 인텐트 핸들러로 등록 가능 인텐트와 인텐트 필터가 대응 액션과 데이터는 대응 관계를 갖는다 특수한 경우 데이터 타입이 대응되거나, 데이터 스키 마, 권한, 그리고 경로의 조합이 대응된다 6
Intent resolution 7 액션 (Action) 과 카테고리 (Category) 문자열 오브젝트 카테고리만 있는 인텐트 필터는 어떠한 액션과도 대 응 가능 액션만 있는 인텐트 필터는 카테고리가 반드시 없는 인텐트만 대응 가능
Intent resolution 8 데이터 (DATA) 액션과 카테고리가 결정된 다음에 사용 MIME 타입, 스키마, 권한 (authority), 경로의 조합으로 구성 ex. content://com.google.provider.NotePad/notes (MIME) ex. Weather://com.msi.manning/loc?zip=12345 ( 그 외 ) 대응 관계 스키마가 존재하고 타입이 존재하지 않으면 인텐트는 어떤 타입 과도 대응 타입이 존재하고 스키마가 존재하지 않으면 인텐트는 어떤 스키 마와도 대응 스키마와 타입이 모두 존재하지 않는다면 인텐트는 스키마나 타 입 중 어떤 것과도 대응되지 않음 권한이 지정되었다면 스키마 또한 반드시 지정 경로가 지정되었다면, 스키마와 권한 또한 반드시 지정
사용자 정의 URI 매칭 9 인텐트 필터 설정 리시버 설정 서비스 정의 퍼미션 설정
사용자 정의 URI 매칭 10
안드로이드 제공 액티비티 11 ActionUri 설명 Intent.ACTION_VIEWgeo:latitude,longitude 지정된 경도와 위도 위치로 지도 프로그램 을 실행 한다. Intent.ACTION_VIEWgeo:0,0?q=street+address 특정 주소로 지도 프로그램을 실행한다. Intent.ACTION_CALLtel:phone_numbe 전화 프로그램을 실행하여 해당 번호로 전 화를 건다. Intent.ACTION_DIALtel:phone_number 전화 프로그램을 실행하고 해당 번호를 누 른다.( 전화를 걸지는 않는다 ) Intent.ACTION_DIALvoic 전화 프로그램을 실행하고 해당 보이스메일 (voic ) 번호를 누른다.( 전화를 걸지는 않 는다 ) Intent.ACTION_VIEWhttp://web_address 해당 URL 로 웹 브라우저를 실행한다. Intent.ACTION_VIEWhttps://web_address 해당 URL 로 웹 브라우저를 실행한다.( 보안 프로토콜 ) Intent.ACTION_WEB_SEARCHplain_text 구글 검색 페이지를 연다
브로드캐스트 리시버 사용한 리스닝 ( 수신대기 ) 인텐트 개념의 오버로딩 12 메서드메서드내용 sendBroadcast(Intent intent) 인텐트를 브로드 캐스팅하기 위한 기본 형식 sendBroadcast(Intent intent, String receiverPermission) 브로드캐스트 수신을 위해 리시버들이 반드시 선언해야 하는 퍼미션 문자열과 함께 인텐트를 브로드캐스팅한다. sendStickyBroadcast(Intent intent) 브로드캐스팅된 뒤 일정기간 동안 수신자들이 데이터를 검색할 수 있 게 한다. 이 기능을 사용하기 위해서는 반드시 ‘BROADCAST_STICKY’ 퍼 미션을 사용하여 선언 해야 한다. sendOrderedBroadcast(Intent intent, String receiverPermission) 인텐트를 브로드캐스팅하여 리시버들을 차례로 호출한다. sendOrderedBroadcast(Intent intent, String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras) 인텐트를 브로드캐스팅한 후 ‘BroadcastReceiver’ 로부터 리턴 값을 얻을 수 있다. 모든 리시버들은 ‘BroadcastReceiver’ 리턴 시에 데이터를 추가하 여 보낼 수 있다. 이 메서드를 사용할 때에는 리시버들은 순서대로 호 출 된다.
브로드캐스트 리시버 사용한 리스닝 ( 수신대기 ) 13 브로드캐스트 액션 액션 (Action) 설명 ACTION_TIME_TICK 매 분마다 현재 시간을 전송 ACTION_TIME_CHANGED 사용하는 기기의 시간이 변경되었을 때 ACTION_TIMEZONE_CHANGED 사용하는 기기의 타임 존이 변경되었을 때 ACTION_BOOT_COMPLETED 플랫폼이 부팅을 완료 했을 때 ACTION_PACKAGE_ADDED 플랫폼에 새로운 패키지가 추가 되었을 때 ACTION_PACKAGE_REMOVED 플랫폼에서 패키지가 삭제 되었을 때 ACTION_BATTERY_CHANGED 사용중인 장비의 배터리 레벨이나 상태변화가 생 겼을 때
브로드캐스트 리시버 사용한 리스닝 ( 수신대기 ) 리시버 (Receiver) 생성 목적 항상 백그라운드에서 실행 되어야 하기 때문에 실행되는 순간부터 서비스를 시작해야 한다 BOOT_COMPLETED 인텐트 브로드캐스트의 수신이 가능해야 한다. 기능 결과 코드를 수신하고 결과 데이터와 기타 번들 형태의 데이터로 설정할 수 있는 메서드를 제공 14
서비스 서비스의 목적 백그라운드 작업을 수행 사용자 인터페이스를 사용하지 않는 프로세스 IPC(Inter-Process Communication) 원격접속 가능한 오브젝트를 만들어내는 것 프로세스가 협업 15
백그라운드 서비스 생성 16 Service Class 확장 NotificationManager 설정 ‘WeatherReporter’ 로 콜백되는 인텐트를 가진 Notification 이 실행
IPC 서로 다른 프로세스들에 포함된 애플리케이션 컴포 넌트 간의 커뮤니케이션이 가능 안드로이드 인터페이스 정의언어 (AIDL) 17
IPC 18 AIDL 에서 사용 가능한 타입들 TYPE 설명 Import 필요여부 Java primitives boolean, byte, short, int, float, double, long, char No Stringjava.lang.StringNo CharSequencejava.lang.CharSequenceNo List 반드시 IDL 에서 허용한 타입들만 사용. ArrayLi st 로 구현 No Map 반드시 IDL 에서 허용한 타입들만 사용. HashM ap 형태로 구현 No Other AIDL interfaces 기타 AIDL 인터페이스 타입으로 만들어진 모든 것 Yes Parcelable objects 안드로이드 Parcelable 인터페이스를 구현한 오브젝트들 Yes
IPC 원격 인터페이스 Publishing 19 원격 인터페이스 구현 Ibinder 리턴
IPC 서비스 바인딩 액티비티에 의해 bindService 가 호출되면 ServiceConnection 오브젝트는 여러 콜백들을 서비스로 부터 액티비티에 반환 콜백은 onServiceConnected(ComponentName ClassName, IBinder binder) 메서드 형태로 발생 플랫폼에서는 IBinder 타입의 onBind 결과를 onServiceConnected 메서드로 넘겨서 호출자로 하여금 사용을 가능하게 함 20
IPC 21 서비스 바인딩 서비스에 대한 바인딩이 해제 되었을 때 콜백 처리 원격 인터페이스 생성 서비스가 바인딩 되었을 때 콜백 처리 원격 인터페이스 변수 정의
IPC 22 서비스 바인딩 바인딩 수행 바인딩 해제 원격 객체 사용
IPC 서비스 바인딩 절차 [INTERFACE_NAME].aidl 의 형태로 인터페이스 정의.aidl 파일에 필요한 자바 인터페이스 생성 ( 이클립스 에서는 자동으로 생성됨 ) 생성한 [INTERFACE_NAME].stub 클래스를 확장하여 인 터페이스 메서드 구현 onBind() 메서드를 사용하여 클라이언트에 인터페이스 노출 ServiceConnection 으로 서비스를 바인딩하여 원격접속 가능한 오브젝트의 핸들을 얻고 사용 23
IPC 서비스 라이프사이클 24
IPC Binder 와 Parcelable IPC 를 가능하게 하는 IBinder 와 Binder 의 핵심은 IBinder.transact 와 Binder.onTransact 메서드 AIDL 을 사용하여 정의한 메서드는 트랜잭션 처리를 통해 동기적으로 처리 AIDL 로 정의한 인터페이스 메서드들을 통해서 보내고 받 는 모든 오브젝트들은 트랜잭트 (transact) 사용 전달되는 오브젝트들은 바인더 트랜잭트 메서드에서 로컬 / 원격 프로세스의 경계를 넘어 데이터를 보내기 위해 반드 시 파서러블 (Parcelable) 형태로 처리되어야 함 AIDL 이 지원하는 타입 이외의 데이터 처리를 위해서는 파 서러블 구현이 요구됨 25
Q&A 26