Hayden's Archive
[Android] 액티비티(Activity)와 인텐트(Intent) 본문
참고 : 한국방송통신대학교 모바일앱프로그래밍 교재( https://press.knou.ac.kr/goods/textBookView.do?condCmdtCode=9788920035999&condLscValue=001&condYr=&condSmst= )
액티비티
1) 액티비티
- 안드로이드 응용 프로그램을 구성하는 4개의 주요 컴포넌트
- Activity, ContentProvider, BroadcastReceiver, Service
- 액티비티는 그 중 하나이면서 가장 기본적인 주요 컴포넌트
- 화면 하나가 바로 액티비티
- 즉 사용자와 상호작용할 수 있는 하나의 윈도우
- 사용자와의 인터페이스를 구성하지만, 그 자체는 출력 기능이 없으므로 직접적으로 보이지 않는다.
2) 액티비티와 View
- 액티비티 그 자체는 사용자에게 보여지는 수단이 아님
- 사용자에게 실제로 보이는 것은 View이며, 액티비티는 반드시 내부에 View나 ViewGroup을 가져야 함
- 액티비티가 생성될 때마다 호출되는 setContentView 메서드가 액티비티 안에 View를 배치하는 기능을 함
3) 실제 응용 프로그램
- 실제 응용 프로그램에서는 한 화면에서 복잡한 동작을 다 수행할 수 없으므로, 기능별로 나누어 작업을 실행할 수 있는 여러 개의 액티비티가 필요함
- 이러한 상황에서는 여러 개의 액티비티 간에 통신이 필요할 수 있음
4) 서브 액티비티 절차
- 안드로이드 애플리케이션에 새로운 액티비티를 추가하는 과정
- 새로 만들 '서브 액티비티'의 레이아웃을 XML 파일에 정의한다.
- 새로 만들 '서브 액티비티'의 실행 코드를 java 파일로 작성한다.
- 새로 추가한 '서브 액티비티'를 Manifest 파일에 등록한다.
- '메인 액티비티'에서 startActivity 메서드로 '서브 액티비티'를 호출하여 사용한다.
인텐트
1) 인텐트(Intent)
- 인텐트는 복수의 액티비티로 구성된 애플리케이션에서 액티비티들 간에 통신을 위해 필요한 '통신 장치' 혹은 '메시지 전달 방법'을 의미함
- 인텐트는 액티비티뿐만 아니라 브로드캐스트 리시버, 서비스, 컨텐트 프러바이더 등의 주요 컴포넌트들이 수행해야 할 작업에 대한 정보를 가지며 작업 결과를 반환하기 위해서도 사용됨
- 예 1) 그림을 보여주는 액티비티를 호출해야 한다면 출력해야 할 그림이 무엇인지를 알려줘야 하는데 이러한 상황에서 인텐트를 사용
- 예 2) 입력을 받는 액티비티를 호출한 경우에는 사용자가 입력한 정보가 무엇인지 반환해야 하는데 이러한 상황에서 인텐트가 사용됨
- 함수에서 인수나 반환 값의 역할과 유사함
2) 액티비티 호출
- 액티비티를 호출하는 메서드는 startActivity(Intent intent)
- 인텐트 객체 하나만을 인수로 취하며, 인텐트 안에 호출 상대, 요청 작업에 대한 정보가 들어있음
- 액티비티를 호출하기 전에 요청 작업에 대한 정보가 인텐트 객체에 먼저 정의되어 있어야 함
3) 인텐트 생성자
- 자주 사용되는 인텐트 생성자
Intent(Context packageContext, Class<?> cls)
Intent(String action, Uri uri, Context packageContext, Class<?> cls)
- 첫번째 인텐트 생성자는 내부의 서브 액티비티를 호출할 때 주로 사용되며 액티비티 클래스를 구현하는 컨텍스트와 호출될 액티비티의 클래스 정보가 인수로 전달됨
- 컨텍스트는 호출자의 정보인데 주로 this
- cls는 호출되는 액티비티의 클래스 정보
- 실행 중에 액티비티를 생성해야 하므로 클래스 정보가 필요함
4) 호출문
- 새로 작성한 액티비티를 호출하는 코드
Intent intent = new Intent(MainActivity.this, SubActivity.class);
startActivity(intent);
- 인텐트 생성자에 전달되는 인수는 호출자인 메인 액티비티 자신이고, SubActivity를 호출한다는 것을 의미
- 이 정보로 생성된 인텐트를 startActivity 메서드가 참조하여 MainActivity를 부모로 하는 SubActivity를 호출
5) 명시적 인텐트
- 명시적 인텐트(Explicit Intent) : 인텐트에 호출할 대상 컴포넌트가 분명히 명시되어 있는 것
- 같은 응용 프로그램 내의 서브 액티비티를 호출할 때 사용하며, 권한만 있다면 외부 응용 프로그램의 액티비티도 호출할 수 있음
6) 암시적 인텐트
- 암시적 인텐트(Implicit Intent) : 명시적 인텐트와 달리 호출 대상이 분명히 정해지지 않은 인텐트
- 주로 다른 응용 프로그램의 컴포넌트를 호출할 때 사용됨
- 다른 응용 프로그램의 내부 코드를 보지 않는 이상 호출할 대상의 분명한 이름을 알 수 없음
- 안드로이드 시스템에는 인텐트의 정보를 참조하여 호출된 적절한 컴포넌트를 검색하는 알고리즘이 작성되어 있음
- 안드로이드 시스템은 적절한 컴포넌트를 찾기 위해 설치된 모든 응용 프로그램의 컴포넌트를 조사하여 최적의 호출 대상을 결정함
7) 인텐트의 정보 명세
- 사용할 인텐트를 명확히 하기 위해 여러 가지 정보들(Action, Data, Type, Category, Component 등)이 포함됨
- 이 정보들을 생성자로 전달하여 초기화할 수도 있고, 일단 인텐트 객체를 생성한 후 메서드로 변경하거나 내용을 확인할 수도 있다.
- Action
- 프로그래머가 실행하고자 하는 동작을 의미
- 인텐트를 통한 수행 작업을 지정하는 역할을 하는 속성
-
액션 대상 설명 ACTION_CALL 액티비티 통화를 시작한다. ACTION_EDIT 액티비티 데이터를 표시하고 편집한다. ACTION_MAIN 액티비티 메인 액티비티를 실행한다.
입출력되는 데이터는 없다.ACTION_VIEW 액티비티 뭔가를 보여준다. ACTION_DIAL 액티비티 다이얼패드로 연결된다. ACTION_BATTERY_LOW 브로드캐스트 리시버 배터리가 부족하다. ACTION_HEADSET_PLUG 브로드캐스트 리시버 헤드셋이 장비에 접속되거나 분리되었다. ACTION_SCREEN_ON 브로드캐스트 리시버 화면이 켜졌다. ACTION_TIMEZONE_CHANGED 브로드캐스트 리시버 타임 존이 변경되었다. - 위 표에서 브로드캐스트 리시버(BR) 컴포넌트는 발생 사건에 대한 정보를 알려줌
- 위 표와 같이 시스템이 미리 정의해놓은 동작을 사용할 수도 있고, 사용자가 임의의 동작을 정의할 수도 있다.
- Action의 종류는 다양하며, 정수 타입이 아니라 문자열 타입으로 정의되어 있음
- Action을 조사하거나 변경할 때는 getAction, setAction 메서드 사용
- Data
- Data 속성은 Action에 필요한 상세 데이터를 제공하는 역할
- 대부분의 Action은 수행 작업에 대한 정보가 필요하므로, Action과 Data는 주로 쌍을 이루어 사용됨
- 예 1) ACTION_EDIT 액션에 대해서는 '편집의 대상이 되는 파일'을 지정해야 함
- 예 2) ACTION_CALL 액션에 대해서는 '전화를 걸 대상'을 지정해주어야 함
- Action의 목적이 되는 대상은 광범위하므로 임의의 대상을 유일하게 가리킬 수 있는 URI(Uniform Resource Identifier) 타입이 사용됨
- URI는 웹사이트 주소인 URL, 로컬 저장 장치의 파일 경로, 주소록의 레코드 하나까지도 유일하게 지정할 수 있는 범용적인 포맷이므로 데이터로 전달하기에 적합한 형태
- Action과 마찬가지로 Data 값에 접근하기 위해서는 getData, setData 메서드 사용
- Action과 Data 정보는 '~에 대한 ~동작'까지를 정의할 수 있으므로 대개의 경우는 이 두 정보만으로 대상 컴포넌트를 찾을 수 있음
- 하지만 정확하고 상세한 처리를 위해 추가적인 정보가 더 필요한 경우가 있음
- Action을 처리할 수 있는 적합한 컴포넌트가 둘 이상이거나 Data의 타입이 애매한 경우
- 이러한 경우에는 인텐트의 또 다른 속성인 Type, Category, Component, Extras 정보들도 가급적 상세하게 지정해줘야 함