: 컴포넌트간에 통신을 하기 위한 메시징 객체
어플리케이션 컴포넌트 간 정보를 전달하고 컴포넌트를 실행하기 위한 정보로,
명시적인텐트와, 암시적인텐트가 있다.
: 특정 컴포넌트에 대한 정보를 넣어서 해당 컴포넌트를 실행하고, 실행되는 컴포넌트에 원하는 데이터를 전달하는 것.
❗주의❗
안드로이드 개발자 문서에 따르면,
보안성 문제로 인하여 서비스 시작 시에는 명시적 인텐트를 사용할 것!
의도가 명확할 때 사용
호출할 대상이 확실하여, 액티비티가 명확하게 실행되어야할 경우
Package와 Class명을 정확하게 명시
val intent = Intent(this, MainActivity::class.java)
startActivity(intent)
호출할 대상이 명확하지 않을 때 사용
인텐트의 의도 맞는 Activity를 찾아서 실행
Action, Category, Type 등을 저장
암시적 인텐트 사용 방법
https://developer.android.com/guide/components/intents-common
인텐트를 수행하는 액티비티가 있는지는 ❓
packageManager로 intent.resolveActivity() 메서드를 통해 검사
val intent = Intent(Intent.ACTION_DIAL) // 암시적 인텐트
intent.data = Uri.parse("tel:02-000-000")
if(intent.resolveActivity(packageManager) != null){
startActivity(intent)
}
수행하는 액티비티가 없다면 null 반환.
안드로이드 11(api 30)이상의 경우 개인정보에 민감한 암시적 인텐트의 사용 제한!
패키지 가시성을 설정해주어야 암시적 인텐트 사용 가능
<queries>
<intent>
<action android:name="android.intent.action.DIAL"/>
</intent>
<intent>
<action android:name="android.intent.action.SENDTO"/>
<data android:scheme="*"/>
</intent>
</queries>
fun Context.email(email: String, subject: String = "", text: String = ""): Boolean {
val intent = Intent(Intent.ACTION_SENDTO).apply {//첨부 파일이 없을 경우 이메일 인텐트 SENDTO
data = Uri.parse("mailto:") // only email apps should handle this
putExtra(Intent.EXTRA_EMAIL, arrayOf(email))
if (subject.isNotEmpty())
putExtra(Intent.EXTRA_SUBJECT, subject)
if (text.isNotEmpty())
putExtra(Intent.EXTRA_TEXT, text)
}
if (intent.resolveActivity(packageManager) != null) {
startActivity(intent)
return true
}
return false
}