개발/안드로이드-kotlin

[android/kotlin] Intent는 무엇인가?

어중E 2022. 8. 13. 20:48

[android/kotlin] Intent는 무엇인가?

intent의 뜻은 의도, 의지라는 뜻을 가지고 있습니다. 저는 이제 막 안드로이드를 접하고 배우고 있는 단계일 때, 이 단어를 보고 어떤 용도인지 감이 오지 않아서 여기저기 많이 찾아봤습니다만 사용방법에 대해서는 잘 알려주지만 시원하게 궁금증을 해결해 주는 곳은 없었던 것 같습니다. intent의 의도라는 뜻은 우리의 의도라고 봐야 할 것 같습니다. '스택오버플로우'라는 커뮤니티에서도 저와 비슷한 궁금증을 가진 사람이 있었는데 그에 대한 대답으로는 다음과 같았습니다.

 

의도(Intent)는 당신이 하고 싶은 것을 안드로이드에게 말하는 한 방법이다. 다시 말해, 당신은 당신의 의도를 묘사합니다.

 

안드로이드 4대 컴포넌트 간의 통신

안드로이드에는 4대 컴포넌트라고 불리는 것이 있습니다. 

  • 액티비티(Activity)
  • 서비스(Service)
  • 방송 수신자(BroadCast Receiver)
  • 콘텐츠 제공자(Content Provider)

이렇게 되어 있습니다. 이 컴포넌트 간의 통신을 해주는 것이 Intent의 역할입니다. 안드로이드 개발자 페이지에서는 사용 사례를 크게 3가지를 알려주고 있습니다.

  • 액티비티 시작
  • 서비스 시작
  • 브로드캐스트 전달

액티비티 시작의 경우 내가 어떤 액티비티에서 어떤 액티비티로 전환을 시도하겠다는 의도(Intent)를 안드로이드한테 전달하는 것이고, 서비스의 시작도 동일합니다. 백그라운드를 시작하겠다는 의도(Intent)를 안드로이드한테 전달하는 것입니다. 브로드캐스트의 전달도 동일합니다.

 

이렇게 의도를 안드로이드에게 전달할 수 있게 해주는 것이 Intent의 역할이라 볼 수 있습니다.

 

Intent의 유형 - 명시적 Intent, 암시적 Intent

이런 의도에도 유형이 있습니다. 의도가 명확한 경우가 있고 명확하지 않는 경우가 있습니다. 이를 가리켜 명시적 Intent, 암시적 Intent라고 합니다. A 액티비티를 실행하라는 것은 의도가 명확합니다. 그래서 명시적 Intent에 해당됩니다. 하지만 어떤 사이트에 접속하라라는 것은 실행할 수 있는 브라우저 앱, 인터넷을 열 수 있는 앱이 여러 가지이기 때문에 명확하지 않습니다. 이런 경우는 암시적 Intent라고 볼 수 있습니다.

 

Intent의 사용

먼저 액티비티를 전환할 때 사용됩니다. (이는 명시적 Intent입니다.)

var intent = Intent(this, targetActivity::class.java)
startActivity(intent)

여기서 사용된 것은 Intent(packageContext: Context! , cls: Class<*>!)입니다. 클래스(두 번째 파라미터)가 있고, 해당 클래스를 어디에서 구현할지 콘텍스트(첫 번째 파라미터)를 설정해 줘야 합니다. 위 코드에서는 targetActivity 클래스를 여기(this)에서 구현하는 의도를 intent 변수에 저장합니다. 이런 의도를 실행하려면 startActivity() 함수로 실행해 주면 앱의 액티비티가 전환이 되게 됩니다. intent를 이해하기 쉽도록 풀어서 작성해 봤습니다.

 

액티비티간에 값 전달할 때도 사용됩니다. (이는 명시적 Intent 입니다.)

class MainActivity: AppCompatActivity() {
	override fun onCreate(savedInstanceState: Bundle?) {
    	super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        
        val intent = Intent(this, SubActivity::class.java)
        intent.putExtra("key", "value")
        
        startActivity(intent)
    }
}

지금 콘텍스트에서 구현할 SubActivity 클래스로의 의도를 intent 변수로 설정하였고, 이 intent 변수로 putExtra 함수로 데이터를 전달합니다. 데이터는 Key 값과 그에 해당하는 value 값으로 되어 있습니다. 그리고 startActivity(intent)로 액티비티를 전환합니다. 안드로이드 공식 설명에 따르면 putExtra는 intent에 데이터를 추가하는 것입니다.

 

class SubActivity: AppCompatActivity() {
	override fun onCreate(savedInstanceState: Bundle?) {
    	super.onCreate(saveInstanceState)
        setContentView(R.layout.activity_sub)
        
        var recValue = intent.getStringExtra("Key")
        
        Log.d("test","value : " + recValue)
    }
}

이제 넘어간 액티비티에서 intent에서 값을 가져옵니다. 첫 번째에 String으로 전달하였으니 String으로 가져옵니다. 전달한 값에 따라 Int, Long, String, Bool 등 여러 가지를 사용할 수 있습니다.

 

또한 어떤 작업(액션)에 대한 것을 담을 수도 있습니다. (이는 암시적 Intent 입니다.)

var intent = Intent(Intent.ACTION_VIEW, Uri.parse("http://www.google.com"))
startActivity(intent)

여기에서 사용된 것은 Intent(action: String!, uri: Uir!)입니다. 작업할 액션과 uri를 파라미터로 설정해야 합니다. 여기에서는 자주 사용되는 ACTION_VIEW를 예시로 하였습니다. 이에 대한 공식 설명으로는 사용자에게 데이터를 보여주는 액션을 뜻합니다. 이는 작업을 어떤 앱으로 사용하게 할지 명확하지 않아 암시적 Intent라고 볼 수 있습니다.

 

※ 액션의 종류에는 https://developer.android.com/reference/kotlin/android/content/Intent?hl=ko#constants 의 링크를 참조하시면 아주 많은 것들을 확인할 수 있습니다. 

 

※ Intent 함수의 종류는 6개가 있으며, https://developer.android.com/reference/android/content/Intent?hl=ko#public-constructors 의 링크에서 확인할 수 있습니다.