1. 程式人生 > >android webview全面使用講解,以及一些遇到的坑

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:

<?xml version="1.0" encoding="utf-8"?>
<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()都要靠譜一些。