我想在我的PlayerDetails.kt
活动中创建一个数据类实例,然后能够在另一个活动中访问其数据。
我这样做是因为我不想经常使用Intent.putString
,Intent.putInt
或共享首选项在活动之间传递数据,因为数据仅对当前会话有用。我只想随时随地检索数据。
PlayerDetails.kt
class PlayerDetails : AppCompatActivity() {
...
val player1 = Player(name="james", age=23, gender="male")
val player2 = Player(name="sophie", age=38, gender="female")
}
Player.kt
data class Player (
val name: String,
val age: Int,
val gender: String
)
由于我有多个玩家,是否有可能在Player
中创建多个PlayerDetails.kt
实例并且能够在以后的活动中单独访问这些实例?
我这样做是因为我不想经常使用Intent.putString,Intent.putInt或Shared Preferences在活动之间传递数据,因为数据仅对当前会话有用。
你听起来像是想吃蛋糕,也喜欢吃。这是一个问题,因为如果你不使用Intent bundle,你就不使用磁盘持久性;然后你仍然至少需要实现BaseActivity.onSaveInstanceState()
否则你的可怜的用户会在一段时间后返回你的应用程序时丢失他们的数据(状态);)
想象一下,你在Activity1中设置了字段,我转到Activity3,然后接到一个需要20分钟的电话。在此期间Android终止我的应用程序,我从电话回来,应用程序从Activity3开始,我应该在Activity1中设置但从未以任何方式保存的东西现在是null
或""
或0
。用户体验不是很好,特别是当它导致崩溃时。
你的场景的简单解决方案是每次手动分解你的Player
,只需使用@Parcelize
。
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
androidExtensions {
experimental = true
}
然后
@Parcelize data class Player: Parcelable (
val name: String,
val age: Int,
val gender: String
)
和
// inline fun <reified T: Activity> Activity.intentFor(builder: Intent.() -> Unit) {
// return Intent(this, T::class.java).apply(builder)
// }
startActivity(intentFor<OtherActivity>() {
putParcelableExtra("player", player)
})
val player = intent.getParcelableExtra("player")