基础用法
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
文章来源: 移动开发与H5交互的研究