androidweb,AndroidWebView47版本含哪些手机的什么版本?

Android开发之WebView(一)配置&小技巧

背景:原生时间紧没时间开发任务量大的任务,而前端又闲着打酱油

专注于为中小企业提供网站建设、网站制作服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业阳原免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了近1000家企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。

方案:原生+webview混合开发

缺点:对于比较复杂的页面,webview在性能上力不从心;且与原生通信频繁也增加了隐藏的工作量

优点:能自带支持动态更新(js),能充分利用人力

webview是一个基于webkit引擎,展示web页面的控件。Android上的webview在低版本和高版本采用了不同的webkit版本内核,Android4.4(19)后直接使用了Chrome内核;WebView控件功能强大,除了具有一般View的属性和设置外,还可以对url请求,页面加载,渲染,页面交互进行强大的处理。一般来说webview可单独使用,也可联合其工具类一起使用

移动应用的主体是webview,主要以网页语言编写,穿插Native功能的Hybrid App开发类型。激活webview为活跃状态,能正常执行网页的响应;当webview 的页面被失去焦点切换到后台不可见状态onPause时,需要通知自己暂停所有的动作,比如DOM的解析,plugin的执行,JavaScript的执行等

1,显示和渲染web页面

2,直接使用本地assets或者网络上的html文件作为布局

3,可和JavaScript进行互相调用

1,直接在布局文件里写死

2,动态添加进viewgroup中

注:不管以哪种方式,都必须注意webview的销毁,否则可能会造成内存泄漏最终导致内存溢出crash

下面是WebView的一些常用的方法列举,一些已经过时的方法未列出

下面是WebSettings的一些常用的方法列举,一些已经过时的方法就没有写出来了

一般不管是动态生成还是xml写死,只要处理好了引用持有问题,就能有效的避免内存泄漏;下面是我尝试的方案,在工具类WebViewUtils.java里封装好,在activity销毁的时候调用

1,清除webview缓存和记录

2,可以设置不启用缓存

3,H5的一些控件标签不支持导致的白屏

4,xml启用软件加速

5,通过menifest的来配置,在目标webview的activity设置

解决方案:

解决方案:

解决方案:

上一篇: Flutter入门-01-工程创建目录介绍

Android系统 WebView是什么?有什么用?

现在越来越多的APP都内置了Web网页去加载视图,也就是我们常说的Hybrid APP混合应用,市场上很多平台都是这样做的,比如我们经常使用的淘宝、京东等电商平台。这些是如何实现的呢?在我们Android中有一个WebView组件,它就可以实现此类功能。它是Android中的原生UI控件,主要用于在APP应用中方便地访问远程网页或本地HTML资源,同时WebView也在Android中充当Java代码和JS代码之间交互的桥梁,实际上也可以将WebView看做一个功能最小化的浏览器。下面我们一起来看看WebView的一些常用的使用方法。

WebView是Android系统提供的一个能显示网页的系统控件,它是一个特殊的View,同时也是一个ViewGroup,可以有很多其他子View。在Android 4.4以下(不包含4.4)系统WebView底层实现是采用WebKit内核,而在Android 4.4及其以上Google采用了Chromium内核作为系统WebView的底层内核支持。在这一变化中Android提供的WebView相关API并没有发生较大变化,在4.4上也兼容低版本的API并且引进了少部分API。这里简单介绍下基于Chromium的WebView和基于WebKit的WebView之间的差异,基于Chromium的Webview提供了更广的HTML5、CSS3、JavaScript支持,在Android系统版本5.0上基于Chromium 37,WebView提供了绝大多数的HTML5特性支持,除此之外Chromium也支持远程调试(Chrome DevTools)。WebKit JavaScript引起采用WebCore JavaScript在Android 4.4上换成了V8能直接提升JavaScript性能。

二、作用

1、显示和渲染Web页面

2、使用html文件(网络上或本地assets中)作为布局

3、可与JavaScript交互调用

注: WebView控件功能强大,除了具有一般View的属性和设置外,还可以对Url请求、页面加载、渲染、页面交互进行强大的处理。

android webview这个坑货-之一

