본 게시글은
'Do It! 안드로이드 프로그래밍 개정7판' / '단계별로 배우는 안드로이드 프로그래밍'
두 권의 교재를 통해 학습한 내용을 스스로 정리하는 목적으로 작성한 게시글 입니다.
인텐트(Intent) : 개발자의 의도(intent)가 들어간, 앱 구성요소가 해야 할 작업을 시스템에 요청하는 자바 객체.
안드로이드의 구성요소 중 '액티비티', '서비스', '브로드캐스트 수신기'는 인텐트에 의해 시작된다.
Intent intent = new Intent(); // intent 객체 생성
// ... 중략 ...
startActivity(intent); // 액티비티의 실행을 시스템에 요청
startService(intent); // 서비스의 실행을 시스템에 요청
sendBroadcast(intent); // 브로드캐스트를 보내서, 브로드캐스트 수신기의 시작을 시스템에 요청
인텐트는 앱 구성요소들 사이에서 '작업수행에 필요한 정보'를 전달하는 역할을 한다.
인텐트의 종류는 두 가지
1. 명시적 인텐트 : 호출 대상을 정확히 명시한다.
2. 암시적 인텐트 : 호출 대상을 명시하지 않아 여러가지가 가능하다.
암시적 인텐트는 기본적으로 '액션'과 '데이터'로 구성된다.
" '이 데이터'를 가지고 '이 액션'을 취한다 " 라는 인텐트를 만들고,
시스템에게 이 인텐트를 실행할 수 있는 후보를 선정받아 실행한다.
액션 : 수행할 기능(앤티비티/서비스) | 전달할 브로드캐스트(브로드캐스트 수신기)
데이터 : 수행될 대상의 데이터의 위치&타입 (위치 : URI, 타입 : MIME)
상황에 따라서 위치나 타입은 생략이 가능하다.
URI : Uniform Resource Identifier, 통합 지원 식별자
인터넷의 URL(Uniform Resource Locator)의 상위 개념으로 URI가 필요한 곳에 URL을 쓸 수 있다.
MIME : Multipurpose Internet Mail Extensions, 다목적 인터넷 메일 확장
원래 이메일로 다양한 데이터를 보내고자 정의된 것.
'타입/하위타입' 형태로 정의
Ex) text/plain, image/jpeg, audio/mpeg, video/mp4
ex) 'A라는 주소(데이터)'를 '브라우저로 열어라' (액션)
이때 이용 가능한 브라우저가 여러 개라면 (네이버, 크롬, 삼성인터넷 등등)
그 중 하나를 선택하도록 하는 선택창이 뜬다.
"입력된 주소로 브라우저를 열다" 라는 인텐트가 가리키는 대상이 여러개가 될 수 있는 것이다.
1. 내부 액티비티 실행 (명시적 인텐트)
intent = new Intent(this, SubActivity.class);
startActivity(intent);
Intent( 컨택스트 객체, Class 객체)
컨택스트 객체 : this => 현재 액티비티 객체를 전달
(이게 왜 필요하고, 무슨 역할을 하는지 모르겠음)
Class 객체 : 클래스이름.class 형태의 객체 전달.
실행할 액티비티 클래스의 이름이 'SubActivity' 이라면 SubActivity.class 형태로 전달.
즉, 실행할 액티비티 클래스의 이름을 직접 명시해서 실행한다.
내부 액티비티 실행시 생성자 호출만으로 인텐트를 생성하는 것이 적합하다.
2. 외부 액티비티 실행 (명시적 인텐트)
Intent intent = new Intent();
intent.setClassName("com.android.settings", "com.android.settings.Settings");
startActivity(intent);
기본 생성자로 인텐트를 생성하고,
특정 패키지의 특정 클래스 이름을 직접 명시하여 액티비티를 실행한다.
예시 코드의 패키지와 클래스는
안드로이드 내장 '설정' 앱의 메인 액티비티를 실행하도록 한 패키지와 클래스 이름이다.
암시적 인텐트는 다른 여러가지 속성을 갖는다.
카테고리(범주) / 컴포넌트 / 부가 데이터 / 플래그 ...
액션, 데이터, 카테고리 같은 요소를 통해, 가장 적절한 후보를 시스템이 선정해준다.
카테고리 : Category
인텐트를 수신할 수 있는 대상의 종류
생략 가능하다.
컴포넌트 : Component
인텐트에 사용될 컴포넌트 클래스 이름을 명시적으로 지정
클래스 이름 지정방식과 유사
부가 데이터 : Extras
인텐트의 Bundle 객체에 데이터를 실어 보낼 수 있다.
putExtra("key", "value") 로 데이터를 넣고
get~Extra("key") / get~Extra("key", "default") 로 데이터를 가져온다.
플래그 : Flags
액티비티 스택에서 액티비티의 작동을 제어한다.
3. 외부 액티비티 실행 (암시적 인텐트)
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.parse("https://www.google.co.kr/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png"), "image/*");
intent.addCategory(Intent.CATEGORY_DEFAULT);
startActivity(intent);
기본 생성자로 인텐트를 만들고, 메소드를 활용해 속성을 채운다.
액션 : INTENT.ACTION_VIEW, 무언가를 '보고 싶다' 라는 안드로이드 표준 액션
데이터 : 위치=Uri.parse("위치") | 타입 = "image/*" 또는 "image/png"
카테고리 : Intent.CATEGORY_DEFAULT, 안드로이드 표준 카테고리
* 인텐트로 액티비티를 실행하는 경우, 카테고리 설정은 생략 가능
어떤 앱 구성요소가 암시적 인텐트의 후보로 적합한지 결정하는 것은
해당 앱 구성 요소의 "인텐트 필터" 이다.
인텐트 필터는 액션, 데이터, 카테고리로 구성되며, menifest 파일에 선언된 구성 요소의 하위 요소로 넣는다.
이를 넣지 않으면 해당 요소는 명시적 인텐트로만 실행 가능하다.
명시적 인텐트는 인텐트 필터의 존재, 내용에 상관없이 기능할 수 있다.
인텐트 필터는 여러개를 넣을 수 있다.
데이터는 위치의 경우 scheme (인터넷의 경우 프로토콜에 해당) 만 써조는 것이 일반적
액티비티는 카테고리를 default로만 선언해야한다.
'Android > Java' 카테고리의 다른 글
[안드로이드] getWidth() 와 getMeasuredWidth() (0) | 2021.03.20 |
---|---|
[안드로이드] Constraint Layout 동적 생성 후 동적으로 뷰 추가하기 (0) | 2021.03.20 |
[안드로이드] 프래그먼트(Fragment) (0) | 2021.01.03 |
[안드로이드] 인텐트 활용 : 데이터 교환(2) (0) | 2021.01.02 |
[안드로이드] 인텐트 활용 : 데이터 교환(1) (0) | 2021.01.01 |