[안드로이드] Intent란?

MinGyun_06·2023년 3월 30일

android

목록 보기
1/7

4대 컴포넌트

Intent에 대해 알기 전에 우선 4대 컴포넌트에 대해 알 필요가 있습니다. 4대 컴포넌트는 다음과 같이 구성되어 있습니다.
1. 액티비티 (Activity)
2. 서비스 (Service)
3. 브로드캐스트 리시버 (BroadCast Receiver)
4. 콘텐트 프로바이더 (Content Provider)
Intent는 위 4개의 컴포넌트가 서로 상호작용을 하기 위해 중간에서 메세지를 전달해주는 역할을 합니다. 가장 많이 쓰이는 예를 들자면 액티비티에서 다른 액티비티로 넘어가는 것이 있습니다. 또 인텐트는 명시적 인텐트와 암시적 인텐트로 나눌 수 있습니다.

명시적 인텐트

명시적의 사전적 의미는 '내용이나 뜻을 분명하게 드러내 보이는 것' 입니다. 명시적의 사전적 의미를 본다면 명시적 인텐트의 특징을 유추해볼 수 있을겁니다. 앱 내에서 화면 전환을 하거나 사용자의 어떤 활동으로 인한 결과를 확실히 알 수 있다고 할 수 있을때 그 인텐트를 명시적 인텐트라고 칭할 수 있습니다. 아래 코드는 명시적 인텐트인 화면 전환 코드의 일부분입니다.
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        binding.addButton.setOnClickListener {
            val intent = Intent(activity, add_activity::class.java)
            startActivity(intent)
        }
    }
위의 코드를 보면 Intent객체 안에 이동 전 액티비티를 먼저 쓰고, 뒤에 이동할 액티비티(메시지를 전달할 액티비티)를 적어줍니다. 이처럼 직접 클래스명에 담는 것을 명시적 인텐트라고 합니다.

암시적 인텐트

암시적 인텐트는 인텐트의 액션과 데이터를 지정하긴 했지만, 호출할 대상이 명확하지 않고 달라질 수 있는 경우에 사용합니다. 암시적 인텐트 같은 경우에는 클래스명을 만들지 않고 intent-filter 라는 것을 사용합니다.
위의 그림에서는 A앱에서 B앱으로 Intent를 통하여 정보를 전달하려고 합니다. 하지만 B앱의 어디에서 정보를 받는지 알 수 없기 때문에 AndroidManifest에 intent-filter를 적어줍니다. 암시적 인텐트의 정보전달 과정은 다음과 같습니다.
1. A앱에서 Intent에 정보를 전달한다.
2. Android 시스템이 B앱에서 해당 인텐트와 일치하는 인텐트 필터를 검색한다.
3. 일치하는 항목을 찾으면, 시스템이 해당 액티비티의 onCreate() 메서드를 호출하여 이를 Intent에 전달하고, 일치하는 B앱의 액티비티를 시작한다.
여기까지가 명시적 인텐트와 암시적 인텐트에 대한 설명이고, 밑에서 Intent-filter에 대해 조금 더 알아보도록 하겠습니다.

Intent-filter

암시적 인텐트에 쓰이는 인텐트 필터에 대해 더 알아봅시다.
우선 인텐트 필터는 AndroidManifast.xml 에 추가할 수 있습니다. Manifast에 intent-filter 태그를 등록하면 하위 태그를 쓸 수 있는데 그 안의 태그는 다음과 같습니다.
  • action(액션 필터): 컴포넌트가 어떤 능력(기능)을 가지고 있는지에 대한 문자열입니다. 개발자가 임의로 지정할수도 있으며, 라이브러리에서 지정한 문자열을 해도 됩니다.
  • category(카테고리 필터): Intent 객체 내의 category를 검사하여 intent-filter에 정의된 카테고리와 일치하는지 검사한다.
  • data(데이터 필터): Intent 객체 내의 data 항목 및 type을 검사하여 intent-filter에 정의된 값과 비교하여 일치하는지 여부를 검사합니다.

0개의 댓글