基础用法
H5侧使用
function callH5(data){
document.getElementById("result").innerHTML="result success for Android to:"+data;
}
function myOnclick(){
document.getElementById("result").innerHTML="按钮被点击了"
//H5调用Android
myObj.callAndroid("弹窗显示回调成功了~~~");
}
Android侧使用
//支持js
mWebView.getSettings().setJavaScriptEnabled(true);
//设置本地调用对象及其接口
//第一个参数为实例化自定义的接口对象 第二个参数为提供给JS端调用使用的对象名
mWebView.addJavascriptInterface(new Contact() {
@JavascriptInterface //必须加的注解
@Override
public void callAndroid(String phone) {
Toast.makeText(MainActivity.this, phone, Toast.LENGTH_LONG).show();
}
}, "myObj");
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Android调用H5
mWebView.loadUrl("javascript:callH5('Android OK !!!')");
}
});
- 延申的库
1.JSBridge https://blog.csdn.net/dickyqie/article/details/70225676
2.HybridBridge https://github.com/YouJZ/HybridBridge - 优化方案
1.webview独立进程化
2.图片延迟下载3
3.多级缓存 问题集锦
1.https://blog.csdn.net/lxd_Android/article/details/56022088
2.https http混合模式 https://blog.csdn.net/luofen521/article/details/51783914
3.Java内存泄漏1、主要原因Activity(静态引用)、Dialog在onDestroy时没有被dismiss等。 2、分析工具: MAT产生的hrof文件查看引用链,断掉就OK。 AOP在onCreate、onDestroy、finalize埋点。在onDestory被调用后,运行GC,然后,如果finalize很长时间没有被调用就有内在泄漏了。 3、解决方案: Context->Application PackageManager管理Task,防止Activity被遗忘在栈底部。 Activity不用了以后,立即调用finish销毁。
4.C内存泄漏
1、主要原因:Bitmap没有回收、Webkit占用的资源、SQLite在内存中的缓存 2、分析工具: Native Heap(DDMS工具隐藏自带) 3、解决方案: 针对Bitmap建议内存池。Activity.onStop时,把图片释放,Activity.onStart时,getView重新被调用时再读回来。 当Webview所在的Activity.onStop时,调用freeMemory。 减少SQLite的使用,或者单独进程建立ContentProvider。
第三方解决方案
- 腾讯共享内核,仅android版本 http://x5.tencent.com/
- https://crosswalk-project.org/ 支持Android iOS,缺点,体积庞大,增加20-40m
- 谷歌内核 https://github.com/pwnall/chromeview