📋 Screens, Lists और Navigation · Lesson 21
Activities के बीच Data भेजें
Extras से simple values भेजें
Intent key–value pairs ले जा सकता है जिन्हें extras कहते हैं: String, Int, Boolean, Double, arrays और Parcelable objects।
Kotlin – sender
// MainActivity.kt
binding.btnOpen.setOnClickListener {
val intent = Intent(this, ProfileActivity::class.java).apply {
putExtra("name", "Riya Sharma")
putExtra("marks", 92)
putExtra("isTopper", true)
}
startActivity(intent)
}दूसरी screen में पढ़ें
Kotlin – receiver
// ProfileActivity.kt
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityProfileBinding.inflate(layoutInflater)
setContentView(binding.root)
val name = intent.getStringExtra("name") ?: "Unknown" // String? → default
val marks = intent.getIntExtra("marks", 0) // default if missing
val isTopper = intent.getBooleanExtra("isTopper", false)
binding.tvName.text = name
binding.tvMarks.text = "Marks: $marks"
binding.tvBadge.isVisible = isTopper
}Keys एक जगह रखें
Kotlin – companion object factory
class ProfileActivity : AppCompatActivity() {
companion object {
const val EXTRA_NAME = "extra_name"
const val EXTRA_MARKS = "extra_marks"
// a "factory" – callers cannot forget a key
fun newIntent(context: Context, name: String, marks: Int) =
Intent(context, ProfileActivity::class.java)
.putExtra(EXTRA_NAME, name)
.putExtra(EXTRA_MARKS, marks)
}
}
// caller
startActivity(ProfileActivity.newIntent(this, "Riya Sharma", 92))पूरा object भेजें (@Parcelize)
Kotlin DSL – plugin enable करें
// app/build.gradle.kts
plugins {
alias(libs.plugins.android.application)
alias(libs.plugins.kotlin.android)
id("kotlin-parcelize") // add this line
}Kotlin
import android.os.Parcelable
import kotlinx.parcelize.Parcelize
@Parcelize
data class Student(val id: Int, val name: String, val marks: Int, val city: String) : Parcelable
// send
val student = Student(7, "Aman Verma", 88, "Aligarh")
startActivity(Intent(this, ProfileActivity::class.java).putExtra("student", student))
// receive (API 33+ has a type-safe version; IntentCompat works on all versions)
val s: Student? = IntentCompat.getParcelableExtra(intent, "student", Student::class.java)
binding.tvName.text = s?.nameResult वापस पाएँ
Kotlin – Activity Result API
// MainActivity – open the editor and wait for the new name
private val editName = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
if (result.resultCode == RESULT_OK) {
val newName = result.data?.getStringExtra("new_name")
binding.tvName.text = newName
}
}
binding.btnEdit.setOnClickListener {
editName.launch(Intent(this, EditNameActivity::class.java).putExtra("old_name", binding.tvName.text.toString()))
}
// EditNameActivity – send the result back
binding.etName.setText(intent.getStringExtra("old_name"))
binding.btnSave.setOnClickListener {
val data = Intent().putExtra("new_name", binding.etName.text.toString())
setResult(RESULT_OK, data)
finish()
}पूरा round trip
आम गलतियाँ
- Key में typo (
"Name"vs"name") → value null। Constants use करें। - गलत type से extras पढ़ना (Int के लिए
getStringExtra) → null/default। - Click listener के अंदर
registerForActivityResultcall करना → crash; इसे property की तरह register करें (Activity start होने से पहले)। - बड़ी lists/bitmaps भेजना →
TransactionTooLargeException।
सारांश
putExtra(key, value)→getXxxExtra(key, default)।- Objects:
@Parcelize data class … : Parcelable। - Results:
registerForActivityResult+setResult+finish()।
✅ Practice
3 students की list बनाइए। किसी एक पर tap करने से Parcelable Student के साथ ProfileActivity खुले। "Edit marks" button जोड़िए जो नए marks list screen को लौटाए।
अक्सर पूछे जाने वाले प्रश्न (FAQ)
क्या startActivityForResult अब भी use होता है?
यह deprecated है। ActivityResultContracts.StartActivityForResult (या कोई specific contract) के साथ registerForActivityResult use करें। यह lifecycle-safe और test करने में आसान है।
क्या Intent से बड़ी list भेज सकते हैं?
नहीं। Intent bundle की size limit है (लगभग 1 MB shared)। एक id भेजें और अगली screen में database या shared ViewModel से data load करें।
Parcelable या Serializable?
Android पर Parcelable तेज़ है और kotlin-parcelize plugin के साथ सिर्फ़ एक annotation चाहिए। इसे ही use करें।
