webview是在android中渲染web页面的控件,它在android4.4之前是基于webkit引擎,在之后是基于Chromium引擎。
当前使用ide为:AndroidStudio3.0,测试机为华为荣耀8,系统android7.0
1.因为webview加载的页面基于web,所以我们必须在AndroidManifest中添加网络权限。
<uses-permission android:name="android.permission.INTERNET"/>
2.webView控件可在xml中定义,也可以在activity中动态生成。
xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.trip.webviewproject.MainActivity">
<WebView
android:id="@+id/webView"
android:layout_width="match_parent"
android:layout_height="match_parent">
WebView>
RelativeLayout>
activity:
WebView webView = new WebView(this);
3.设置webView的基本信息
public class MainActivity extends AppCompatActivity {
WebView webView;
WebSettings webSettings;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
webView =findViewById(R.id.JsBridgeWebView);
webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);//支持javascript webSettings.setJavaScriptCanOpenWindowsAutomatically(true);//设置允许js弹出alert对话框
webView.requestFocus();//触摸焦点起作用 webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);//取消滚动条
//load本地 webVew.loadUrl("file:///android_asset/shopoperation.html");
//load在线
//mWebView.loadUrl("http://www.baidu.com");
//设置了Alert才会弹出,重新onJsAlert()方法return true可以自定义处理信息
webView.setWebChromeClient(new WebChromeClient() {
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
Toast.makeText(MainActivity.this, message, Toast.LENGTH_LONG).show();
return true;
}});
}
@Override
protected void onResume() {
super.onResume();
webView.onResume();
}
@Override
protected void onPause() {
super.onPause();
webView.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
webView.destroy();
}
}
@Overridepublicboolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK &&webView.canGoBack()) {
webView.goBack();// 返回前一个页面
return true;
}
returnsuper.onKeyDown(keyCode, event);
}
WebView mWebView = new WebView(getApplicationgContext());
LinearLayout mll = findViewById(R.id.main_activity);
mll.addView(mWebView);
@Override
protected void onDestroy() {
if( mWebView!=null) {
mWebView.setVisibility(View.GONE);
mWebView.removeAllViews();
mWebView.destroy();
}
super.onDestroy();
}
2.删除引用
public void setConfigCallback(WindowManager windowManager) {
try {
Field field = WebView.class.getDeclaredField("mWebViewCore");
field = field.getType().getDeclaredField("mBrowserFrame");
field = field.getType().getDeclaredField("sConfigCallback");
field.setAccessible(true);
Object configCallback = field.get(null);
if (null == configCallback) {
return;
}
field = field.getType().getDeclaredField("mWindowManager");
field.setAccessible(true);
field.set(configCallback, windowManager);
} catch(Exception e) {
}
}
public void onDestroy() {
setConfigCallback(null);
super.onDestroy();
}
<activity
android:name=".WebviewActivity"
android:process=":Process"
android:screenOrientation="portrait"
android:configChanges="orientation|screenSize|keyboardHidden"
/>
注:需使用aidl进行进程的通信
在Activity.onDestroy()中直接调用System.exit(0),使得应用程序完全被移出虚拟机,这样就不会有任何问题了。
WebViewClient.onPageFinished()当前正在加载的网页产生跳转的时候这个方法可能会被多次调用,所以当你的WebView需要加载各种各样的网页并且需要在页面加载完成时采取一些操作的话,可能WebChromeClient.onProgressChanged()
比WebViewClient.onPageFinished()都要靠谱一些。