android上webivew是个坑货,无疑!以前就曾出现过好几次莫名其妙的发出signal退出进程的例子,你退就退对应的activity就行了,为啥要把整个进程干掉?这回遇到的是一个crash,基本都在8.x机器上,而且绝大部分都是华为和荣耀机器,比如DUB-AL00占比三分之一。堆栈如下:

另外还有一个信息,crash的线程是在一个我用HandlerThread写的后台处理线程类A,这个类调用的地方不多,大概七八处。

解决思路:

一、先复现

根据上报的机型model和日志里的信息,发现是搜索某个特定的剧后crash的,找到相应的机器后,确实能复现,是个第三方的剧的网页,进去后播放没问题,但是如果做些点击的操作就90%以上概率会crash,而且,同样的8.x机器,非上报机型的华为或荣耀不能复现。

但是,同样的机型,使用同样sdk的公司内另一个app却没事。

二、可能性

对于1,尝试各方面对齐另一个app后,未果,一样crash。

对于2,找遍了各种调用方式上异同,比如传参等,未果,一样crash

那看起来是3了,但是不敢面对这个现实哈哈。

尝试通过breadpad来恢复堆栈,不可行,没有chrome的带symbol的so库。

想来想去,还是回到crash本身,为啥每次都在那个线程类A里,是上报系统不准还是确实和线程A有关,反正调用A的地方也不多,那索性都给注释了,再试,果然没问题,那接下来就简单了挨个排除就行了,最后发现是在那个线程里会读取剪贴板的地方有问题,不读剪贴板就行了。回过头看堆栈:

刚好可以对上,所以猜测,是非主线程里读取了剪贴板了,导致webview在主线程里对剪贴板相关操作时崩溃,具体源码没去看了,有兴趣的可以研究下。

嗯,其实一开始就应该把线程A和堆栈里的Clipboard联想起来的。

解决方案:

线程A里调用剪贴板的地方,换成在主线程里调。

关于Android WebView的那些事

[TOC]

Webkit是一个开源浏览器项目,其中,对Android开发者来说,或多或少的都有些接触。 在应用层来看,最经常使用无非这么几个类:WebView(Android中最为复杂,也是最为简单的一个View,继承自AbsoluteLayout),WebViewClient、WebChromeClient(作为回调控制类)、WebSettings(进行设置项的配置)等;Webkit内部包含了网络请求、页面渲染、Js引擎等等。在Android4.4之前的版本中,系统使用的是Webkit内核,其后,切换到Google的Chromium内核。本文主要介绍的是在Android中,如何使用Webkit进行H5页面的展现,以及常见问题的分析手段。

下面的内容抄自百度百科 乱七八糟的地方,简单了解一下。

bi前面都是吹牛逼的信息,如何使用Webkit来更好的搬砖? 且听如下分解/i/b

XML布局中丢一个 WebView 标签,然后再 Activity 或者 Fragment 中 findViewById ,进而 loadUrl ,一般也没人这么简单的用,除非写Demo。很简单,它就是一个Layout,提供了一个调用加载页面的接口,不写范例了,能看到这篇文章的都看过Google的API说明。

主要涉及到WebView和WebSettings两个类。

例如:

其实就是WebView的父类ViewGroup和View的方法,不多说了。不过需要注意的是,不是所有的View或ViewGroup的方法对WebView都生效。

列举几类常用的,几乎所有App的 WebView 都会设置的属性:

/br

如何处理页面跳转以及特殊 Scheme

这个回调可以说是最容易出问题的一个回调,表示什么? 字面意思,让你重写这个URL 的loading,比如点击html打电话的一个 a href=“tel:110” 标签,作为一个有节操、有责任心的浏览器,你需要处理 H5常用的几个Scheme :

除此之外,还有各个应用自定义的scheme ,举个例子,支付宝的支付Scheme : alipay: 。 这里的返回值,就代表你有没有能力处理这个url,没有的话Webkit就默认处理了。

需要注意的是,这个回调的触发的绝大多数情况是点击页面的 a href="xxxx" a标签,在Android中 loadUrl("") ,是不会回调的,为什么不会回调,各位自行理解吧。

