인텐트를 액태비티 전환 작업을 위해서 많이 써보았다. 그런데 인텐트가 정확히 무엇인지에 대해서 알아본 적이 없었다. 그래서 인텐트에 대해서 정확히 알아보고자 한다.
인텐트는 메시징 객체 이다. 메시징 객체는 통신을 위한 객체이다. 즉, 인텐트를 통해서 다른 앱 구성요소로 메시지를 통해 요청을 전달할 수 있다. 이전에 앱 구성 요소 포스트에서 정리했었는데 앱 구성요소는 액티비티, 서비스, 브로드캐스트 리시버, 콘텐츠 프로바이더 총 4가지로 이루어져 있다고 했다. 인텐트는 구성요소 4가지 전부에 대해서 통신을 할 수 있는 것은 아니다. 인텐트로 통신을 할 수 있는 구성요소는 콘텐츠 프로바이더를 제외한 액티비티, 서비스, 브로드 캐스트 리시버이다.
인텐트를 사용해서 액티비티를 시작할 수 있다. 인텐트 객체에 시작할 액티비티 클래스 정보를 담은 후에, startActivity() 함수를 통해서 새로운 액티비티를 시작시킬 수 있다.
val intent = Intent(this@MainActivity, NextActivity::class.java)
startActivity(intent)
인텐트는 액티비티와 마찬가지로 서비스를 시작시켜서 백그라운드 작업을 시작시킬 수 있다. 시작할 서비스 클래스 정보를 담은 후에, startService() 함수를 통해서 새로운 서비스를 시작시킬 수 있다.
val downloadIntent = Intent(this, DownloadService::class.java).apply {
data = Uri.parse(fileUrl)
}
startService(downloadIntent)
브로드캐스트는 말 그대로 모든 앱에 대해 메시지를 전달하는 것이다. 어떠한 이벤트에 대해서 브로드캐스트 메시지를 전달하면 특정한 앱은 그 이벤트에 대해서 수신하여 동작을 처리할 수 있다. Intent 객체를 생성한 후에 sendBroadcast(), sendOrderedBroadcast() 함수를 통해서 메시지 전달이 가능하다.
명시적 인텐트는 메시지를 전달할 대상을 명시적으로 정의하겠다는 것이다.
val intent = Intent(this@MainActivity, NextActivity::class.java)
startActivity(intent)~~텍스트~~
이러한 형태의 인텐트는 메시지를 전달할 대상을 NextActivity라는 특정한 액티비티로 지정했기 때문에 명시적 인텐트라고 할 수 있다.
암시적 인텐트는 명시적 인텐트와는 달리, 전달 객체에 대해서 특정한 구성요소를 지정하지 않는다. 대신 특정한 작업을 지정하여, 지정한 작업을 수행할 수 있는 구성요소에 요청을 할 수 있다.
암시적 인텐트가 액티비티를 시작하는 과정의 그림이다. 특정한 작업을 지정한 인텐트를 가지고 startActivity() 함수를 호출하면, 안드로이드 시스템이 지정한 인텐트의 조건을 만족하는 액티비티를 찾아서 인텐트를 전달하고 액티비티를 실행시킨다.
암시적 인텐트에서 인텐트의 조건을 만족시키는지 확인하기 위해서 인텐트 필터 를 확인한다. 인텐트 필터는 말 그대로 조건을 만족하는지 확인하고, 필터링을 해주는 역할을 하는 존재로서 해당 구성요소가 수신하고자 하는 인텐트 유형을 나타낸다. 메니페스트 파일을 확인하면 앱 구성요소에 인텐트 필터가 존재하는 것을 확인할 수 있다. 시스템은 메니페스트 파일에 정의된 인텐트 필터를 통해서 요청할 구성요소를 찾을 수 있는 것이다.만약에 조건을 만족하는 구성 요소가 여러 개인 경우에는 사용자가 어느 구성요소를 사용할 지 선택할 수 있다.
<activity android:name="ShareActivity">
<intent-filter>
<action android:name="android.intent.action.SEND"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="text/plain"/>
</intent-filter>
</activity>
이 중에서 사용해본 것은 구성요소 이름과 엑스트라(Extra)이다. 구성요소 이름은 NextActivity::class.java 와 같이 명시적으로 전달할 컴포넌트를 말한다. 엑스트라는 요청된 작업을 수행하는 데 필요한 추가 정보를 담은 키-값 쌍이다. putExtra() 함수를 통해서 추가 정보를 담을 수 있다.
다른 구성요소들에 대해서는 다음에 제대로 알아보겠다!
참고 자료 : https://developer.android.com/guide/components/intents-filters?hl=ko