android6.0系统缺少com.android.internal.policy.PolicyManager导致无法获取LayoutInflater实例问题

问题出现原因:

插件技术动态加载View需要实例化一个LayoutInflater,但6.0以后com.android.internal.policy.PolicyManager被去除,导致插件view无法被创建,为了能让我的app能够在6.0系统上运行,我必须解决掉这个bug

解决办法:

搜素源码找到这个类:
https://android.googlesource.com/platform/frameworks/base/+/android-6.0.1_r25/core/java/com/android/internal/policy/PhoneLayoutInflater.java
可以通过实例化它取得LayoutInflater,具体代码如下:
博客出处

policyClass = Class.forName("com.android.internal.policy.PhoneLayoutInflater");
Constructor<?> localConstructor = policyClass.getConstructor(new Class[]{Context.class});
mLayoutInflater = (LayoutInflater) localConstructor.newInstance(new Object[]{context});

如果你的项目需要经过com.android.internal.policy.PolicyManager获取windows

Class windowClass = Class.forName("com.android.internal.policy.PhoneWindow");
Constructor<?> localConstructor = windowClass.getConstructor(new Class[]{Context.class});
Window windows = (Window) localConstructor.newInstance(new Object[]{getApplicationContext()});//实例化Window,如果传的context不是Application的Context,就会奔溃
Field field = windowClass.getDeclaredField("mLayoutInflater");
field.setAccessible(true);
mLayoutInflater = (LayoutInflater) field.get(windows);//取得Application的LayoutInflater,而不是插件的LayoutInflater

//往windows设置插件的LayoutInflater
policyClass = ReflectUtil.getClass("com.android.internal.policy.PhoneLayoutInflater");
Constructor<?> policyLocalConstructor = policyClass.getConstructor(new Class[]{Context.class});
mLayoutInflater = (LayoutInflater) policyLocalConstructor.newInstance(new Object[]{this});
field.set(windows,mLayoutInflater);

参考源码:

https://android.googlesource.com/platform/frameworks/base/+/android-6.0.1_r25/core/java/com/android/internal/policy/PhoneWindow.java

热更新及插件技术实践

一款插件技术和热修复技术集一身的app:百宝工具箱

如果需要源码,请联系我

搜索到一些有趣的东西:

5.1.1到6.0源码改动列表

android全套源码,更新到6.0.0

android全套源码,更新到6.0.0,百度下载地址

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值