컴포넌트를 실행하기 위해 시스템에 넘기는 정보, 컴포넌트간 통신의 징검다리
4대 컴포넌트에 관한 글을 간략하게 살펴보면 알겠지만, 인텐트는 컴포넌트가 독립적으로 실행되게끔 도와주는 역할을 맡는다.
🤔 왜 독립적이어야 하는데?
위의 예시를 토대로 살펴보도록 하자. 유저가 A 앱을 쓰다가 앱 내에 구현되어 있지 않은 지도 기능을 사용해야 하는 상황이다.
A 앱의 입장에서는 지도 기능을 구현한 앱은 시중에 충분히 있기 때문에, 다른 앱을 불러와서 사용하는 것이 앱 자체 유지보수에도 용이하고 유저에게 서비스를 제공함에 있어서도 효율적일 것이다.
그런데, 유저는 현재 안드로이드에 이미 지도 앱이 3개 깔려있는 상태이다.
이 상황에서 A 어플리케이션과 B 어플리케이션 중 하나가 결합되어 있는 상태라면, 유저가 3가지 앱 중 하나를 고르는 것이 아니라 3가지 앱 중 하나'만' 사용할 수 있는 상황이 닥쳤을 것이다.
하지만 안드로이드는 인텐트를 통해 시스템에서 액티비티를 실행하는 구조이므로, 두 앱이 직접적으로 결합하는 상황이 발생하지 않는다. 결과적으로, 독립적인 형태를 유지함으로서 유저는 하나의 지도 앱을 강제적으로 사용하는 것이 아니라, 상황에 따라 자신의 입맛에 맞게 지도 앱을 선택할 수 있다는 장점을 지니고 가는 것이다.
이제 인텐트의 종류에 대해 살펴볼텐데, 인텐트는 다른 컴포넌트를 실행할 때 인텐트에 어떤 정보를 담는지에 따라 종류가 구분된다.
실행하고자 하는 컴포넌트의 클래스명을 명확하게 인텐트에 담는 방법이다.
// kotlin
var intent = Intent(this, DetailActivity::class.java)
startActivity(intent)
// java
Intent intent = new Intent(this, DetailActivity.class);
startActivity(intent);
실행하고자 하는 작업이 있을 때, 안드로이드 기기에서 그 작업을 수행할 수 있는 모든 앱을 호출할 수 있도록 한다.
위의 사진 예시에서 사용된 인텐트가 바로 암시적 인텐트이다.
해당 컴포넌트가 자신이 받을 수 있는 인텐트의 종류를 정의한다.
<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);
Intent intent = new Intent();
intent.setAction("com.example.ACTION_VIEW");
intent.addCategory("com.example.category.MYCATEGORY");
startActivity(intent);
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);
참고 및 출처