1. Problem description and solution
Description of the problem: This problem is mainly caused by the fact that some versions of mobile phones use Intent to directly transfer Parcelable data, and the Parcelable type is generated by default. Examples are as follows:
@Parcelize
data class FunctionResultBean(
val isComplete: Boolean = false, //是否完成
val completeDesc: String = "none", //完成结果的描述
): Parcelable
The delivery method is as follows:
fun launch(
cxt: Context,
desArray: ArrayList<FunctionResultBean> = arrayListOf()
) {
val intent = Intent(cxt, PcmResultActivity::class.java)
intent.putParcelableArrayListExtra(KEY_FUNCTION_SUB_DES_ARRAY, desArray)
cxt.startActivity(intent)
}
There are many ways to modify, here is a more convenient one,
fun launch(
cxt: Context,
desArray: ArrayList<FunctionResultBean> = arrayListOf()
) {
val intent = Intent(cxt, PcmResultActivity::class.java)
val bundle = Bundle()
bundle.putParcelableArrayList(KEY_FUNCTION_SUB_DES_ARRAY, desArray)
intent.putExtra("KEY",bundle)
cxt.startActivity(intent)
}
Another way is to generate the Parcelable class by yourself, instead of using the default one, and replace the default loader BootClassLoader with your own class loader when generating it yourself, as follows:
mHashMap = in.readHashMap(HashMap.class.getClassLoader())
# 修改如下
mHashMap = in.readHashMap(TestBean.class.getClassLoader());
Another way is to add a loader when using Intent to pass data
intent.setExtrasClassLoader(ImagesSet::class.java.classLoader)
In addition, it can also be converted into a byte array and passed, which appears in Alarms.java
Two, the log
Class not found when unmarshalling
com.speedclean.master.expert.function.finish.FunctionResultBean
java.lang.ClassNotFoundException:
com.speedclean.master.expert.function.finish.FunctionResultBean
at java.lang.Class.classForName(Native Method)
at java.lang.Class.forName(Class.java:453)
at android.os.Parcel.readParcelableCreator(Parcel.java:2827)
at android.os.Parcel.readParcelable(Parcel.java:2781)
at android.os.Parcel.readValue(Parcel.java:2684)
at android.os.Parcel.readListInternal(Parcel.java:3114)
at android.os.Parcel.readArrayList(Parcel.java:2335)
at android.os.Parcel.readValue(Parcel.java:2705)
at android.os.Parcel.readArrayMapInternal(Parcel.java:3053)
at android.os.BaseBundle.initializeFromParcelLocked(BaseBundle.java:288)
at android.os.BaseBundle.unparcel(BaseBundle.java:232)
at android.os.BaseBundle.getString(BaseBundle.java:1155)
at android.content.Intent.getStringExtra(Intent.java:8135)
at com.android.server.am.ActivityStarter.startActivity(ActivityStarter.java:739)
at com.android.server.am.ActivityStarter.startActivity(ActivityStarter.java:677)
at com.android.server.am.ActivityStarter.startActivityMayWait(ActivityStarter.java:1646)
at com.android.server.am.ActivityStarter.execute(ActivityStarter.java:619)
at com.android.server.am.ActivityManagerService.startActivityAsUser(ActivityManagerService.java:6745)
at com.android.server.am.ActivityManagerService.startActivityAsUser(ActivityManagerService.java:6626)
at com.android.server.am.ActivityManagerService.startActivity(ActivityManagerService.java:6617)
at android.app.IActivityManager$Stub.onTransact$startActivity$(IActivityManager.java:10870)
at android.app.IActivityManager$Stub.onTransact(IActivityManager.java:111)
at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:4181)
at android.os.Binder.execTransact(Binder.java:739)
Caused by: java.lang.ClassNotFoundException: com.speedclean.master.expert.function.finish.FunctionResultBean
at java.lang.Class.classForName(Native Method)
at java.lang.BootClassLoader.findClass(ClassLoader.java:1346)
at java.lang.BootClassLoader.loadClass(ClassLoader.java:1406)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
at java.lang.Class.classForName(Native Method)
at java.lang.Class.forName(Class.java:453)
at android.os.Parcel.readParcelableCreator(Parcel.java:2827)
at android.os.Parcel.readParcelable(Parcel.java:2781)
at android.os.Parcel.readValue(Parcel.java:2684)
at android.os.Parcel.readListInternal(Parcel.java:3114)
at android.os.Parcel.readArrayList(Parcel.java:2335)
at android.os.Parcel.readValue(Parcel.java:2705)
at android.os.Parcel.readArrayMapInternal(Parcel.java:3053)
at android.os.BaseBundle.initializeFromParcelLocked(BaseBundle.java:288)
at android.os.BaseBundle.unparcel(BaseBundle.java:232)
at android.os.BaseBundle.getString(BaseBundle.java:1155)
at android.content.Intent.getStringExtra(Intent.java:8135)
at com.android.server.am.ActivityStarter.startActivity(ActivityStarter.java:739)
at com.android.server.am.ActivityStarter.startActivity(ActivityStarter.java:677)
at com.android.server.am.ActivityStarter.startActivityMayWait(ActivityStarter.java:1646)
at com.android.server.am.ActivityStarter.execute(ActivityStarter.java:619)
at com.android.server.am.ActivityManagerService.startActivityAsUser(ActivityManagerService.java:6745)
at com.android.server.am.ActivityManagerService.startActivityAsUser(ActivityManagerService.java:6626)
at com.android.server.am.ActivityManagerService.startActivity(ActivityManagerService.java:6617)
at android.app.IActivityManager$Stub.onTransact$startActivity$(IActivityManager.java:10870)
at android.app.IActivityManager$Stub.onTransact(IActivityManager.java:111)
at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:4181)
at android.os.Binder.execTransact(Binder.java:739)
Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack trace available