超链接 a 标签怎么写: 点我

特别说下窗口常见的两种打开方式:

针对单页模式的WebView框架(所有的html窗口均使用同一个WebView实例),不需要关注target的。

如果作为一个成熟的浏览器框架的话,是需要支持Html、JavaScript使用新窗口打开页面,需要实现如下回调:

还有一个相关设置项: WebSettings.setJavaScriptCanOpenWindowsAutomatically

此时,系统将不会再回调 shouldOverrideUrlLoading 。新窗口逻辑的具体实现机制,可以参考系统browser实现逻辑。

b 这里有个坑 /b

Android 4.4版本 ,如果实现了onCreateWindow,也就是说页面 a 标签是这么写的: a href="" target="_blank" ,点击此链接打开的新WebView窗口,此窗口中的url点击,是不会触发 shouldOverrideUrlLoading 。 这是刚替换成Chrominum内核出的一个bug。本人并没在新版本上验证是否已经修复。

另外,根据不同的Rom,底层实现是不一样的,有的ROM会帮你处理各种调起scheme,也就是startActivity,有的ROM点一个url,就会抛一个intent出来,让用户选择系统浏览器进行加载。

系统默认,提供了一个接口:

有什么安全隐患呢?

戳这里

如果不知道Js怎么写, 请戳我

用PC的截图意思一下,看出区别了吧。 这里确定、取消点击以后就得调用 JsResult、JsPromptResult 的 confirm或者cancel。

因为安全问题,大一些的App Native与Js通信都不再用 WebView.addJavascriptInterface(Object) 了,都改用JsPrompt,因为JsPrompt中有message、有JsPromptResult可以返回给Js一些信息,所以桥选中了JsPrompt,另一个备选方案是JsConsole。

大体有这么几种方式进行传递

具体方案实现时,多方面考虑使用何种方式。

还有一个比较牛逼的

系统源码中均有方法注释,怎么用自己看吧。

那么问题来了

查了下,只有这两个相关的:

WebBackForwardList copyBackForwardList()

void clearHistory()

系统提供的关于历史记录的操作并不多,因为,不支持单条删除啊,啊啊啊!

WebViewClient中,还有一个相关callback,当系统更新历史记录时回调:

void doUpdateVisitedHistory(WebView view, String url, boolean isReload)

b相关问题分析法:历史栈回退错误的定位/b

绝大多数回退错误是由于接口调用、回调中逻辑执行时序错误。

定位方法:利用 copyBackForwardList , doUpdateVisitedHistory 两个接口在 loadUrl、onPageStart、onPageFinish 以及逻辑相关的地方调用,打log,查看历史栈,这里注意下由于loadurl是异步的,需要考虑是否加延迟等等保证调用时机的准确。

本人曾经遇到一个问题:在WebChromeClient中的 JsPrompt回调中,直接进行WebView.goBack操作,结果发现WebView确实回退到上一个页面,但是BackFowardList当前页面的index未更新的问题,具体见另一个篇blog。

网上有很多关于WebView内存泄露的讨论,据传,老版本的WebView在展示大量图片的时候,即使 WebView.destory() WebView=null ,也不会销毁。

在新版本上,实际测试结果:compileSDKVersion 23 不会泄露。

一般,我们如何销毁WebView比较保险?

这个问题好大。。。

暂时不介绍,另起blog进行说明。

解决方案:

实现回调 void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error)

首先,提几个需要注意的点:

个人归纳总结几点:

step1 进入开发者模式,勾选“显示布局边界”;

step 2,回到你想查看的界面; step 3 假如内容区只有一层基本就是H5 WebView的,多个层级,就是Native。

看到左右图的差异了吧。

还有另一种方法,RD屌丝们看这里,特别说明,这种方法不太适合浏览器。 (自有内核,可能会不准确)

好了,就介绍到这里,零零散散的几年前写的文章,第一篇blog,如有不对的地方,还恳请大家指正。

Android:最全面的 Webview 详解

WebView是一个基于webkit引擎、展现web页面的控件。

