Intent
목차 Intent Intent를 이용해 Activity 띄우기 Activity간 통신 Intent Filter Intent Resolution
Intent 어떠한 액션이 수행되어야 한다는 의향을 선언할 수 있도록 해주는 메시지 전달 메커니즘
do something YourActivity Intent 용도 새 Activity를 명시적으로 시작 새 Activity를 암시적으로 시작 시스템 전역에 메시지를 방송 … do something YourActivity Android Intent(do something) Intent(do something) Intent(result) Intent(result) YourActivity MyActivity
Intent를 이용해 Activity 띄우기 startActivity(myIntent) myIntent 오픈할 클래스를 명시적으로 지정 혹은 수행되어야 하는 대상인 액션을 포함 myIntent에 가장 필적할 액티비티 하나를 찾아 시작시킴 새로 띄운 액티비티가 종료될 때 아무런 메시지를 전달하지 않음 startActivityForResult 새로 띄운 Activity가 종료될 때 메시지 전달
startActivity Android YourActivity MyActivity … do something YourActivity Android startActivity(intent) onCreate(intent) YourActivity MyActivity
startActivityForResult & setResult … do something YourActivity Android Intent(do something) startActivityForResult(intent,reqCode) onCreate(intent) Intent(result) setResult(resultCode, intent) onActivityResult(reqCode, resultCode,intent) MyActivity YourActivity
Intent를 이용해 Activity 시작하기 명시적으로 시작(Explicit intent)
Intent를 이용해 Activity 시작하기 암시적으로 시작(Implicit intent) 안드로이드는 지정된 데이터 타입에 대한 액션 수행에 가 장 적합한 클래스로 그 Intent를 런타임에 해결함 빌려 사용하는 기능이 어떤 애플리케이션의 것인지 미리 정확히 알지 않아도 다른 애플리케이션에 있는 기능을 사 용하는 프로젝트 작성 가능
Activity간의 통신 Intent는 액티비티간에 인수와 리턴 값을 전달하 는 도구로도 사용된다. Bundle 타입의 Extras를 활용하여 이름과 값의 쌍 으로 된 임의 타입의 정보를 원하는 개수만큼 전달 할 수 있다. Intent putExtra(String name, int value) Intent putExtra(String name, String value) Intent putExtra(String name, boolean value) name은 전달하는 인수에 대한 이름이 중복되지 않으면 자유롭게 붙일 수 있다.
Activity간의 통신(2) Extras에 저장된 값들은 아래의 메서드로 꺼낸다. Int getIntExtra(String name, int defaultValue); String getIntExtra(String name); boolean getIntExtra(String name, boolean defaultValue);
통신 예제 – CommActivity.java
통신 예제 - ActEdit.java
activity_commactivity.xml activity_actedit.xml
통신 예제
통신 예제
Action 실행하고자 하는 동작이며 Intent를 통해 어떤 작 업을 수행할 지를 지정한다. 액션 설명 ACTION_CALL 통화를 시작한다. ACTION_EDIT 데이터를 표시하고 편집한다. ACTION_MAIN 메인 엑티비티를 실행한다. 입출력되는 데이터는 없다. ACTION_VIEW 가장 일반적인 액션으로, Intent의 URI에 제공된 데이터가 가장 합리적인 방법으로 보여지도록 요청한다. ACTION_DIAL 인텐트의 URI에 지정된 번호로 전화를 걸 수 있도록 번호를 미리 눌러놓는다.
Data 동작에 필요한 상세 데이터를 제공한다. 단독 액션의 경우 별도의 Data가 필요없으나 대부 분의 액션은 목적어가 필요하며 이 목적어에 해당 하는 정보가 Data이다. ex) ACTION_CALL에 대해서 누구에게 전화를 걸 것인지 를 지정
액션 예제 – CallOther.java
액션 예제 – activity_callother.xml
액션 예제 - 실행결과
Intent Filter Android는 요청을 서비스하기 위해 사용할 애플 리케이션이 어떤 것인지 어떻게 알까? Activity, Service, Broadcast receiver를 특정한 종류의 데 이터에 대한 액션을 수행할 수 있는 존재로 등록하는데 사용 애플리케이션 컴포넌트는 Intent Filter를 통해 다른 컴포넌 트로부터의 액션 요청을 서비스할 수 있음을 Android에 알 림 Manifest파일의 intent-filter 태그를 이용함
Intent Filter 하위 엘리먼트 action - 서비스되는 액션의 이름 android:name 속성 이용 category - 액션이 서비스되는 상황 조건 지정 속성 설명 ALTERNATIVE 이 액션이 데이터 타입의 항목에 대해 수행되는 기본 액션에 대한 대안으로 사용될 수 있어야 함을 지정 ex) 연락처의 기본 액션은 해당 연락처를 보여주는 것, 대안은 편집, 삭제 SELECTED_ALTERNATIVE 가능한 것들의 리스트가 필요할 때 DEFAULT Intent Filter에 의해 정의된 데이터 값에 대한 기본 액션. 명시적 인텐트를 이용해 띄어지는 액티비티 HOME 장치가 시작될 때 맨 처음 표시되는 액티비티 LAUNCHER 선택되어 지정된 어떤 데이터도 없이 액티비티를 런치함
Intent Filter 하위 엘리먼트(2) data – 컴포넌트가 실행할 수 있는 데이터에 대한 명세를 지정할 수 있게 함 속성 설명 android:host 유효한 호스트의 이름을 지정 ex) google.com android:mimeType 컴포넌트가 다룰 수 있는 데이터의 종류를 지정 android:path URI를 위한 유효한 경로 값을 지정한다 android:port 지정된 호스트를 위한 유효한 포트를 지정 android:scheme ex) content, http
Intent Filter 등록 예
Intent Resolution startActivity에 암시적 인텐트를 전달하면 해석 과 정을 거쳐 보통 하나의 Activity가 결정됨 지정된 데이터에 대해 주어진 액션을 수행할 수 있 는 Activity가 여러 개 존재하는 경우, 이들 중 최 적의 Activity를 찾는다.
Intent Resolution 과정(1) 1. 설치된 패키지로부터 사용 가능한 모든 Intent Filter들의 리스트를 구성 2. 확인 중인 Intent와 연관된 액션이나 범주에 맞 지 않는 Intent Filter를 리스트에서 제거 1) action match는 Intent Filter가 지정된 액션을 포함하 고 있거나, 아무런 액션도 지정되지 않은 경우에 이루어 진다. 2) category match의 경우 모든 category에 일치해야함
Intent Resolution 과정(2) 3. Intent에 있는 데이터 URI의 각 부분이 Intent Filter의 data 태그(MIME, scheme, host/권한, path) 와 비교한다. 1) MIME 타입은 *을 이용하여 하위 타입 매치 가능 2) scheme은 URI의 프로토콜 부분 ex) http:, tel: 3) host/권한은 URI에서 scheme과 path사이에 있는 부분 ex) www.google.com 4) path는 host뒤에 오는 부분이다. ex) /ig 4. 암시적으로 Activity를 실행시킬 때, 위의 과정들로 부터 하나 이상의 컴포넌트들이 해석되는 경우에는 해 당하는 모든 컴포넌트들이 사용자에게 제공됨
과제