안드로이드 인텐트 | Android Basic Knowledge

hoya·2021년 10월 8일
0

Android Basic Knowledge

목록 보기
3/3
post-thumbnail

😮 인텐트?

컴포넌트를 실행하기 위해 시스템에 넘기는 정보, 컴포넌트간 통신의 징검다리

4대 컴포넌트에 관한 글을 간략하게 살펴보면 알겠지만, 인텐트는 컴포넌트가 독립적으로 실행되게끔 도와주는 역할을 맡는다.

🤔 왜 독립적이어야 하는데?

위의 예시를 토대로 살펴보도록 하자. 유저가 A 앱을 쓰다가 앱 내에 구현되어 있지 않은 지도 기능을 사용해야 하는 상황이다.

A 앱의 입장에서는 지도 기능을 구현한 앱은 시중에 충분히 있기 때문에, 다른 앱을 불러와서 사용하는 것이 앱 자체 유지보수에도 용이하고 유저에게 서비스를 제공함에 있어서도 효율적일 것이다.

그런데, 유저는 현재 안드로이드에 이미 지도 앱이 3개 깔려있는 상태이다.

이 상황에서 A 어플리케이션과 B 어플리케이션 중 하나가 결합되어 있는 상태라면, 유저가 3가지 앱 중 하나를 고르는 것이 아니라 3가지 앱 중 하나'만' 사용할 수 있는 상황이 닥쳤을 것이다.

하지만 안드로이드는 인텐트를 통해 시스템에서 액티비티를 실행하는 구조이므로, 두 앱이 직접적으로 결합하는 상황이 발생하지 않는다. 결과적으로, 독립적인 형태를 유지함으로서 유저는 하나의 지도 앱을 강제적으로 사용하는 것이 아니라, 상황에 따라 자신의 입맛에 맞게 지도 앱을 선택할 수 있다는 장점을 지니고 가는 것이다.

이제 인텐트의 종류에 대해 살펴볼텐데, 인텐트는 다른 컴포넌트를 실행할 때 인텐트에 어떤 정보를 담는지에 따라 종류가 구분된다.


📣 명시적 인텐트 (Explicit Intent)

실행하고자 하는 컴포넌트의 클래스명을 명확하게 인텐트에 담는 방법이다.

// kotlin
var intent = Intent(this, DetailActivity::class.java)
startActivity(intent)
// java
Intent intent = new Intent(this, DetailActivity.class);
startActivity(intent);
  • 컴포넌트의 이름을 명확히 알고있을 때 사용한다.
  • 주로 같은 앱의 컴포넌트를 실행할 때 사용한다.
    외부 앱의 클래스 명을 알고 있는 경우가 무척 드물고, 애초에 보안상 액티비티의 클래스 명을 외부로 공개할 일도 거의 없다.

📢 암시적 인텐트 (Implicit Intent)

실행하고자 하는 작업이 있을 때, 안드로이드 기기에서 그 작업을 수행할 수 있는 모든 앱을 호출할 수 있도록 한다.

위의 사진 예시에서 사용된 인텐트가 바로 암시적 인텐트이다.

  • 클래스 명을 알 수 없는 외부 앱의 컴포넌트를 실행할 때 사용한다.
  • 자신은 작업을 실행할 수 없지만 다른 앱은 실행할 수 있을 때 사용한다.
  • 클래스 명이 아닌 인텐트 필터 정보를 활용한다.

Intent Filter

해당 컴포넌트가 자신이 받을 수 있는 인텐트의 종류를 정의한다.

<activity android:name=".DetailActivity">
  <intent-filter>
    <action android:name="com.example.ACTION_VIEW"/>
    <category android:name="android.intent.category.DEFAULT"/> <!-- 기본 카테고리 -->
    <category android:name="com.example.category.MYCATEGORY"/>
    <data android:mimeType="video/mpeg" android:scheme="http"/>
  </intent-filter>
</activity>
Intent intent = new Intent();
intent.setAction("com.example.ACTION_VIEW");
startActivity(intent);
  • action : 컴포넌트가 어떤 작업을 수행할 수 있는지 정의한다.
    : 전화를 건다, 지도를 보여준다, 문자를 전송한다 등. . .
Intent intent = new Intent();
intent.setAction("com.example.ACTION_VIEW");
intent.addCategory("com.example.category.MYCATEGORY");
startActivity(intent);
  • category : 어떤 카테고리의 컴포넌트인지 정의한다.
    : 인텐트 필터 작성시 기본 카테고리는 꼭 추가해야 한다.
    : 암시적 인텐트 선언시 카테고리를 추가하지 않은 경우 기본 카테고리를 추가한다.
    : 기본 카테고리 → android.intent.category.DEFAULT
    : 실제로 많이 사용되진 않는다.
Intent intent = new Intent();
intent.setAction("com.example.ACTION_VIEW");
intent.setData(Uri.parse("http://velog.io/@hoyaho"));
intent.setType("video/mpeg");
startActivity(intent);
  • data : 허용 데이터 유형을 정의한다.
    : 데이터 URI 혹은 MIME 유형을 통해 데이터 검사가 이뤄진다.
    : URI는 데이터 주소를 이용해 검사한다.
    : scheme://host:port/path 의 구조로 구성된다.
    : http:// → (scheme), velog.io → (host), → /@hoyaho (path)
    : MIME 유형은 데이터 유형을 이용해 검사한다.
    : 상위 범주, 하위 범주 형식으로 정의한다.
    : video (상위 범주) / mpeg (하위 범주)

참고 및 출처

깡샘의 안드로이드 프로그래밍
안드로이드 공식 사이트
커니의 안드로이드 이야기

profile
즐겁게 하자 🤭

0개의 댓글