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

来源:互联网 发布:java多久可以学会 编辑:程序博客网 时间:2024/05/22 00:29
#简介

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);@Overrideprotected 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()都要靠谱一些。

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 玉林买卖乐 玉林美食 玉林招聘 玉林论坛 玉林特产 红豆网玉林 玉林58 玉林中学 玉林招聘网 玉林楼盘 玉林路 玉林网 玉林日报 玉林汽车站 玉林图片 玉林站 玉林找工作 玉林生活网 玉林同城网 玉林吧 玉林在哪 玉林动车 玉林社区网 玉林旅游 玉林话 玉林大学 玉林飞机场 玉林人才 玉林电视台 玉林碧桂园 广西玉林市 玉林教育网 玉林在哪里 玉林红豆社区 红豆社区玉林论坛 红豆玉林论坛 玉林一化工厂爆炸 玉林红豆论坛 广西玉林旅游 玉林汽车总站 玉林人才市场