为什么捆绑意图迷路了?
我有一个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,而且有Serializable MySpecialObject对象。
解包Bundle 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: 请参阅extra
和extra2
!
几件事:
-
在原来的代码中,你正在创建一个包含Bundle的Bundle,并将其放入Intent中。 因此,你有一个并不是真正必要的Bundle。 你可以直接调用
putExtra
的意图。 -
调用
intent.extras
或intent.getExtras()
创建额外套件的副本 。 所以这是预计你会得到两个不同的捆绑。 -
预计,当你调试时,
extras
有空mMap
。 Bundle具有惰性语义,只有访问数据的第一个调用才会对它进行解码,从而填充mMap
。
我猜测你最初创建的Intent包含了一个Bundle包,但是当你访问的时候试图跳过一步。 我建议删除现有的代码并重新开始:
-
使用
intent.putExtra(EXTRA_SPECIAL, specialObject)
方法创建Intent并添加特殊数据; -
然后通过调用
intent.getSerializableExtra(EXTRA_SPECIAL)
检索特殊数据。
这就是这里需要的一切。