Qigsaw
Qigsaw copied to clipboard
自定义实现动态Activity,提示Resources$NotFoundException: Resource ID #0x7e020002
宿主中添加了代理Activity,然后代理实现插件里未注册的Activity。有些手机就正常可以启动看到界面。 另一些则提示Resources$NotFoundException: Resource ID #0x7e020002。页面载入失败, 用的是dynamic-load-apk这个方案。 插件中的资源不是安装加载后都可以直接用么? Resources resources = null; try { context = ctx.createPackageContext(ctx.getPackageName(), 0); resources = context.getResources(); } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } 资源加载一直不成功。请问有没有什么办法,或者该插件是否以后会提供这样的功能。这个功能的实现,难点或者问题在哪里呢?
Q:base Apk中通过getResources().getIdentifier访问插件资源为什么访问不了?
A:
getResources().getIdentifier("hello_world","string", getPackageName() + "." + "${插件名}");
Q:base Apk中通过getResources().getIdentifier访问插件资源为什么访问不了?
A:
getResources().getIdentifier("hello_world","string", getPackageName() + "." + "${插件名}");
我想实现,宿主动态代理插件的Activity,这样插件可以不注册Activity。 使用dynamic-load-apk的代码。我看到wiki,qigaw是没有这样的功能的,所以我想试试实现这样的功能。 结果: 一种是:插件里面的Activity加载成功了,布局没有加载成,白屏。 一种是:插件Activity启动了,页面正常,对话框显示不正常。
DLProxyFragmentActivity覆盖了: @Override public Resources getResources() { return impl.getResources() == null ? super.getResources() : impl.getResources(); } 在dynamic-load-apk中,它是使用apk加载,创建Resources,而我这里是通过context = ctx.createPackageContext(ctx.getPackageName(), 0); resources = context.getResources();这样创建,然后传入。 对话框就是示例中的那个简单的;小米6出现:Binary XML file line #44: Error inflating class com.android.internal.widget.DialogTitle。有些手机正常显示。 白屏的是插件里未注册的Activity执行到setcontentview就错误了,feature日志是加载成功的。 getResources()是否与加载器有关。 另外,我想问一下。qigsaw的项目上,实现这种 动态的Activity是不是可行的。
在activity的基类重写getResource方法,然后加上:Qigsaw.onApplicationGetResources(resources);试试; 类似这样:
override fun getResources(): Resources {
val resources = super.getResources()
Qigsaw.onApplicationGetResources(resources)
return resources
}
Q:base Apk中通过getResources().getIdentifier访问插件资源为什么访问不了?
A:
getResources().getIdentifier("hello_world","string", getPackageName() + "." + "${插件名}");
很好奇为什么可以通过getPackageName() + "." + "${插件名}" 方式获取到插件的id