为什么 Bundle in Intent 迷路了?
Why Bundle in Intent get lost?
我有一个带有一些参数的 Serializable
SpecialObject(位置等依次 Serializable
)
我想通过 Activity (MySpecialActivity
) 处理 SpecialObject
对象来打开片段 (MySpecialFragment
)。到目前为止它有效,我可以触发并打开 MySpecialFragment
但 SpecialObject
没有正确处理。感觉只见树木不见森林
正在调试:
val PARAM_BUNDLE = "bundle_extra"
val PARAM_SPECIAL_EXTRA = "special_bundle_extra"
class MySpecialActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_my_special)
val sameIntentSht = intent // same as getIntent()
val extras = intent.extras // same as getIntent().getExtras()
val bundleExtras = intent.getBundleExtra(PARAM_BUNDLE)
val extras2 = sameIntentSht.extras
val bundleExtras2 = sameIntentSht.getBundleExtra(PARAM_BUNDLE)
if(extras != null && extras2 != null && bundleExtras != null && bundleExtras2 != null) Timber.d("Jzst for debugging")
FragmentHelper.inflateFragment(this, R.id.fragmentContainer, MySpecialFragment::class.java, extras)
}
companion object {
fun createIntent(context: Context,
mySpecial: MySpecialObject?): Intent {
val intent = Intent(context, MySpecialActivity::class.java)
val bundle = Bundle()
mySpecial?.let {
bundle.putSerializable(PARAM_SPECIAL_EXTRA, mySpecial)
}
intent.putExtra(PARAM_BUNDLE, bundle)
// intent.flags = FLAG_ACTIVITY_NEW_TASK
return intent
}
}
}
Instantiation createIntent():创建 Intent 以启动 MySpecialActivity createIntent()
方法工作正常。当我 进入 intent 对象时,它有它的包,而它又有 Serializable MySpecialObject 对象。
打开 Bundle onCreate():如您在 中所见,所有 extra* 和 bundleExtra* 对象都没有 mMap
以及直接来自 getIntent() 的 getExtras()(在 Kotlin 中 intent.extras)
与 sameIntentSht 不同,后者显然相同 val sameIntentSht = intent
。您在调试中看到 intent.extras 有 652 个字节,sameIntentSht.extras 有 604 个字节!??!?
如何正确处理这个包?
编辑:
我使用了 RubenGees 的建议。目前有效:
val intent = Intent(context, MySpecialActivity::class.java)
mySpecial?.let {
intent.putExtra(PARAM_SPECIAL_EXTRA, mySpecial)
}
// intent.flags = FLAG_ACTIVITY_NEW_TASK
return intent
但是在 onCreate 上我不得不将意图复制到 sameIntentsht 中: 参见 mMap
of extra
和 extra2
!?
两件事:
在原始代码中,您正在创建一个包含 Bundle 的 Bundle,并将其放入 Intent 中。因此,您拥有一个并非真正必要的 Bundle。可以直接在Intent上调用putExtra
。
调用 intent.extras
,或 intent.getExtras()
创建附加包的副本。因此,预计您会得到两个不同的捆绑包。
预计你调试的时候,extras
有空mMap
。 Bundle 具有惰性语义,只有第一次访问数据的调用才会对其进行解包,从而填充 mMap
.
我猜想您最初是在创建一个 Intent,其中包含一个包含 Bundle 的 Bundle,但是在访问时您试图跳过一个步骤。我建议删除现有代码并重新开始:
使用intent.putExtra(EXTRA_SPECIAL, specialObject)
方法创建Intent并放置特殊数据;
然后通过调用 intent.getSerializableExtra(EXTRA_SPECIAL)
.
检索特殊数据
这就是这里需要的一切。
我有一个带有一些参数的 Serializable
SpecialObject(位置等依次 Serializable
)
我想通过 Activity (MySpecialActivity
) 处理 SpecialObject
对象来打开片段 (MySpecialFragment
)。到目前为止它有效,我可以触发并打开 MySpecialFragment
但 SpecialObject
没有正确处理。感觉只见树木不见森林
正在调试:
val PARAM_BUNDLE = "bundle_extra"
val PARAM_SPECIAL_EXTRA = "special_bundle_extra"
class MySpecialActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_my_special)
val sameIntentSht = intent // same as getIntent()
val extras = intent.extras // same as getIntent().getExtras()
val bundleExtras = intent.getBundleExtra(PARAM_BUNDLE)
val extras2 = sameIntentSht.extras
val bundleExtras2 = sameIntentSht.getBundleExtra(PARAM_BUNDLE)
if(extras != null && extras2 != null && bundleExtras != null && bundleExtras2 != null) Timber.d("Jzst for debugging")
FragmentHelper.inflateFragment(this, R.id.fragmentContainer, MySpecialFragment::class.java, extras)
}
companion object {
fun createIntent(context: Context,
mySpecial: MySpecialObject?): Intent {
val intent = Intent(context, MySpecialActivity::class.java)
val bundle = Bundle()
mySpecial?.let {
bundle.putSerializable(PARAM_SPECIAL_EXTRA, mySpecial)
}
intent.putExtra(PARAM_BUNDLE, bundle)
// intent.flags = FLAG_ACTIVITY_NEW_TASK
return intent
}
}
}
Instantiation createIntent():创建 Intent 以启动 MySpecialActivity createIntent()
方法工作正常。当我
打开 Bundle onCreate():如您在
以及直接来自 getIntent() 的 getExtras()(在 Kotlin 中 intent.extras)
与 sameIntentSht 不同,后者显然相同 val sameIntentSht = intent
。您在调试中看到 intent.extras 有 652 个字节,sameIntentSht.extras 有 604 个字节!??!?
如何正确处理这个包?
编辑: 我使用了 RubenGees 的建议。目前有效:
val intent = Intent(context, MySpecialActivity::class.java)
mySpecial?.let {
intent.putExtra(PARAM_SPECIAL_EXTRA, mySpecial)
}
// intent.flags = FLAG_ACTIVITY_NEW_TASK
return intent
但是在 onCreate 上我不得不将意图复制到 sameIntentsht 中:mMap
of extra
和 extra2
!?
两件事:
在原始代码中,您正在创建一个包含 Bundle 的 Bundle,并将其放入 Intent 中。因此,您拥有一个并非真正必要的 Bundle。可以直接在Intent上调用
putExtra
。调用
intent.extras
,或intent.getExtras()
创建附加包的副本。因此,预计您会得到两个不同的捆绑包。预计你调试的时候,
extras
有空mMap
。 Bundle 具有惰性语义,只有第一次访问数据的调用才会对其进行解包,从而填充mMap
.
我猜想您最初是在创建一个 Intent,其中包含一个包含 Bundle 的 Bundle,但是在访问时您试图跳过一个步骤。我建议删除现有代码并重新开始:
使用
intent.putExtra(EXTRA_SPECIAL, specialObject)
方法创建Intent并放置特殊数据;然后通过调用
intent.getSerializableExtra(EXTRA_SPECIAL)
. 检索特殊数据
这就是这里需要的一切。