개발일지

Android in A..Z - Intent 본문

Android (안드로이드)

Android in A..Z - Intent

강태종 2021. 8. 30. 12:53

Intent

Intent는 Android에서 메시지를 전달하는 객체입니다. 주로 Activitiy, Service, Broadcast같은 Android 요소들 사이에서 메시지를 전달하는 역할을 수행합니다.

위 그림은 startActivity를 처리하는 과정입니다. Activity나 Service같은 Android 요소들은 직접 생성해서 사용하는 것이 아닌 Intent를 통해 Android Framework에 요청하여 사용하게 됩니다. 요청할 때 Intent에 데이터를 넣어서 보낼 수 있습니다.


인텐트 유형

  • 명시적 인텐트 : Intent를 처리할 요소를 명시적으로 정하는 방식입니다. Context와 처리할 요소의 정보(패키지명, 클래스 이름)를 명시적으로 정하여 인텐트를 전송합니다.
  • 암시적 인텐트 : Intent를 처리할 요소를 정하지는 않지만 어떤 요소에 전달할지 Action, Category, Type, Data등을 정해서 인텐트를 전송합니다. 인텐트를 처리할 때 해당 조건에 맞는 요소를 사용자가 직접 선택할 수 있습니다. (ex 파일 선택을 하는 Intent를 전송할 때 파일 선택할 수 있는 어플이 여러개면 사용자가 직접 고를 수 있다.)

인텐트 구성요소

Component Name

구성요소 이름, 명시적 인텐트로 전송할 때 사용합니다. 보통 같은 앱안에서 Activity나 Service같이 이름을 알거나, 특정 요소에 전달할 때 사용합니다.

Intent(this, MainActivity::class.java)

 

Action

암시적 인텐트를 전송할 때 넣는 값으로 해당 Action을 처리할 수 있는 요소에게 Intent를 보냅니다. 보통 기존의 정의된 Action을 사용합니다. 하지만 사용자가 String 형식으로 새로운 Acion을 정의할 수 있습니다.

* AndroidManifest에서 Intent-Filter를 사용해서 Action을 처리할 수 있다고 정의할 수 있습니다.

* Intent Action Constant ( https://developer.android.com/reference/android/content/Intent?hl=ko#constants_1)

* Setting Action Constant ( https://developer.android.com/reference/android/provider/Settings?hl=ko#constants_1)

Intent(Intent.ACTION_CALL)

Data

작업을 수행할 때 참조하는 데이터의 Uri입니다. 예를들어 ACTION_EDIT인 경우 편집할 데이터의 Uri가 들어가야 합니다.

* Data와 MIME Type을 설정하려면 setDataAndType()을 호출해야 합니다.

Intent().apply {
    data = Uri.parse("tel:01012345678")
}
Intent().apply { 
    type = "text/*"
}
Intent().apply { 
    setDataAndType(Uri.parse("Something"), "Something")
}

Category

Intent를 수신하는 요소의 Category다. CATEGORY_LAUNCHER, CATEGORY_BROWSER 등이 있습니다.

Intent().apply { 
    addCategory(Intent.CATEGORY_DEFAULT)
    removeCategory(Intent.CATEGORY_DEFAULT)
}

Extra

메시지를 보낼 때 데이터를 같이 보내야 하는 경우가 있습니다. Extra를 통해 Key-Value 형식으로 추가할 수 있습니다.

Serializable이나 Parceble 객체도 보낼 수 있습니다.

Intent().apply { 
    putExtra(Intent.EXTRA_TEXT, "Text")
    putExtra("hi", "hello")
}

 

Flag

Flag를 설정하여 Android Framework가 어떻게 처리할지 설정할 수 있다.

Intent().apply { 
    addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
    addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
}

Chooser

Intent를 처리할 수 있는 Component가 여러개 있을 때 고르는 창이 나타난다.

* startActivity를 할 때 연결할 수 있는 구성 요소가 없으면 Exception이 발생된다. resolveActivity()가 null인지 확인하여 연결할 수 있는 요소가 있는지 알 수 있다.

Intent("com.taetae98.action.EDIT").apply {
    addCategory(Intent.CATEGORY_DEFAULT)
    type = "text/*"
}.also {
    if (it.resolveActivity(packageManager) != null) {
        resultToGetString.launch(it)
        resultToGetString.launch(Intent.createChooser(it, "Halo"))
    } else {
        Toast.makeText(this, "There is no available application.", Toast.LENGTH_SHORT).show()
    }
}

Intent-Filter

AndroidManifest.xml에서 Intent-Filter를 설정하여 Intent의 Action을 처리할 수 있다.

        <activity
            android:name=".CategoryActivity"
            android:label="Category"
            android:exported="true">
            <intent-filter>
                <action android:name="com.taetae98.action.EDIT" />

                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="com.taetae98.category" />
                // Optional
                <data android:mimeType="text/*" />
            </intent-filter>
        </activity>
        <activity
            android:name=".NumberInputActivity"
            android:exported="true"
            android:label="Number">
            <intent-filter>
                <action android:name="com.taetae98.action.EDIT" />

                <category android:name="android.intent.category.DEFAULT" />
                // Optional
                <data android:mimeType="text/*" />
            </intent-filter>
        </activity>
        <activity
            android:name=".TextInputActivity"
            android:exported="true"
            android:label="Text">
            <intent-filter>
                <action android:name="com.taetae98.action.EDIT" />

                <category android:name="android.intent.category.DEFAULT" />
                // Optional
                <data android:mimeType="text/*" />
            </intent-filter>

Git (예제코드)

https://github.com/KangTaeJong98/Example/tree/main/Android/Intent

 

GitHub - KangTaeJong98/Example: My Example Code

My Example Code. Contribute to KangTaeJong98/Example development by creating an account on GitHub.

github.com

 

'Android (안드로이드)' 카테고리의 다른 글

Android in A..Z - Span  (0) 2021.09.16
Android in A..Z - Module 베포 (Jitpack)  (0) 2021.09.02
Android In A..Z - Google API (Google Map)  (0) 2021.08.18
Android in A..Z - WebView Bridge  (0) 2021.08.05
Android in A..Z - Flow  (0) 2021.08.05
Comments