[kotlin] TIL; Intent

๊ฒฐยท2023๋…„ 12์›” 5์ผ
0

Mobile-Software

๋ชฉ๋ก ๋ณด๊ธฐ
1/15
post-thumbnail

์• ํ”Œ๋ฆฌ์ผ€์…˜๋“ค์€ ํ•œ ๊ฐœ ์ด์ƒ์˜ ์•กํ‹ฐ๋น„ํ‹ฐ๋“ค๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋ฉฐ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์•ˆ์—์„œ ์•กํ‹ฐ๋น„ํ‹ฐ๋“ค์€ ๋А์Šจํ•˜๊ฒŒ ์—ฐ๊ฒฐ๋˜์–ด์žˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ ์•กํ‹ฐ๋น„ํ‹ฐ์—์„œ ๋‘ ๋ฒˆ์งธ ์•กํ‹ฐ๋น„ํ‹ฐ๋กœ ์ „ํ™”ํ•˜๋ ค๋ฉด? intents ์ด์šฉ
Intents are the messageing system by which onen activity is able to launch another activity.

An intent is an abstract description of an operation to be performed.

  • startActivity to launch an Activity
  • sendBroadcast to send it to any interested BroadcastReceiver components
  • starService(Intent) or
  • bindService(Intent, ServiceConnection, flags) to communication with a background Service

intent ๊ฐ์ฒด์— bundle ํƒ€์ž… data ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค.



Intent ์ข…๋ฅ˜

  • Explicit intent ๋ช…์‹œ์  ์ธํ…ํŠธ
    ๊ตฌ์ฒด์ ์œผ๋กœ ์ง€์ •
    "์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ A์˜ ์ปดํฌ๋„ŒํŠธ B ๋ฅผ ์ž‘๋™์‹œ์ผœ๋ผ"

  • Implicit intent ์•”์‹œ์  ์ธํ…ํŠธ
    ๊ธฐ๋ณธ ์กฐ๊ฑด๋งŒ ์ง€์ •
    "์ง€๋„๋ฅผ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋Š” ์ปดํฌํ„ดํŠธ๋ผ๋ฉด ์–ด๋–ค ๊ฑฐ๋ผ๋„ ๊ดœ์ฐฎ์•„!"



1. SubActivity ์ƒ์„ฑ


2.

Manifest ํŒŒ์ผ์— ์ปดํฌ๋„ŒํŠธ์— ๊ด€ํ•œ ์ƒ์„ธ ์ •๋ณด๋ฅผ ๋“ฑ๋ก

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.intentsample">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.IntentSample">
      
      <!-- App. ์— ๋“ฑ๋ก๋œ 2๊ฐœ์˜ ์ปดํฌ๋„ŒํŠธ => ๋ชจ๋‘ ์•กํ‹ฐ๋น„ํ‹ฐ -->
        <activity
            android:name=".SubActivity"
            android:exported="true" />
      <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
              	<!-- MainActivity ๋ฅผ ๊ฐ€์žฅ ๋จผ์ € ์‹คํ–‰ -->  
                <action android:name="android.intent.action.MAIN" />
				<!-- ๋ฐ”ํƒ•ํ™”๋ฉด์— App.Launcher Icon ์œผ๋กœ ๋‚˜ํƒ€๋‚˜์•ผํ•จ -->  
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>



3. Explicit intent

์‹คํ–‰ํ•˜๊ณ ์ž ํ•˜๋Š” ์•กํ‹ฐ๋น„ํ‹ฐ ์ด๋ฆ„์„ ์ง€์ •
this => MainActivity
SubActivity::class.java
=> ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ ์„ญ์•กํ‹ฐ๋น„ํ‹ฐ ํด๋ž˜์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ด. ์ฆ‰, ์„ญ์•กํ‹ฐ๋น„ํ‹ฐ ํด๋ž˜์Šค ์ •๋ณด๋ฅผ ์ถ”์ถœํ•  ๋•Œ ์‹œ์ž‘์ ์ด ๋จ : reflection

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


  • MainActivity
class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        binding.button.setOnClickListener {
            val intent = Intent(this, SubActivity::class.java)
            startActivity(intent)
        }
    }

  • SubActivity
