์ ํ๋ฆฌ์ผ์ ๋ค์ ํ ๊ฐ ์ด์์ ์กํฐ๋นํฐ๋ค๋ก ๊ตฌ์ฑ๋์ด ์์ผ๋ฉฐ, ์ ํ๋ฆฌ์ผ์ด์ ์์์ ์กํฐ๋นํฐ๋ค์ ๋์จํ๊ฒ ์ฐ๊ฒฐ๋์ด์๋ค.
์ฒซ ๋ฒ์งธ ์กํฐ๋นํฐ์์ ๋ ๋ฒ์งธ ์กํฐ๋นํฐ๋ก ์ ํํ๋ ค๋ฉด? 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 ActivitysendBroadcast
to send it to any interested BroadcastReceiver componentsstarService
(Intent) orbindService
(Intent, ServiceConnection, flags) to communication with a background Serviceintent ๊ฐ์ฒด์ bundle ํ์ data ๋ฅผ ์ ๋ฌํ ์ ์๋ค.
Explicit intent ๋ช
์์ ์ธํ
ํธ
๊ตฌ์ฒด์ ์ผ๋ก ์ง์
"์ ํ๋ฆฌ์ผ์ด์
A์ ์ปดํฌ๋ํธ B ๋ฅผ ์๋์์ผ๋ผ"
Implicit intent ์์์ ์ธํ
ํธ
๊ธฐ๋ณธ ์กฐ๊ฑด๋ง ์ง์
"์ง๋๋ฅผ ๋ณด์ฌ์ค ์ ์๋ ์ปดํฌํดํธ๋ผ๋ฉด ์ด๋ค ๊ฑฐ๋ผ๋ ๊ด์ฐฎ์!"
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>
์คํํ๊ณ ์ ํ๋ ์กํฐ๋นํฐ ์ด๋ฆ์ ์ง์
this
=> MainActivity
SubActivity::class.java
=> ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋ ์ญ์กํฐ๋นํฐ ํด๋์ค๋ฅผ ๊ฐ๋ฆฌํด. ์ฆ, ์ญ์กํฐ๋นํฐ ํด๋์ค ์ ๋ณด๋ฅผ ์ถ์ถํ ๋ ์์์ ์ด ๋จ : reflection
var intent = Intent(this, SubActivity::class.java)
startActivity(intent)
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)
}
}
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 : intent ์ ํฌํจ๋์ด ์ ๋ฌ๋๋ ๋ฐ์ดํฐ
- key-value ์์ ํํ๋ก Extra ์ ์ถ๊ฐ
- Key ๋ง์ ์ฌ์ฉํด value ์ ๊ฐ์ ธ์ค๊ธฐ ๋๋ฌธ์ value ์ ํ์ ์ ์์์ผํจ
- ๋ฐ์ดํฐ ์ ๋ฌ
intent.putExtra()
- ๋ฐ์ดํฐ ๋ฐ๊ธฐ
intent.getInExtra(key, value)
// ํด๋์ค ๋ฐ์์ ์ ์ธํ ๋ฌธ์์ด
// 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)
}
}
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
์กํฐ๋นํฐ ์ฌ์ด์ ์์
์ ์๋ฐฉํฅ ์์
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)
}
}
}
}
)
}
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()
}
}
}