美文网首页
一个关于 Parcelable 对象跨进程时的“锅”

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

作者: zonda的地盘 | 来源:发表于2019-08-21 15:34 被阅读0次

转载请注明出处: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);
    }
}

相关文章

网友评论

      本文标题:一个关于 Parcelable 对象跨进程时的“锅”

      本文链接:https://www.haomeiwen.com/subject/egxisctx.html