인텐트 필터

이윤설·2024년 8월 31일
0

인텐트 필터 (Intent Filter)

Android 개발에서 인텐트(Intent)는 앱의 컴포넌트 간 통신을 담당하는 중요한 도구이다. 인텐트를 시스템에 전달할 때, 실행할 컴포넌트의 정보를 명시적 또는 암시적으로 지정할 수 있다.

val intent: Intent = Intent(this, DetailActivity::class.java)

위 코드는 명시적 인텐트(Explicit Intent)의 예시로, DetailActivity라는 특정 액티비티를 명시적으로 지정하여 실행한다. 하지만 외부 앱의 컴포넌트를 실행할 때는 이러한 방식이 불가능하다. 이때는 암시적 인텐트(Implicit Intent)를 사용한다.

명시적 인텐트 vs 암시적 인텐트

  • 명시적 인텐트: 앱 내에서 특정 컴포넌트를 지정하여 실행한다. 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>와 일치해야 한다.

이 세 가지 조건이 모두 일치하는 컴포넌트가 실행된다.

암시적 인텐트의 동작 방식

암시적 인텐트를 사용할 때, 인텐트를 수신할 수 있는 컴포넌트가 몇 개인지에 따라 다음과 같은 상황이 발생할 수 있다.

  1. 실행할 액티비티가 없는 경우: 인텐트를 시작한 곳에서 오류가 발생한다. 이는 인텐트를 처리할 수 있는 컴포넌트가 없음을 의미한다.

  2. 실행할 액티비티가 하나인 경우: 해당 액티비티가 자동으로 실행된다.

  3. 실행할 액티비티가 여러 개인 경우: 시스템이 사용자에게 선택지를 제시하고, 사용자가 하나를 선택하여 실행한다.

인텐트 필터와 보안

인텐트 필터를 사용할 때, 특히 외부 앱과의 상호작용을 허용하는 경우 보안에 주의해야 한다. 잘못된 인텐트 필터 설정은 보안 취약점을 초래할 수 있다. 예를 들어, 민감한 데이터를 처리하는 컴포넌트는 exported 속성을 주의 깊게 설정하고, 필요에 따라 인텐트 필터를 제한적으로 정의해야 한다.

인텐트 필터 설정의 베스트 프랙티스

  • 명확한 액션과 카테고리 지정: 암시적 인텐트를 처리할 때, 예상치 못한 컴포넌트가 실행되는 것을 방지하기 위해 액션과 카테고리를 명확하게 지정한다.
  • 적절한 데이터 필터링: 데이터 필터를 사용해 특정 유형의 데이터만 처리하도록 제한한다.
  • 보안 고려: exported 속성을 적절하게 설정하여 외부에서 컴포넌트를 무분별하게 호출하지 않도록 한다.
profile
화려한 외면이 아닌 단단한 내면

0개의 댓글