android webview全面使用讲解,以及一些遇到的坑

#简介

webview是在android中渲染web页面的控件,它在android4.4之前是基于webkit引擎,在之后是基于Chromium引擎。

webview的基本使用

当前使用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();
    }

}

webview点击back返回处理

@Overridepublicboolean onKeyDown(int keyCode, KeyEvent event) { 
  if (keyCode == KeyEvent.KEYCODE_BACK &&webView.canGoBack()) {   
   webView.goBack();// 返回前一个页面  
     return true;  
 }   
returnsuper.onKeyDown(keyCode, event);
}

webview内存泄漏解决方案

  1. 尽量不要在.xml文件中定义webview节点,然后在onDestroy方法进行webView的回收
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();
}
  1. 开启webview加入新的进程
<activity
            android:name=".WebviewActivity"
            android:process=":Process"
            android:screenOrientation="portrait"
            android:configChanges="orientation|screenSize|keyboardHidden"
        />

注:需使用aidl进行进程的通信

WebView后台耗电问题

在Activity.onDestroy()中直接调用System.exit(0),使得应用程序完全被移出虚拟机,这样就不会有任何问题了。

webview网页内容是否真的加载完毕了?

WebViewClient.onPageFinished()当前正在加载的网页产生跳转的时候这个方法可能会被多次调用,所以当你的WebView需要加载各种各样的网页并且需要在页面加载完成时采取一些操作的话,可能WebChromeClient.onProgressChanged()
比WebViewClient.onPageFinished()都要靠谱一些。

你可能感兴趣的:(android笔记)