class SubActivity : AppCompatActivity() {
    private lateinit var binding: ActivitySubBinding
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivitySubBinding.inflate(layoutInflater)
        setContentView(binding.root)
		
        // Activity stack ์—์„œ SubActivity ์ œ๊ฑฐ
        // -> MainActivity ๊ฐ€ ์Šคํƒ์—์„œ ์‚ฌ๋ผ์ง€์ง€ ์•Š๋Š” ์ด์ƒ ๋‹ค์‹œ ํ™œ์„ฑํ™”
        binding.button.setOnClickListner {
        	finish()
        }
   }
}



Extra ์†์„ฑ์„ ์‚ฌ์šฉํ•œ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ

Extra : intent ์— ํฌํ•จ๋˜์–ด ์ „๋‹ฌ๋˜๋Š” ๋ฐ์ดํ„ฐ

  • key-value ์Œ์˜ ํ˜•ํƒœ๋กœ Extra ์— ์ถ”๊ฐ€
  • Key ๋งŒ์„ ์‚ฌ์šฉํ•ด value ์„ ๊ฐ€์ ธ์˜ค๊ธฐ ๋–„๋ฌธ์— value ์˜ ํƒ€์ž…์„ ์•Œ์•„์•ผํ•จ
  • ๋ฐ์ดํ„ฐ ์ „๋‹ฌ
intent.putExtra()
  • ๋ฐ์ดํ„ฐ ๋ฐ›๊ธฐ
intent.getInExtra(key, value)

  • MainActivity
// ํด๋ž˜์Šค ๋ฐ–์—์„œ ์„ ์–ธํ•œ ๋ฌธ์ž์—ด
// SubActivity ์—์„œ๋„ ์ฐธ์กฐ ๊ฐ€๋Šฅ
const val MY_STRING = "my_string"
const val MY_INT = "my_int"

class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        binding.button.setOnClickListener {
            val intent = Intent(this, SubActivity::class.java)
            val str = binding.editText.text.toString()
            
            // Intent ๊ฐ์ฒด์— ๋ฉ”์‹œ์ง€๋ฅผ ํฌํ•จํ•ด ์ „๋‹ฌ 
            intent.putExtra(MY_STRING, str)
            intent.putExtra(MY_INT, 13)
            startForResult.launch(intent)
        }
    }

  • Subactivity
class SubActivity : AppCompatActivity() {
    private lateinit var binding: ActivitySubBinding
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivitySubBinding.inflate(layoutInflater)
        setContentView(binding.root)     
        
		// if ์กฐ๊ฑด๋ฌธ์ด null ์ด๋ฉด,
        // Extra ์—์„œ String ๊ณผ Int ๊ฐ’์„ ๊ฐ€์ ธ์˜ด
        if (intent.extras == null || intent == null) return
         val qString: String? = intent.getStringExtra(MY_STRING)
         val qInt: Int = intent.getIntExtra(MY_INT, 0)
         binding.editText.setText(qString + qInt.toString())
         
         
         // ์œ„์˜ ์ฝ”๋“œ ๋ธ”๋ก๊ณผ ๊ฐ™์€ ๋‚ด์šฉ
		// ์ธํ…ํŠธ ๊ฐ์ฒด๊ฐ€ ๋ถ€๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ ํฌํ•จํ•˜๋Š”์ง€ ํ™•์ธ
        if(intent.hasExtra(MY_STRING) && intent.hasExtra(MY_INT))
        {
        	// Elvis ์—ฐ์‚ฐ์„ ์‚ฌ์šฉํ•œ Null safe ๊ฒ€์‚ฌ
            // extras ์˜ ํƒ€์ž…์€ Bundle ๋กœ getString() ์‚ฌ์šฉ
            val extras: Bundle? = intent.extras ?: return
            val qString = extras?.getString(MY_STRING)
            val qInt = extras?.getInt(MY_INT)
            binding.editText.setText("$qString $qInt")
        }

        binding.button.setOnClickListener {
           finish()
        }
    }
}

 if (intent.extras == null || intent == null) return
val extras: Bundle? = intent.extras ?: return
extras = intent.extras if intent.extras != nullextras = null if intent.extras == null



Activity ๋กœ๋ถ€ํ„ฐ ๊ฒฐ๊ณผ ๋Œ๋ ค๋ฐ›๊ธฐ

