[Android] 인텐트 (명시적 인텐트/암시적 인텐트) 정리

김민주·2022년 10월 20일
0

Android

목록 보기
7/21


인텐트란?

: 컴포넌트간에 통신을 하기 위한 메시징 객체

어플리케이션 컴포넌트 간 정보를 전달하고 컴포넌트를 실행하기 위한 정보로,
명시적인텐트와, 암시적인텐트가 있다.


인텐트 사용 목적

: 특정 컴포넌트에 대한 정보를 넣어서 해당 컴포넌트를 실행하고, 실행되는 컴포넌트에 원하는 데이터를 전달하는 것.



❗주의❗

안드로이드 개발자 문서에 따르면,
보안성 문제로 인하여 서비스 시작 시에는 명시적 인텐트를 사용할 것!



명시적 인텐트(Explicit Intent)

  • 의도가 명확할 때 사용
    호출할 대상이 확실하여, 액티비티가 명확하게 실행되어야할 경우

  • Package와 Class명을 정확하게 명시

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


암시적 인텐트(Implicit 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)이상의 경우 개인정보에 민감한 암시적 인텐트의 사용 제한!

패키지 가시성을 설정해주어야 암시적 인텐트 사용 가능


  • AndroidManifests.xml 에서 지정해주기
  <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
}
  • Context 클래스에 확장함수 email을 만들어 사용
  • apply()로 intent의 data 지정
profile
𝐃𝐨𝐧'𝐭 𝐛𝐞 𝐚 𝐩𝐫𝐨𝐜𝐫𝐚𝐬𝐭𝐢𝐧𝐚𝐭𝐨𝐫💫

0개의 댓글