本来正常好好的,加载一条游戏url 没有问题!有个弊端 手机息屏后 游戏内的声音还存在。看了网上主流的解决方法:
在webview寄存的activity下的生命周期方法下添加如下代码即可:
@Override
protected void onResume() {
mWebView.onResume();
mWebView.resumeTimers();
super.onResume();
}
@Override
protected void onPause() {
mWebView.onPause();
mWebView.pauseTimers();
super.onPause();
}
这个锁屏声音的解决了 发现了有个更大的问题出现了,加载游戏链接的url有时候 就加载不出来,这个就奇怪了!一度怀疑是游戏链接的问题。
直到看到api的说明:
Does a best-effort attempt to pause any processing that can be paused safely, such as animations and geolocation. Note that this call does not pause JavaScript. To pause JavaScript globally, use pauseTimers(). To resume WebView, call onResume().
百度翻译如下:
是否尽最大努力暂停可以安全暂停的任何处理,如动画和地理位置。请注意,此调用不会暂停JavaScript。要在全球范围内暂停JavaScript,请使用“PaulTimeServer())。要恢复WebView,请调用OnReSuMe()。
webView.onPause ():只是暂停一些安全方面的处理
webView.pauseTimes():暂停所有的js活动
这就明白了 在页面失去焦点的时候 就停止了加载游戏链接的url,所以改动如下:
@Override
protected void onResume() {
mWebView.onResume();
mWebView.resumeTimers();
super.onResume();
}
@Override
protected void onPause() {
super.onPause();
}
@Override
protected void onStop() {
super.onStop();
mWebView.onPause();
mWebView.pauseTimers();
}
这样即解决了 锁屏声音的问题 又解决了游戏链接有时候加载不出来的问题。
同时记录一下:js 通过handle协议和android前端交互
首先得支持js
webview.getting.setJavaScriptEnabled(true);
并设置js接口 与前端定义一致
js调java:调用webView.addJavascriptInterface(somePOJO, “varName”);
让一个java对象成为webview里面网页的window对象的varName属性,就好像执行了window.varName = somePOJO一样,因为window是全局上下文,js即可以用访问全局变量的方式访问这个java对象了,然后调用这个对象的函数即可,如果somePOJO这个对象有个public void doIt()方法,则可以这样调用它:someButton.οnclick=function(){varName.doIt();}
事例如下:
mWebView.addJavascriptInterface(new RedJavascriptInterface(mWebView, payResultHandler), "control");
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
String str = msg.getData().getString("data");
}
};
private class RedJavascriptInterface {
WebView webView;
Handler payResultHandler;
public RedJavascriptInterface(WebView webView, Handler payResultHandler) {
this.webView = webView;
this.payResultHandler = payResultHandler;
}
@JavascriptInterface
public void postMessage(final String json) {
Message msg = new Message();
Bundle bundle = new Bundle();
bundle.putString("data", data);
msg.setData(bundle);
handler.sendMessage(msg);
}
}
即js 那边调用为window.control.postMessage(“jsonData”)