1.webview的功能
1.加載h5顯示
2.可以實現多媒體文本編輯器
2.webivew的使用優化
1.由於顯示的h5在服務端需要從服務端加載數據了本地才能顯示,因此需要對h5做緩存處理
2.webview加載一次以後會常駐內存因此實例webview的activity會被一直引用,需要通過application進行實例化,通過動態設置layoutparames的寬和高加到view中間去,並且實例的activity最好做到複用。
3.webview的cookie和原生app同步
public class WebViewCookieHandler implements CookieJar {
// CookieManager cookieManager = CookieManager.getInstance();
@Override
public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
String urlString = url.toString();
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
CookieSyncManager.createInstance(RiceApp.getAppContext());
}
for (Cookie cookie : cookies) {
CookieManager.getInstance().setCookie(urlString, cookie.toString());
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
android.webkit.CookieManager.getInstance().flush();
} else {
//noinspection deprecation
CookieSyncManager.createInstance(RiceApp.getAppContext());
CookieSyncManager.getInstance().sync();
}
}
@Override
public List<Cookie> loadForRequest(HttpUrl url) {
String urlString = url.toString();
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
CookieSyncManager.createInstance(RiceApp.getAppContext());
}
String cookiesString = CookieManager.getInstance().getCookie(urlString);
if (cookiesString != null && !cookiesString.isEmpty()) {
//We can split on the ';' char as the cookie manager only returns cookies
//that match the url and haven't expired, so the cookie attributes aren't included
String[] cookieHeaders = cookiesString.split(";");
List<Cookie> cookies = new ArrayList<>(cookieHeaders.length);
for (String header : cookieHeaders) {
cookies.add(Cookie.parse(url, header));
}
return cookies;
}
return Collections.emptyList();
}
}
4.通過動態代理給webview設置原生方法
/**
* call javascript method with giving class's methods
* @param nativeToJSInterface
* @param <T>
* @return
*/
@SuppressWarnings("unchecked")
public <T> T jsService(Class<T> nativeToJSInterface){
/**
* using Proxy to invoke method call from input interface
*/
return (T) Proxy.newProxyInstance(nativeToJSInterface.getClassLoader(), new Class[]{nativeToJSInterface}, new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
String methodName = method.getName();
StringBuilder callStringBuilder = new StringBuilder();
callStringBuilder.append(methodName).append("(");
if(args != null && args.length > 0){
for(int i = 0; i < args.length; i++){
Object arg = args[i];
if(arg.getClass() == boolean.class || arg.getClass() == Boolean.class){
callStringBuilder.append(((Boolean) arg) ? "true" : "false");
}else if(arg.getClass().isPrimitive()) {
callStringBuilder.append(arg + "");
}else if(CharSequence.class.isAssignableFrom(arg.getClass())){
callStringBuilder.append("\"").append(arg.toString()).append("\"");
}else{
callStringBuilder.append(arg);
}
if(i != args.length - 1) callStringBuilder.append(",");
}
}
callStringBuilder.append(");");
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
evaluateJavascript(callStringBuilder.toString(), null);
}else{
loadUrl(callStringBuilder.insert(0, "javascript:").toString());
}
return null;
}
});
}