Android 常见问题

本文介绍接入 Android 过程中常见的问题及相应的解决方案。

自定义 JSAPI 时,handleEvent 和 interceptEvent 有什么区别?

解答:如果监听容器自己处理的事件,需要将自定义 JSAPI 添加到 handleEvent 里,并返回 true 。返回 true,表示事件将停止传递;返回 false,表示事件将继续传递给其他插件。如果监听容器的其他事件,需要将自定义 JSAPI 添加到 interceptEvent 中。

自定义 JSAPI 时,已经添加了事件,为什么还要在 onPrepare 里添加一次?

解答:自定义 JSAPI 时,虽然已经在 config.setEvents("event"); 中添加了事件,但是容器的插件是懒加载的,即在页面创建的时候加载。通过外部的 config.setEvents 来注入要监听的事件名称,当真正有 JS 调用的时候,才会去实例化对应的插件对象。真正实例化的插件的事件分发用的是插件内 onPrepare 的事件。所以,要确保 config.setEvents("event") 的事件和内部 onPrepare 的事件保持一致。

自定义 JSAPI 插件注册的 page、session 和 service 三者的区别是什么?

解答:page 对应一个 WebView。session 对应 mPaaS 应用的一个 App 对象。service 是全局的一个单例。

  • 如果注册为 page 级别,每次创建 WebView 都会创建一个插件实例,对应的插件的 onRelease 在 WebView 销毁时回调。

  • 如果注册为 session 级别,每次创建一个 App 对象都会创建一个插件。

  • 如果注册为 service 级别,全局只创建一次插件,在第一次打开容器的时候创建。

验签是验证离线包的来源还是做完整性校验?

解答:在离线包发布平台,如果您配置了签名私钥,平台下发的 AMR 文件就会带上离线包的签名信息(通过私钥对离线包的 Hash 值加密后得到的密文)。验签的时候会使用在项目中预置的公钥进行签名的验证(解密上一步的密文得到 Hash 值,本地计算离线包的 Hash,判断两者是否相同)。该过程保证了离线包的内容完整,也保证了离线包的来源正确。

打开离线包 ProgressBar 无法隐藏的原因是什么?

解答:这种情况可能是由于资源离线失败,页面 fallback 到了线上模式,在 fallback 模式下面 H5 容器强制限制 ProgressBar,无法通过设置 SHOW_PROGRESS 启动参数来隐藏页面加载进度条(Progress Bar)。