Hayden's Archive

[Android] 액티비티(Activity)와 인텐트(Intent) 본문

Study/ETC

[Android] 액티비티(Activity)와 인텐트(Intent)

_hayden 2021. 6. 6. 19:10

참고 : 한국방송통신대학교 모바일앱프로그래밍 교재( 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 정보들도 가급적 상세하게 지정해줘야 함