액티비티 실행과 인텐트(2)

·2021년 10월 15일
1

안드로이드

목록 보기
8/17

데이터 덩어리에서 Intent로 변신

인텐트 내부에서 사용되는 멤버 변수
단순히 직렬화된 데이터 덩어리지만, 앱과 액티비티 매니저, 패키지 매니저 등의 시스템 서비스 간에 약속된 의미 있는 정보를 채워넣으면서 인텐트라는 것이 된다.

인텐트에 의미를 부여하는 여섯 가지 정보

인텐트 정보의 주 목적은 특정 컴포넌트에 대한 실행 정보를 넣어서 해당 컴포넌트를 실행하고, 실행되는 컴포넌트에 원하는 데이터를 전달하는 것이다.

인텐트

인텐트를 이용해서 원한느 컴포넌트를 실행하기 위해서는 명시적인 방법과 암시적인 방법이 있다.

명시적 인텐트

실행할 액티비티 컴포넌트를 정확히 명시하는 것
그러므로 실행될 컴포넌트명을 인텐트에 작성해주어야 한다.
+) ComponentName 클래스도 Parcelable을 상속받은 직렬화 클래스이다.

외부 패키지에 있는 액티비티를 활성화하기 위해서는 명시적 인텐트를 사용하는 경우가 거의 없다.
1. 외부 패키지는 정확한 패키지명과 컴포넌트명을 미리 알고 있는 경우가 드물다
2. 알고 있더라도 해당 단말기에 실행될 앱이 설치되어 있지 않을 수도 있다.
3. 외부 앱들도 보안상 자신의 액티비티를 외부에 공개하지 않는다.
→ 따라서 명시적 인텐트는 패키지 내부의 액티비티를 실행할 떄만 사용하는 것이 맞다.
외부 패키지의 액티비티는 암시적 인텐트를 사용해야 한다.

내부 액티비티 실행하는 방법
Intent intent = new Intent(this, A2Activity.class);
startActivity(intent);

액티비티 클래스가 Context 클래스를 상속받기 때문에 Context 객체 대신 액티비티 객체를 전달 가능

액티비티 컴포넌트 공개/비공개

exported 속성의 기본 값은 false다. 기본적으로 액티비티는 외부에 공개되지 않는다.
그런데 암시적 컴포넌트는 자동으로 이 값이 true다. 그 이유는 암시적 컴포넌트의 경우, 외부에 공개를 목적으로 등록된 컴포넌트이기 때문이다.

암시적 인텐트

인텐트를 한국어로 번역하면 '의도'라고 해석될 수 있으며, 암시적 인텐트에 가장 부합되는 의미이다.
이는 명시적 인텐트와 달리 암시적 인텐트는 어떤 '의도'만으로 원하는 컴포넌트를 실행할 수 있기 때문
예를 들어, 앱 내에서 웹 페이지를 보여주는 기능이 필요하지만 해당하는 기능이 없을 수 있다.
→ 웹 페이지를 보여줘야 하는 의도를 인텐트에 담아 보내면 액티비티 매니저는 그 기능을 가지는 컴포넌트를 찾아서 실행함

1. 웹페이지를 보여 달라는 의도를 인텐트에 담아 startActivity를 한다.
2. 액티비티는 패키지 매니저에게 실행시켜줄 패키지 정보를 요청함
3. 패키지 매니저는 설치된 앱 정보를 검색해서 액티비티 매니저에게 패키지 정보를 전달함.
4. 액티비티 매니저는 전달받은 정보를 통해서 원하는 액티비티를 실행함.
+) 패키지 매니저는 모든 설치된 앱의 정보를 관리한다. 이 정보를 앱의 AndroidManifest.xml을 통해 수집한다.

의도 정보는 인텐트의 네 가지 정보를 통해 설정한다.

액션

동작을 설명하는 미리 정의된 문자열을 말한다.
ex) sms를 발송한다, 메일을 보낸다, 전화를 건다 등

카테고리

액티비티의 분류에 해당한다.
ex) 액티비티 홈의 앱 아이콘을 눌렀을 때 실행되는 액티비티 : android.intent.category.LAUNCHER

데이터 위치

실행될 컴포넌트가 특정 데이터를 필요로 한다면 추가된다.
ex) 액션이 음악을 재생한다면 데이터 위치는 음악 파일의 경로

데이터 타입

마찬가지로 특정 데이터의 타입을 추가한다.
ex) 위의 예로 기준으로 mp3 같은 음악 파일의 포맷 추가

액션과 카테고리로 외부 어플 계산기를 실행하는 방법

Intent intent = new Intent();
intent.setAction(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_APP_CALCULATOR);
startActivity(intent);
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://m.naver.com"));

Intent.ACTION_MAIN

앱을 실행했을 때 가장 첫번쨰로 실행되는 액티비티를 보여달라는 액션

Intent.ACTION_VIEW

음악을 재생하거나, 웹 페이지를 보거나, 텍스트 파일을 보는 등 다양한 콘텐츠를 지정하는 동작

데이터 위치에 대한 명세 방법

URI 형식은 위치 정보를 표현하기에 매우 적합한 구조다 .URL도 URI의 subset이다.

scheme은 URI의 프로토콜 방식을 의미함

데이터 타입의 표현

MIME(Multipurpose Internet Mail Extensions, 마임)

이메일 서비스에서 메일에 첨부된 파일의 데이터 타입을 구분하기 위한 용도로 생겨남
<type>/<sub type> 형식으로 쉽게 데이터 타입을 구분할 수 있다.

intent.setAction(Intent.ACTION_VIEW);
String audioPath = "file:///" + Environment.getExternalStorageDirectory()
				+ "/sample_mp3.mp3";
intent.setDataAndType(Uri.parse(audioPath), "audio/*");

이때 데이터와 타입을 따로 설정하면 오류가 발생한다

데이터 위치 전달의 필요성

데이터 위치 인텐트 필터에 대해서 배우려면 먼저 URI에 대한 이해가 필수다

이미지를 보여주는 컴포넌트에 어떻게 이미지 데이터를 전달해야지만 효율적인가?
→ 실제 데이터 자체를 전달학지 않고 인텐트를 통해 데이터가 존재하는 위치 정보만 전달한다.\

액션에 따라 달라지는 동작들

암시적 컴포넌트 등록

어떻게 암시적 액티비티로 등록할까?

인텐트 필터

통과시킬 인텐트를 기술하는 <intent-filer> ~~ </intent-filter> 부분
인텐트 필터에 기술된 조건에 맞는 인텐트만 처리함
필터링 조건을 action, category, 데이터 위치, 타입으로 기술함
즉, 액션 카테고리, 데이터 위치, 타입이 일치하지 않으면 해당 인텐트가 전달되지 않고 컴포넌트도 실행되지 않음

인텐트를 전달할때 액션은 있지만 카테고리가 없는 경우
→startActivity 함수가 내부적으로 android.intent.category.DEFAULT를 강제로 추가한다.
따라서 인텐트 필터에 카테고리 DEFAULT를 설정하지 않으면 어떤 암시적 인텐트도 받을 수 없다.

카테고리 활용

카테고리의 역할 : 앱이 어떤 그룹에 속할지를 지정. 어떤 기능적 속성을 가지는지 지정

이런식으로 지정하게 되면 두개의 앱을 계산기 그룹에 넣을 수 있다.

android.intent.category.BROWSABLE 사용
→ 웹 브라우저가 "내가 구현한 앱'을 접근할 수 있도록 함

데이터를 누군가와 공유하고 싶을때

<action android:name="action.ACTION_SEND" />

profile

0개의 댓글