본문 바로가기

Android

[Android] Intent (명시적, 암시적)

728x90

Intent

인텐트는 안드로이드 런타임에서 메시지를 주고받아 앱 구성요소로 부터 작업을 요청하는데 사용되는 일종의 메시지 객체라고 볼 수 있습니다.

 

앱이 처음 시작되면 안드로이드 런타임은 인텐트AndroidMenifest.xml에 정의된 앱의 메인 액티비티에 전달합니다.

 

1. 액티비티 시작하기

Activity의 새 인스턴스를 시작하기 위해선 새로 시작할 activity의 정보를 담은 Intent를 멤버함수인 startActivity()로 전달하면 됩니다.

 

Activity가 finish 되었을 때 startActivityForResult()를 호출하면 finish 될 액티비티는 결과를 수신받을 액티비티의 콜백 함수인 onActivityResult()에 수신합니다.

 

2. 서비스 시작하기

UI 없이 백그라운드에서 작업을 수행하는 서비스는 JobScheduler로 시작할 수 있습니다.

 

3. 브로드캐스트 전달

시스템 이벤트에 대한 다양한 브로드캐스트를 전달할 수 있습니다.


Explicit intent(명시적 인텐트)

명시적 인텐트는 일반적으로 앱에서 Acitvity나 Service같은 구성요소를 시작할 때 사용되며, 실행하고자 하는 Acitvity 또는 Service의 class name을 사용하는 형태를 의미합니다.

Implicit intent(암시적 인텐트)

암시적 인텐트는 특정 구성 요소의 class name을 알아야 할 필요는 없지만 수행할 작업을 선언하여 다른 앱의 구성 요소가 이를 처리할 수 있도록 할 때 사용하는 인텐트입니다.

 

암시적 인텐트의 동작원리를 예를들어 설명하자면, Main Activity가 생성하여 IntentstartActivity()에 넣어 Android System에 전달하고, Android System이 기기에 설치된 모든 앱에서 해당 Intent와 일치하는 AndroidMenifest.xml에 선언된 Intent Filter를 검색하여 일치하는 항목을 찾아 해당 ActivityonCreate()를 호출하여 Intent를 전달하고 실행하게 되는데, 일치하는 Intent Filter가 여러 앱에 존재하는 경우 Android System에서 대화상자를 통해 선택할 수 있게 해줍니다.

 

tip : Activity에 대한 Intent Filter가 선언되지 않은 경우 해당 Activity는 다른 앱에 의해 시작될 수 없고, 보안을 위해 Service를 암시적 인텐트를 이용해 호출하지 않는 것이 좋습니다.

<Intent-filter>

인텐트 필터 정보는 안드로이드 시스템에 제공하는 정보로 A 앱에서 B 앱의 액티비티 호출할 수 있도록 필요한 정보를 담고있습니다.

 

A라는 App에 SubActivity를 생성하게되면 아래와 같은 내용이 AndroidMenifest.xml에 추가됩니다.

   <activity android:name=".SubActivity3">
        <intent-filter>
            <action android:name="implicit.intent.action.TEST" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.APP_BROWSER" />
            <category android:name="android.intent.category.APP_CALCULATOR" />
        </intent-filter>
    </activity>
    <activity android:name=".SubActivity2">
        <intent-filter>
            <action android:name="implicit.intent.action.TEST" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.APP_BROWSER" />
        </intent-filter>
    </activity>
    <activity android:name=".SubActivity">
        <intent-filter>
            <action android:name="implicit.intent.action.TEST" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>

<action> : 액티비티의 기능 유형을 의미하는 것으로 현재 액티비티가 어떤 인텐트 요청에 동작하도록 할 것인지를 결정합니다.

 

<category> : 액티비티에 대한 추가 정보로, 액티비티의 범주를 의미합니다. LAUNCHER, BROWSABLE, TAB, HOME 등이 있습니다.

 

<data> : 액티비티를 실행하기 위해 필요한 데이터에 대한 정보를 의미합니다. data는 URL 형식으로 표현되고, scheme, host, port, mimeType 등으로 구분하여 선언합니다.

 

B라는 App에서 아래와 다른 <action>은 같지만 다른 <category>의 <intent-filter>를 검색하도록 해봅시다.

//testcase1
class MainActivity : AppCompatActivity() {
    val TAG = MainActivity::class.simpleName

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val intent = Intent("implicit.intent.action.TEST")
        intent.addCategory(Intent.CATEGORY_DEFAULT)
        startActivity(intent)
    }
}
//testcase2
class MainActivity : AppCompatActivity() {
    val TAG = MainActivity::class.simpleName

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val intent2 = Intent("implicit.intent.action.TEST")
        intent2.addCategory(Intent.CATEGORY_DEFAULT)
        intent2.addCategory(Intent.CATEGORY_APP_BROWSER)
        startActivity(intent2)
    }
}
//testcase3
class MainActivity : AppCompatActivity() {
    val TAG = MainActivity::class.simpleName

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val intent3 = Intent("implicit.intent.action.TEST")
        intent3.addCategory(Intent.CATEGORY_DEFAULT)
        intent3.addCategory(Intent.CATEGORY_APP_BROWSER)
        intent3.addCategory(Intent.CATEGORY_APP_CALCULATOR)
        startActivity(intent3)
    }
}
testcase1 일치하는 Intent Filter가 3개가 있어 AndroidSystem에서 대화상자를 통해 선택하도록 합니다.
testcase2 일치하는 Intent Filter가 2개가 있어 AndroidSystem에서 대화상자를 통해 선택하도록 합니다.
testcase3 일치하는 Intent Filter가 유일하기 때문에 SubActivity3가 호출됩니다.