์•กํ‹ฐ๋น„ํ‹ฐ ์‚ฌ์ด์˜ ์ž‘์—…์€ ์–‘๋ฐฉํ–ฅ ์ž‘์—…


  • MainActivity

startForResult.launch(intent) -> ๋‹จ์ˆœํžˆ ์•กํ‹ฐ๋น„ํ‹ฐ ์ „ํ™˜์ด ์•„๋‹Œ ๊ฒฐ๊ณผ๋ฅผ ๋Œ๋ ค๋ฐ›๊ธฐ ์œ„ํ•œ ์•กํ‹ฐ๋น„ํ‹ฐ ํ˜ธ์ถœ
startForResult -> ๊ฒฐ๊ณผ ๋Œ๋ ค๋ฐ›์•˜์„ ๋•Œ ์ฒ˜๋ฆฌํ•  ๋ฉ”์†Œ๋“œ ์ •์˜

package com.example.intentsample

import android.app.Activity
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.activity.result.ActivityResult
import androidx.activity.result.ActivityResultCallback
import androidx.activity.result.contract.ActivityResultContracts
import com.example.intentsample.databinding.ActivityMainBinding

const val MY_STRING = "my_string"
const val MY_INT = "my_int"
const val RETURN_MESSAGE = "com.example.intent sample.RETURN_MESSAGE"

class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        binding.button.setOnClickListener {
            val intent = Intent(this, SubActivity::class.java)
            val str = binding.editText.text.toString()
            intent.putExtra(MY_STRING, str)
            intent.putExtra(MY_INT, 13)
            startForResult.launch(intent)
        }
    }

    private val startForResult = registerForActivityResult(
        ActivityResultContracts.StartActivityForResult(),
        object : ActivityResultCallback<ActivityResult> {
            override fun onActivityResult(result: ActivityResult?) {
                if (result?.resultCode == Activity.RESULT_OK) {
                    if (result.data != null) {
                        val extras: Bundle? = result.data!!.extras
                        val returnStr =
                            extras?.getString(RETURN_MESSAGE) ?: ""
                        binding.editText.setText(returnStr)
                    }
                }
            }
        }
    )
}

  • SubActivity
package com.example.intentsample

import android.app.Activity
import android.content.Intent
import android.os.Build.VERSION_CODES.M
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.example.intentsample.databinding.ActivityMainBinding
import com.example.intentsample.databinding.ActivitySubBinding

class SubActivity : AppCompatActivity() {
    private lateinit var binding: ActivitySubBinding
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivitySubBinding.inflate(layoutInflater)
        setContentView(binding.root)

        if (intent.extras == null || intent == null) return
        /*
         val qString: String? = intent.getStringExtra(MY_STRING)
         val qInt: Int = intent.getIntExtra(MY_INT, 0)
         binding.editText.setText(qString + qInt.toString())
        */
        if(intent.hasExtra(MY_STRING) && intent.hasExtra(MY_INT))
        {
            val extras: Bundle? = intent.extras ?: return
            val qString = extras?.getString(MY_STRING)
            val qInt = extras?.getInt(MY_INT)
            binding.editText.setText("$qString $qInt")
        }

        binding.button.setOnClickListener {
           // ๊ฒฐ๊ณผ๋ฅผ bundle ๊ฐ์ฒด๋กœ ์ƒ์„ฑ -> Intent ๊ฐ์ฒด์— ์‹ค์–ด๋ณด๋ƒ„
            val returnStr = binding.editText.text.toString()
            val data = Intent()
            data.putExtra(RETURN_MESSAGE, returnStr)
            setResult(Activity.RESULT_OK, data)
            finish()
        }
    }
}




https://velog.io/@soyoung-dev/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%95%A1%ED%8B%B0%EB%B9%84%ED%8B%B0-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A0%84%EB%8B%AC

https://pangseyoung.tistory.com/entry/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%95%A1%ED%8B%B0%EB%B9%84%ED%8B%B0%EA%B0%84-%ED%99%94%EB%A9%B4-%EC%A0%84%ED%99%98-%EB%B0%8F-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A0%84%EB%8B%AC-Intent-Kotlin



0๊ฐœ์˜ ๋Œ“๊ธ€

Powered by GraphCDN, the GraphQL CDN