为什么Bundle in Intent迷路了?

时间:2017-05-19 11:10:54

标签: android android-intent kotlin android-bundle

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

我想通过处理MySpecialFragment对象,通过活动(MySpecialActivity)打开片段(SpecialObject)。到目前为止,我可以触发并打开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
    }
}
}

实例化createIntent():创建意图以启动MySpecialActivity createIntent()方法正常工作。当我debug进入intent对象时,它有它的bundle,而后者又有Seri​​alizable MySpecialObject对象。

解压缩包装onCreate():正如您在onCreate()中看到的那样,所有额外的*和bundleExtra *对象都不具备mMap

getExtras()直接来自getIntent()(在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:see heremMap extraextra2

1 个答案:

答案 0 :(得分:1)

一些事情:

  • 在原始代码中,您正在创建一个包含Bundle的Bundle,并将其放入Intent中。因此,您有一个并非真正必需的Bundle。您可以直接在意图上调用putExtra

  • 致电intent.extrasintent.getExtras() 会创建额外包的副本。所以预计你会得到两个不同的包。

  • 预计在调试时,extras为空mMap。 Bundle具有惰性语义,只有访问数据的第一个调用才会对其进行解组,从而填充mMap

我猜你最初创建的Intent包含一个包含Bundle的Bundle,但在访问时你试图跳过一步。我建议删除现有代码并重新开始:

  • 使用intent.putExtra(EXTRA_SPECIAL, specialObject)方法创建Intent并放置特殊数据;

  • 然后通过调用intent.getSerializableExtra(EXTRA_SPECIAL)检索特殊数据。

这就是这里所需的一切。