一个关于 Parcelable 对象跨进程时的“锅”

转载请注明出处:https://www.jianshu.com/p/33227b791d53

在三星S9机型出现,收到推送但无法打开的问题

问题描述

在跨进程传递 Parcelable 对象时会出现 class not found when unmarshalling 异常子进程的 classloader 没有 framework classloader 导致出现上述问题

解决方案

使用 Bundle.setClassloader 方法指定类加载器即可

参考代码

/**
 * Created by zhuqiuzhu on 2019/7/30.
 * 

* 本类用于兼容部分机型(如:三星S9)出现无法打开推送问题 * * 经排查在上述机型,在跨进程传递 Parcelable 对象时会出现 class not found when unmarshalling 异常 * 子进程的 classloader 没有 framework classloader 导致出现上述问题 */ public final class PushAIDLCompat { public static void putObj(@NonNull Bundle aidlBundle, @NonNull T aidlArg) { final String key = aidlArg.getClass().getName(); Log.i("push", "PushAIDLCompat putObj " + key); final Bundle frameworkBundle = new Bundle(); frameworkBundle.setClassLoader(aidlArg.getClass().getClassLoader()); frameworkBundle.putParcelable(key, aidlArg); aidlBundle.putBundle(key, frameworkBundle); } @Nullable public static T getObj(@NonNull Bundle aidlBundle, @NonNull Class aidlClass){ final String key = aidlClass.getName(); Log.i("push", "PushAIDLCompat getObj " + key); final Bundle frameworkBundle = aidlBundle.getBundle(key); if(frameworkBundle == null){ return null; } return frameworkBundle.getParcelable(key); } }

你可能感兴趣的:(一个关于 Parcelable 对象跨进程时的“锅”)