从意图解组extras抛出一个异常,但只在onActivityReenter期间

我只是尝试实现onActivityReenter在重新输入转换运行之前做一个特殊的UI更新。 我从onActivityResult字面上的请求代码块,并分成2部分,一个进入onActivityReenter,另一个留在那里:

 BEFORE: (onActivityResult) if (resultCode == RESULT_OK) { // replace the MatchPlaySubmit model data?.let { this.dataBinding.submitModel = data.getMatchPlaySubmitModel() val profIndex = data.getMatchPlayFinalProfileIndex() dataBinding.matchPlay.matchPlayPicker.jumpToProfileNumber(profIndex + 1) this.updatePickerView() } } override fun onActivityReenter(resultCode: Int, data: Intent?) { if (resultCode == RESULT_OK && data != null) { // makes sure that the data is from pager, since there no request code > if (data.getStringExtra("source") == "mppager") { // causes CRASH val profIndex = data.getMatchPlayFinalProfileIndex() dataBinding.matchPlay.matchPlayPicker.jumpToProfileNumber(profIndex + 1) } } } AFTER: (onActivityResult) if (resultCode == RESULT_OK) { // replace the MatchPlaySubmit model data?.let { this.dataBinding.submitModel = data.getMatchPlaySubmitModel() this.updatePickerView() } } 

但是, onActivityReenter的新代码总是导致崩溃。 崩溃就好像我没有正确设置类加载器的额外功能。 不过,我只是添加到kotlin扩展func,以确保extras的classloader被设置为我的。 但是,崩溃总是会发生。

 inline internal fun Intent.setMatchPlaySubmitModel(model: MatchPlaySubmitModel?) { this.putExtra("@mpsubmit@", model) this.setExtrasClassLoader(MatchPlaySubmitModel::class.java.classLoader) } 

android.os.BadParcelableException:ClassNotFoundException解组时:android.os.Parcel.readParcelableCreator(Parcel.java:2535)在android.os.Parcel.readParcelable(Parcel.java:2461)上的letstwinkle.com.twinkle.api.MatchPlaySubmitModel android.os.Parcel.readValue(Parcel.java:2364)在android.os.Parcel.readArrayMapInternal(Parcel.java:2717)在android.os.BaseBundle.unparcel(BaseBundle.java:269)在android.os.BaseBundle .getString(BaseBundle.java:992)at android.content.Intent.getStringExtra(Intent.java:6211)at letstwinkle.com.twinkle.MatchPlayActivity.onActivityReenter(MatchPlayActivity.kt:1123)

测试API 24

看起来,框架转型的实施有一个糟糕的情况。 目前没有“好”的解决方案。 可能的解决方法是避免将您的应用程序定义的类放入结果意图的任何方法。 我选择的方法是为那个类(幸运的是只有一个),删除Parcelable实现,并提供一个Intent和writeToIntent方法的构造函数:

 constructor(intent: Intent) { playID = intent.getStringExtra("@mpsubmit@playid") chosenProfileID = intent.getStringExtra("@mpsubmit@prof1") extraChosenProfileID = intent.getStringExtra("@mpsubmit@prof2") passed = intent.getBooleanExtra("@mpsubmit@pass", false) shout = intent.getStringExtra("@mpsubmit@shout1") extraShout = intent.getStringExtra("@mpsubmit@shout2") } fun writeToIntent(intent: Intent) { intent.putExtra("@mpsubmit@playid", playID) intent.putExtra("@mpsubmit@prof1", chosenProfileID) intent.putExtra("@mpsubmit@prof2", extraChosenProfileID) intent.putExtra("@mpsubmit@pass", passed) intent.putExtra("@mpsubmit@shout1", shout) intent.putExtra("@mpsubmit@shout2", extraShout) }