为什么捆绑意图迷路了?

我有一个Serializable特殊对象的一些参数(位置等依次Serializable以及)

我想通过一个Activity( MySpecialActivity )通过处理一个SpecialObject对象来打开一个Fragment( 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 } } } 

实例化createIntent() :创建Intent以启动MySpecialActivity, createIntent()方法正常工作。 当我 调试 进入intent对象,它有它的bundle,而且有Seri​​alizable MySpecialObject对象。

解包Bundle onCreate() :正如你可以看到的 的onCreate() 所有额外的*和bundleExtra *对象都没有mMap

而getIntras()直接从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: 看这里 请参阅extraextra2

几件事:

  • 在原来的代码中,你正在创建一个包含Bundle的Bundle,并将其放入Intent中。 因此,你有一个并不是真正必要的Bundle。 你可以直接调用putExtra的意图。

  • 调用intent.extrasintent.getExtras() 创建额外套件的副本 。 所以这是预计你会得到两个不同的捆绑。

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

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

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

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

这就是这里需要的一切。