Android 개발에서 인텐트(Intent)는 앱의 컴포넌트 간 통신을 담당하는 중요한 도구이다. 인텐트를 시스템에 전달할 때, 실행할 컴포넌트의 정보를 명시적 또는 암시적으로 지정할 수 있다.
val intent: Intent = Intent(this, DetailActivity::class.java)
위 코드는 명시적 인텐트(Explicit Intent)의 예시로, DetailActivity
라는 특정 액티비티를 명시적으로 지정하여 실행한다. 하지만 외부 앱의 컴포넌트를 실행할 때는 이러한 방식이 불가능하다. 이때는 암시적 인텐트(Implicit Intent)를 사용한다.
명시적 인텐트: 앱 내에서 특정 컴포넌트를 지정하여 실행한다. Intent
객체에 클래스 타입을 명시적으로 지정한다.
암시적 인텐트: 실행할 컴포넌트를 직접 지정하지 않고, 인텐트 필터(Intent Filter)를 통해 시스템이 적합한 컴포넌트를 찾아 실행하도록 한다.
<activity android:name=".OneActivity" />
<activity
android:name=".TwoActivity"
android:exported="true">
<intent-filter>
<action android:name="ACTION_EDIT" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
위의 예시에서는 TwoActivity
가 특정 작업(ACTION_EDIT
)을 처리할 수 있도록 인텐트 필터가 정의되어 있다. 이처럼 암시적 인텐트는 외부 앱과의 연동(예: 카메라, 전화, 갤러리 등)에서 많이 사용된다.
인텐트 필터는 action
, category
, data
태그를 사용해 실행될 컴포넌트를 결정하는 데 필요한 정보를 정의한다. 모든 태그가 필수는 아니며, 필요에 따라 설정할 수 있다.
action: 인텐트가 수행할 작업을 나타내는 문자열이다. 예를 들어, "ACTION_VIEW"
는 특정 데이터를 표시하라는 의미를 가진다.
category: 인텐트가 속하는 범주를 나타내는 문자열이다. 예를 들어, "android.intent.category.LAUNCHER"
는 런처에서 실행될 수 있는 컴포넌트를 의미한다.
data: 인텐트가 처리할 데이터의 유형을 나타낸다. 예를 들어, 특정 URL이나 파일 타입을 처리할 때 사용된다.
인텐트 필터는 Android 시스템이 암시적 인텐트를 처리할 때, 어떤 컴포넌트를 실행할지를 결정하는 데 사용된다. 시스템은 다음 절차에 따라 인텐트 필터와 일치하는 컴포넌트를 찾는다:
<action>
이 일치해야 한다.<category>
와 일치해야 한다.<data>
와 일치해야 한다.이 세 가지 조건이 모두 일치하는 컴포넌트가 실행된다.
암시적 인텐트를 사용할 때, 인텐트를 수신할 수 있는 컴포넌트가 몇 개인지에 따라 다음과 같은 상황이 발생할 수 있다.
실행할 액티비티가 없는 경우: 인텐트를 시작한 곳에서 오류가 발생한다. 이는 인텐트를 처리할 수 있는 컴포넌트가 없음을 의미한다.
실행할 액티비티가 하나인 경우: 해당 액티비티가 자동으로 실행된다.
실행할 액티비티가 여러 개인 경우: 시스템이 사용자에게 선택지를 제시하고, 사용자가 하나를 선택하여 실행한다.
인텐트 필터를 사용할 때, 특히 외부 앱과의 상호작용을 허용하는 경우 보안에 주의해야 한다. 잘못된 인텐트 필터 설정은 보안 취약점을 초래할 수 있다. 예를 들어, 민감한 데이터를 처리하는 컴포넌트는 exported
속성을 주의 깊게 설정하고, 필요에 따라 인텐트 필터를 제한적으로 정의해야 한다.
exported
속성을 적절하게 설정하여 외부에서 컴포넌트를 무분별하게 호출하지 않도록 한다.