암시적 인텐트 처리 과정
인텐트 전송 - 액티비티 매니저 - 패키지 매니저 - 사용 가능한 패키지 검색 -
설치된 패키지 정보 검색 후 액티비티 매니저에게 전달 - 실행
액션 : 동작을 설명하는 문자열 (이 앱은 이 동작과 관련이 있다)
ex) 보여주기(VIEW), 전화걸기(DIAL) 등
카테고리: 액티비티의 분류 (이 앱은 해당 카테고리에 속한다)
ex) 웹 브라우저(BROWSABLE), 계산기(APP_CALCULATOR)
+ DEFAULT 카테고리: 암시적 컴포넌트로 명시함 (실행 가능한 앱 목록에 등장 가능)
데이터 위치: 실행될 컴포넌트가 필요로 하는 데이터 위치 정보 (Uri로 표현)
ex) 뮤직 플레이어 앱에서 음악 선택 - 선택한 음악 파일 위치를 플레이어 액티비티에 전달 - 플레이어에서 위치를 통해 파일 찾아 실행
+ 데이터를 직접 보내지 않고 위치정보만 전송해 효율적
데이터 타입: 3번에서 명시한 데이터의 타입을 설정
ex) 선택한 음악 파일의 타입 명시 mimeType="audio/mpeg"
앱에 Intent가 전달되었을 때 Intent Filter에 기술된 조건에 맞는 Intent만 통과시킴 (말 그대로 필터링)
Manifest에서 activity 내부에 선언하며, 해당 activity가 어떤 동작인지, 어떤 카테고리인지 명시하여 일치하는 암시적 인텐트를 받을 수 있도록 함
ex) A 앱에서 Intent에 ACTION_VIEW, CATEGORY_BROWSABLE를 설정한 후 전송하면?
- 암시적 인텐트이므로 CATEGORY_DEFAULT가 자동 추가된 후 전송
- 설치된 앱들 중 Intent Filter에 ACTION_VIEW, CATEGORY_BROWSABLE,
CATEGORY_DEFAULT가 정의된 앱들의 목록이 등장함
(해당 앱들의 Filter가 Intent를 통과시킴)
- 목록에서 앱을 선택하면 해당 앱으로 Intent 전달하며 컴포넌트를 실행함
(코드 예시)
[A 앱] // 웹 사이트를 열기 위한 인텐트를 전송
val intent = Intent().apply {
action = Intent.ACTION_VIEW
data = Uri.parse("https://www.google.com")
}
context.startActivity(intent)
[B 앱 Manifest] // A앱이 보낸 intent의 액션 및 카테고리가 일치하여 통과
...
<activity
android:name="com.ich.BActivity">
<intent-filter>
<action android:name="action.ACTION_VIEW/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
</intent-filter>
</activity>
B 앱에서 A 앱의 암시적 인텐트를 통과시켜 받았으므로, B 앱에서는 해당 인텐트의 data (google 주소)를 받아 웹을 띄워 줄 수 있다