1. Intent란?


안드로이드 앱을 구성하는 4대 컴포넌트는 다음과 같습니다.

  • Activity
  • Broadcast Receiver
  • Content Provider
  • Service

 

컴포넌트 클래스는 시스템이 생성해서 실행하는 클래스입니다. 그래서 컴포넌트를 실행하고 싶다면 시스템에 제 의도를 담은 메시지를 전달해 컴포넌트 실행을 요청해야 합니다. 이를 위해 Intent 객체가 사용됩니다.

 

다음은 MainActivity에서 명시적 인텐트를 이용해 SubActivity 실행을 요청하는 코드입니다.

<application ...>
  <activity android:name=".SubActivity">
  <activity android:name=".MainActivity">
    <intent-filter>
      <action android:name="android.intent.action.MAIN" />
      <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
  </activity>
</application>
class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        
        // button이라는 id값을 가지는 버튼이 있다고 가정하겠습니다.
        binding.button.setOnClickListener {
            val intent = Intent(this, SubActivity::class.java)
            startIntent(intent)
        }
    }
}
class SubActivity : AppCompatActivity() {
    private lateinit var binding: ActivitySubBinding
    override fun onCreate(savedInstanceState: Bundle?) {
        // ... 뷰를 inflate하고 세팅하는 초기 코드는 생략하겠습니다.
        binding.button2.setOnClickListener {
            val intent = Intent(this, MainActivity::class.java)
            startIntent(intent)
        }
    }
}

2. 명시적 인텐트와 암시적 인텐트


Intent 객체를 시스템에 전달해 컴포넌트 실행을 요청하는 모습입니다.

[그림 1] Intent 객체를 시스템에 전달해 컴포넌트 실행을 요청한다.

여기서 잘 생각해보셔야 하는 점은, 시스템이 실행시키는 컴포넌트는 외부 앱(전화, 메시지, 카카오톡, .. 등)일 수 있다는 점입니다.
아래 코드는 암시적 인텐트로 전화 앱의 Activity 실행을 시스템에 요청하는 코드입니다.
Intent()의 첫 번째 파라미터로 action 값이 들어가는데, 이 action 값을 <intent-filter> 로 등록해놓은 컴포넌트가 실행 대상이 됩니다.

class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        
        val uri = Uri.parse("tel:010-1234-5678")
        val intent = Intent(Intent.ACTION_DIAL, uri)
        startActivity(intent)
    }
}

만약, 전화 앱의 Activity를 띄우는 것이 아니라, 바로 전화를 걸고 싶다면 어떻게 해야 할까요?