一般来说Webview可单独使用,可联合其子类一起使用,所以接下来,我会介绍:

常见用法:Back键控制网页后退

WebSettings类

配置步骤2:生成一个WebView组件(有两种方式)

配置步骤3:进行配置-利用WebSettings子类(常见方法)

常见用法:设置WebView缓存

注意: 每个 Application 只调用一次 WebSettings.setAppCachePath(),WebSettings.setAppCacheMaxSize()

常见方法2:onPageStarted()

常见方法3:onPageFinished()

常见方法4:onLoadResource()

常见方法5:onReceivedError()

常见方法6:onReceivedSslError()

常见方法2: onReceivedTitle()

android下打开Web浏览器的几种常见的方法

android下打开Web浏览器的几种常见的方法如下:

一。通过意图实现浏览

//通过下述方法打开浏览器

private void openBrowser(){

//urlText是一个文本输入框,输入网站地址

//Uri  是统一资源标识符

Uri  uri = Uri.parse(urlText.getText().toString());

Intent  intent = new  Intent(Intent.ACTION_VIEW, uri);

startActivity(intent);

}

注意:输入URL时,不要忘记“http://”部分。

二。利用视图打开网页,是通过调用WebKit浏览器引擎提供的WebView实现的。

具体源代码如下:

?xml version="1.0" encoding="utf-8"?

LinearLayout xmlns:android=""

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

TextView 

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="@string/hello"

/

LinearLayout android:orientation="horizontal"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

EditText

android:layout_width="240dp"

android:layout_height="wrap_content"

android:id="@+id/edutWebSite"

android:hint="输入网址"

android:singleLine="true"

android:layout_marginRight="5dp"

/

Button

android:id="@+id/searchBtn"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="搜索"

android:layout_marginRight="5dp"

/

/LinearLayout

LinearLayout android:orientation="horizontal"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

Button

android:id="@+id/backBtn"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="上一页"

android:layout_marginRight="5dp"

/

Button

android:id="@+id/nextBtn"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="下一页"

android:layout_marginRight="5dp"

/

/LinearLayout

WebView android:id="@+id/webView1" android:layout_width="match_parent"

android:layout_height="match_parent"/WebView

/LinearLayout

/res/src/com.myandroid

package com.myandroid;

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.webkit.URLUtil;

import android.webkit.WebView;

import android.widget.Button;

import android.widget.EditText;

import android.widget.Toast;

public class WebViewActivity extends Activity {

private Button  schBtn,backBtn,nextBtn;

private WebView  webView;

private EditText  mText;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

schBtn = (Button)findViewById(R.id.searchBtn);

mText = (EditText)findViewById(R.id.edutWebSite);

webView = (WebView)findViewById(R.id.webView1);

backBtn = (Button)findViewById(R.id.backBtn);

nextBtn = (Button)findViewById(R.id.nextBtn);

schBtn.setOnClickListener(new View.OnClickListener() {

public void onClick(View v) {

// TODO Auto-generated method stub

//设置可以使用Javascript

webView.getSettings().setJavaScriptEnabled(true);    String strURI = mText.getText().toString();

//检测网站的合法性

if(URLUtil.isNetworkUrl(strURI)){

webView.loadUrl(strURI);

Toast.makeText(WebViewActivity.this, strURI, Toast.LENGTH_SHORT).show();

}else{

Toast.makeText(WebViewActivity.this, "输入非法网站\n"+strURI, Toast.LENGTH_SHORT).show();

}

}

});

backBtn.setOnClickListener(new View.OnClickListener() {

public void onClick(View v) {

// TODO Auto-generated method stub

if(webView.canGoBack()){

webView.goBack();

}

}

});

nextBtn.setOnClickListener(new View.OnClickListener() {

public void onClick(View v) {

// TODO Auto-generated method stub

if(webView.canGoForward()){

webView.goForward();

}

}

});

}

}

同时还要在AndroidManifest.xml中添加访问因特网的权限:

uses-permission android:name="android.permission.INTERNET"/


本文题目:androidweb,AndroidWebView47版本含哪些手机的什么版本?
网站URL:http://azwzsj.com/article/hoepgo.html