为什么 Bundle in Intent 迷路了?

Why Bundle in Intent get lost?

我有一个带有一些参数的 Serializable SpecialObject(位置等依次 Serializable

我想通过 Activity (MySpecialActivity) 处理 SpecialObject 对象来打开片段 (MySpecialFragment)。到目前为止它有效,我可以触发并打开 MySpecialFragmentSpecialObject 没有正确处理。感觉只见树木不见森林

正在调试:

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 extraextra2 !?

两件事:

  • 在原始代码中,您正在创建一个包含 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).

  • 检索特殊数据

这就是这里需要的一切。