转载请注明出处: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.
* <p>
* 本类用于兼容部分机型(如:三星S9)出现无法打开推送问题
* </>
* 经排查在上述机型,在跨进程传递 Parcelable 对象时会出现 class not found when unmarshalling 异常
* 子进程的 classloader 没有 framework classloader 导致出现上述问题
*/
public final class PushAIDLCompat {
public static <T extends Parcelable> 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 extends Parcelable> T getObj(@NonNull Bundle aidlBundle, @NonNull Class<T> 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);
}
}