WebView的介绍与简单实现Android和H5互调的方法

为什么要学习Android与H5互调?

微信,QQ空间等大量软件都内嵌了H5,不得不说是一种趋势。Android与H5互调可以让我们的实现混合开发,至于混合开发就是在一个App中内嵌一个轻量级的浏览器,一部分原生的功能改为Html 5来开发。

优势:使用H5实现的功能能够在不升级App的情况下动态更新,而且可以在Android或iOS的App上同时运行,节约了成本,提高了开发效率。

原理:其实就是Java代码和JavaScript之间的调用。

开局插入一张文章的目录结构:

WebView简介

要实现Android与H5互调,WebView是一个很重要的控件,WebView可以很好地帮助我们展示html页面,所以有必要先了解一下WebView。

一丶WebView常用方法

loadUrl

加载界面,其次还有LoadData和LoadDataWithBase方法

//加载assets目录下的test.html文件
webView.loadUrl("file:///android_asset/test.html");
//加载网络资源(注意要加上网络权限)
webView.loadUrl(http://blog.csdn.net);

setWebViewClient(如果用户设置了WebViewClient,则在点击新的链接以后就不会跳转到系统浏览器了,而是在本WebView中显示。注意:并不需要覆盖 shouldOverrideUrlLoading 方法,同样可以实现所有的链接都在 WebView 中打开。)

WebViewClient主要用来辅助WebView处理各种通知、请求等事件,通过setWebViewClient方法设置。以下是它的几种常见用法:

实现对网页中超链接的拦截(比如如果是极客导航的主页,则直接拦截转到百度主页):

当点击页面中的链接后,会在WebView加载URL前回调shouldOverrideUrlLoading(WebView view, String url)方法,一般点击一个链接此方法调用一次。

 webView.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
 if("http://www.jikedaohang.com/".equals(url)) {
 view.loadUrl("https://www.baidu.com/");
 }
 return true;
 }
 });

关于shouldOverrideUrlLoading返回值的误区:网上很多解释是return true代表在本WebView中打开链接,return false代表调用系统浏览器打开链接。其实只要设置了WebViewClient,则就不会调用系统浏览器。

那么shouldOverrideUrlLoading的返回值到底代表什么呢?return true,则在打开新的url时WebView就不会再加载这个url了,所有处理都需要在WebView中操作,包含加载;return false,则系统就认为上层没有做处理,接下来还是会继续加载这个url的;默认return false。具体的区别展示如下:

加载百度主页,设置WebViewClient后,重写shouldOverrideUrlLoading(WebView view, String url)方法,第一张是返回false的截图(点击后正常跳转),第二章是返回true的截图(点击无反应,如果希望能够跳转,则需要我们自己进行处理):

还有一点需要注意的是,如果我们拦截了某个url,那么return false 和 return true区别不大,所以一般建议 return false。

加载网页时替换某个资源(比如在加载一个网页时,需要加载一个logo图片,而我们想要替换这个logo图片,用我们assets目录下的一张图片替代)

我们知道我们在加载一个网页的同时也会加载js,css,图片等资源,所以会多次调用shouldInterceptRequest方法,我们可以在shouldInterceptRequest中进行图片替换。

注意:shouldInterceptRequest有两个重载:

public WebResourceResponse shouldInterceptRequest (WebView view, String url) 【已过时】

public WebResourceResponse shouldInterceptRequest (WebView view, WebResourceRequest request)

这两种方法主要是第二个参数的不同,WebResourceRequest 将能够获取更多的信息,提供了getUrl(),getMethod,getRequestHeaders等方法。这里主要是为了展示效果,使用了第一种回调方法。实现方法如下:

mWebView.setWebViewClient(new WebViewClient(){
 @Override
 public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
 WebResourceResponse response = null;
 if (url.contains("logo")) {
 try {
 InputStream logo = getAssets().open("logo.png");
 response = new WebResourceResponse("image/png", "UTF-8", logo);
 } catch (IOException e) {
 e.printStackTrace();
 }
 }
 return response;
 }
 });

设置开始加载网页、加载完成、加载错误时处理

webView.setWebViewClient(new WebViewClient() { 

 @Override
 public void onPageStarted(WebView view, String url, Bitmap favicon) {
 super.onPageStarted(view, url, favicon);
 // 开始加载网页时处理 如:显示"加载提示" 的加载对话框
 ...
 } 

 @Override
 public void onPageFinished(WebView view, String url) {
 super.onPageFinished(view, url);
 // 网页加载完成时处理 如:让 加载对话框 消失
 ...
 } 

 @Override
 public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
 super.onReceivedError(view, errorCode, description, failingUrl);
 // 加载网页失败时处理 如:提示失败,或显示新的界面
 ...
 }
}); 

处理https请求,为WebView处理ssl证书设置WebView默认是不处理https请求的,需要在WebViewClient子类中重写父类的onReceivedSslError函数

webView.setWebViewClient(new WebViewClient() {
 @Override
 public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
 handler.proceed(); // 接受信任所有网站的证书
 // handler.cancel(); // 默认操作 不处理
 // handler.handleMessage(null); // 可做其他处理
 }
}); 

setWebChromeClient

WebChromeClient主要用来辅助WebView处理Javascript的对话框、网站图标、网站标题以及网页加载进度等。通过WebView的setWebChromeClient()方法设置。

显示页面加载进度在WebChromeClient子类中重写父类的onProgressChanged函数,progress表示当前页面加载的进度,为1至100的整数

webView.setWebChromeClient(new WebChromeClient() {
 public void onProgressChanged(WebView view, int progress) {
 setTitle("页面加载中,请稍候..." + progress + "%");
 setProgress(progress * 100); 

 if (progress == 100) {
 //...
 }
 }
}); 

加快HTML网页加载完成速度(默认情况html代码下载到WebView后,webkit开始解析网页各个节点,发现有外部样式文件或者外部脚本文件时,会异步发起网络请求下载文件,但如果在这之前也有解析到image节点,那势必也会发起网络请求下载相应的图片。在网络情况较差的情况下,过多的网络请求就会造成带宽紧张,影响到css或js文件加载完成的时间,造成页面空白loading过久。解决的方法就是告诉WebView先不要自动加载图片,等页面finish后再发起图片加载。)

//1.首先在WebView初始化时添加如下代码
if(Build.VERSION.SDK_INT >= 19) {
/*对系统API在19以上的版本作了兼容。因为4.4以上系统在onPageFinished时再恢复图片加载时,如果存在多张图片引用的是相同的src时,会只有一个image标签得到加载,因而对于这样的系统我们就先直接加载。*/ webView.getSettings().setLoadsImagesAutomatically(true);
 } else {
 webView.getSettings().setLoadsImagesAutomatically(false);
 } 

//2.在WebView的WebViewClient子类中重写onPageFinished()方法添加如下代码:
 @Override
public void onPageFinished(WebView view, String url) {
 if(!webView.getSettings().getLoadsImagesAutomatically()) {
 webView.getSettings().setLoadsImagesAutomatically(true);
 }
} 

setDownloadListener

通常webview渲染的界面中含有可以下载文件的链接,点击该链接后,应该开始执行下载的操作并保存文件到本地中。

创建DownloadListener

class MyDownloadListenter implements DownloadListener{
 @Override
 public void onDownloadStart(String url, String userAgent,String contentDisposition, String mimetype, long contentLength) {
 //下载任务...,主要有两种方式
 //(1)自定义下载任务
 //(2)调用系统的download的模块
 Uri uri = Uri.parse(url);
 Intent intent = new Intent(Intent.ACTION_VIEW, uri);
 startActivity(intent);
 }
}

给webview加入监听

webview.setDownloadListener(new MyDownloadListenter());

goBack()

返回上一浏览页面,通过重写onKeyDown方法实现点击返回键返回上一浏览页面而非退出程序

public boolean onKeyDown(int keyCode, KeyEvent event) {
//其中webView.canGoBack()在webView含有一个可后退的浏览记录时返回true
 if ((keyCode == KeyEvent.KEYCODE_BACK) && webView.canGoBack()) {
 webView.goBack();
 return true;
 }
 return super.onKeyDown(keyCode, event);
 }
}

二丶WebSettings配置

获取WebSettings对象

WebSettings webSettings = webView.getSettings();

常用设置方法

(1)支持js

settings.setJavaScriptEnabled(true);

(2)设置缓存方式,主要有以下几种:

LOAD_CACHE_ONLY: 不使用网络,只读取本地缓存数据。

LOAD_DEFAULT: 根据cache-control决定是否从网络上取数据。

LOAD_CACHE_NORMAL: API level 17中已经废弃, 从API level 11开始作用同LOAD_DEFAULT模式。

LOAD_NO_CACHE: 不使用缓存,只从网络获取数据。

LOAD_CACHE_ELSE_NETWORK:只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据。

settings.setCacheMode(WebSettings.LOAD_NO_CACHE);

(3)开启DOM storage API功能(HTML5 提供的一种标准的接口,主要将键值对存储在本地,在页面加载完毕后可以通过 JavaScript 来操作这些数据。)

settings.setDomStorageEnabled(true);

(4)设置数据库缓存路径

settings.setDatabasePath(cacheDirPath);

(5)设置Application Caches缓存目录

settings.setAppCachePath(cacheDirPath);

(6)设置默认编码

settings.setDefaultTextEncodingName(“utf-8”);

(7)将图片调整到适合webview的大小

settings.setUseWideViewPort(false);

(8)支持缩放

settings.setSupportZoom(true);

(9)支持内容重新布局

settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);

(10)多窗口

settings.supportMultipleWindows();

(11)设置可以访问文件

settings.setAllowFileAccess(true);

(12)当webview调用requestFocus时为webview设置节点

settings.setNeedInitialFocus(true);

(13)设置支持缩放

settings.setBuiltInZoomControls(true);

(14)支持通过JS打开新窗口

settings.setJavaScriptCanOpenWindowsAutomatically(true);

(15)缩放至屏幕的大小

settings.setLoadWithOverviewMode(true);

(16)支持自动加载图片

settings.setLoadsImagesAutomatically(true);

三丶WebViewClient 的回调方法列表

WebViewClient主要用来辅助WebView处理各种通知、请求等事件,通过setWebViewClient方法设置。

(1)更新历史记录

doUpdateVisitedHistory(WebView view, String url, boolean isReload)

(2)应用程序重新请求网页数据

onFormResubmission(WebView view, Message dontResend, Message resend)

(3)在加载页面资源时会调用,每一个资源(比如图片)的加载都会调用一次。

onLoadResource(WebView view, String url)

(4)开始载入页面调用,通常我们可以在这设定一个loading的页面,告诉用户程序在等待网络响应。

onPageStarted(WebView view, String url, Bitmap favicon)

(5)在页面加载结束时调用。同样道理,我们知道一个页面载入完成,于是我们可以关闭loading 条,切换程序动作。

onPageFinished(WebView view, String url)

(6)报告错误信息

onReceivedError(WebView view, int errorCode, String description, String failingUrl)

(7)获取返回信息授权请求

onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host,String realm)

(8)重写此方法可以让webview处理https请求。

onReceivedSslError(WebView view, SslErrorHandler handler, SslError error)

(9)WebView发生改变时调用

onScaleChanged(WebView view, float oldScale, float newScale)

(10)Key事件未被加载时调用

onUnhandledKeyEvent(WebView view, KeyEvent event)

(11)重写此方法才能够处理在浏览器中的按键事件。

shouldOverrideKeyEvent(WebView view, KeyEvent event)

(12)在网页跳转时调用,这个函数我们可以做很多操作,比如我们读取到某些特殊的URL,于是就可以不打开地址,取消这个操作,进行预先定义的其他操作,这对一个程序是非常必要的。

shouldOverrideUrlLoading(WebView view, String url)

(13)在加载某个网页的资源的时候多次调用(已过时)

shouldInterceptRequest(WebView view, String url)

(14)在加载某个网页的资源的时候多次调用

shouldInterceptRequest(WebView view, WebResourceRequest request)

注意:

  • shouldOverrideUrlLoading在网页跳转的时候调用,且一般每跳转一次只调用一次。
  • shouldInterceptRequest只要是网页加载的过程中均会调用,资源加载的时候都会回调该方法,会多次调用。

四丶WebChoromeClient的回调方法列表

WebChromeClient主要用来辅助WebView处理Javascript的对话框、网站图标、网站标题以及网页加载进度等。通过WebView的setWebChromeClient()方法设置。

(1)监听网页加载进度

onProgressChanged(WebView view, int newProgress)

(2)监听网页标题 : 比如百度页面的标题是“百度一下,你就知道”

onReceivedTitle(WebView view, String title)

(3)监听网页图标

onReceivedIcon(WebView view, Bitmap icon)

Java和JavaScript互调

为方便展示,使用addJavascriptInterface方式实现与本地js交互(存在漏洞)。也可通过其他方式实现,比如拦截ur进行参数解析l等。

Java调JS

首先是JS的一段代码:

function javaCallJs(arg){
 document.getElementById("content").innerHTML =
 ("欢迎:"+arg );
 }

然后是在java中调用JS中的方法

webView.loadUrl("javascript:javaCallJs("+"'"+name+"'"+")");

以上代码就是调用了JS中一个叫javaCallJs(arg)的方法,并传入了一个name参数。(具体效果下面有展示)

JS调java

配置Javascript接口

webView.addJavascriptInterface(new JSInterface (),"Android");

实现Javascript接口类

class JSInterface {
 @JavascriptInterface
 public void showToast(String arg){
 Toast.makeText(MainActivity.this,arg,Toast.LENGTH_SHORT).show();
 }
}

JS中调用java代码

<input type="button" value="点击Android被调用" onclick="window.Android.showToast('JS中传来的参数')"/>

window.Android.showToast(‘JS中传来的参数')”中的”Android”即addJavascriptInterface()中指定的,并且JS向java传递了参数,类型为String。而showToast(String arg)会以Toast的形式弹出此参数。

java与JS互调代码示例

先看效果图:

代码非常简单,并且加了注释,直接看代码就可以了。

首先是本地的JavaAndJavaScriptCall.html文件,放在asstes目录下

<html>
<head>
 <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
 <script type="text/javascript">

 function javaCallJs(arg){
 document.getElementById("content").innerHTML =
 ("欢迎:"+arg );
 }

 </script>
</head>
<body>
 <div id="content"> 请在上方输入您的用户名</div>
 <input type="button" value="点击Android被调用" onclick="window.Android.showToast('JS中传来的参数')"/>
</body>
</html>

javaCallJs是java调用JS的方法,showToast方法是JS调用java的方法

接下来是布局文件,activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:id="@+id/ll_root"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical"
 tools:context=".MainActivity">
 <LinearLayout
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:orientation="horizontal"
 android:padding="20dp"
 android:background="#000088">
 <EditText
 android:id="@+id/et_user"
 android:layout_width="0dp"
 android:layout_height="wrap_content"
 android:hint="输入WebView中要显示的用户名"
 android:background="#008800"
 android:textSize="16sp"
 android:layout_weight="1"/>
 <Button
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_marginLeft="40dp"
 android:layout_marginRight="20dp"
 android:textSize="16sp"
 android:text="确定"
 android:onClick="click"/>
 </LinearLayout>
</LinearLayout>

很简单,就是一个输入框和一个确定按钮,点击按钮会调用JS中的方法。

MainActivity

package com.wangjian.webviewdemo;
import android.annotation.SuppressLint;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.JavascriptInterface;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
 private WebView webView;
 private LinearLayout ll_root;
 private EditText et_user;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 ll_root = (LinearLayout) findViewById(R.id.ll_root);
 et_user = (EditText) findViewById(R.id.et_user);
 initWebView();
 }

 //初始化WebView
 private void initWebView() {
 //动态创建一个WebView对象并添加到LinearLayout中
 webView = new WebView(getApplication());
 LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
 webView.setLayoutParams(params);
 ll_root.addView(webView);
 //不跳转到其他浏览器
 webView.setWebViewClient(new WebViewClient() {
 @Override
 public boolean shouldOverrideUrlLoading(WebView view, String url) {
 view.loadUrl(url);
 return true;
 }
 });
 WebSettings settings = webView.getSettings();
 //支持JS
 settings.setJavaScriptEnabled(true);
 //加载本地html文件
 webView.loadUrl("file:///android_asset/JavaAndJavaScriptCall.html");
 webView.addJavascriptInterface(new JSInterface(),"Android");
 }

 //按钮的点击事件
 public void click(View view){
 //java调用JS方法
 webView.loadUrl("javascript:javaCallJs(" + "'" + et_user.getText().toString()+"'"+")");
 }

 //在页面销毁的时候将webView移除
 @Override
 protected void onDestroy() {
 super.onDestroy();
 ll_root.removeView(webView);
 webView.stopLoading();
 webView.removeAllViews();
 webView.destroy();
 webView = null;
 }

 private class JSInterface {
 //JS需要调用的方法
 @JavascriptInterface
 public void showToast(String arg){
 Toast.makeText(MainActivity.this,arg,Toast.LENGTH_SHORT).show();
 }
 }
}

需要注意的地方

参考链接:安卓webview的一些坑

  • webView.addJavascriptInterface()方法在API 17之前有一些漏洞(有兴趣的可以参考本篇文章,WebView 远程代码执行漏洞浅析),所以在API 17以后,需要在JavaScript接口类的方法加上@JavascriptInterface注解。
  • 仔细看的话你会发现我们上面的WebView对象并不是直接写在布局文件中的,而是通过一个LinearLayout容器,使用addview(webview)动态向里面添加的。另外需要注意创建webview需要使用applicationContext而不是activity的context,销毁时不再占有activity对象,最后离开的时候需要及时销毁webview,onDestory()中应该先从LinearLayout中remove掉webview,再调用webview.removeAllViews();webview.destory();
  • 如果想要webView在产生OOM的时候不影响主进程,可以另开一个进程,在androidmanifest.xml的activity标签里加上Android:process属性就可以了。
  • 在activity被杀死之后,依然保持webView的状态,方便用户下次打开的时候可以回到之前的状态。webview支持saveState(bundle)restoreState(bundle)方法。

保存状态

@Override
protected void onSaveInstanceState(Bundle outState) {
 super.onSaveInstanceState(outState);
 wv.saveState(outState);
 Log.e(TAG, "save state...");
} 

恢复状态(在activity的onCreate(bundle savedInstanceState)里)

if(null!=savedInstanceState){
 wv.restoreState(savedInstanceState);
 Log.i(TAG, "restore state");
}else{
 wv.loadUrl("http://3g.cn");
} 

其他一些常见问题:

1. WebViewClient.onPageFinished()。

你永远无法确定当WebView调用这个方法的时候,网页内容是否真的加载完毕了。当前正在加载的网页产生跳转的时候这个方法可能会被多次调用,StackOverflow上有比较具体的解释(How to listen for a Webview finishing loading a URL in Android?), 但其中列举的解决方法并不完美。所以当你的WebView需要加载各种各样的网页并且需要在页面加载完成时采取一些操作的话,可能WebChromeClient.onProgressChanged()比WebViewClient.onPageFinished()都要靠谱一些。

2. WebView后台耗电问题。

当你的程序调用了WebView加载网页,WebView会自己开启一些线程(?),如果你没有正确地将WebView销毁的话,这些残余的线程(?)会一直在后台运行,由此导致你的应用程序耗电量居高不下。对此我采用的处理方式比较偷懒,简单又粗暴(不建议),即在Activity.onDestroy()中直接调用System.exit(0) ,使得应用程序完全被移出虚拟机,这样就不会有任何问题了。

3. 切换WebView闪屏问题。

如果你需要在同一个ViewGroup中来回切换不同的WebView(包含了不同的网页内容)的话,你就会发现闪屏是不可避免的。这应该是Android硬件加速的Bug,如果关闭硬件加速这种情况会好很多,但无法获得很好的浏览体验,你会感觉网页滑动的时候一卡一卡的,不跟手。

4. 在某些手机上,Webview有视频时,activity销毁后,视频资源没有被销毁,甚至还能听到在后台播放。即便是像刚才那样各种销毁webview也无济于事,解决办法:在onDestory之前修改url为空地址。

5.WebView硬件加速导致页面渲染闪烁问题

关于Android硬件加速 开始于Android 3.0 (API level 11),开启硬件加速后,WebView渲染页面更加快速,拖动也更加顺滑。但有个副作用就是容易会出现页面加载白块同时界面闪烁现象。解决这个问题的方法是设置WebView暂时关闭硬件加速 代码如下:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • Android使用WebView实现截图分享功能

    在APP项目的开发过程中,经常会用到分享图片的功能,有时候还需要根据当前用户信息获取指定的分享图片,比如要求在用户分享图中显示用户名.Uid.用户头像等信息.想到的实现方法主要有两点: 1.通过android SDK自带的Canvas方法进行绘制. 2.通过webView实现客户端与H5交互,然后将H5界面做截图处理. 本文主要介绍第二种方式的实现过程,第一种方式的实现方法,后续有时间会在博客中做说明,下面开始本文内容. 首先确定我们要实现的逻辑: 1.客户端与H5的交互,客户端将用户信息(用户

  • 关于Android中WebView远程代码执行漏洞浅析

    1. WebView 远程代码执行漏洞描述 Android API level 16以及之前的版本存在远程代码执行安全漏洞,该漏洞源于程序没有正确限制使用WebView.addJavascriptInterface方法,远程攻击者可通过使用Java Reflection API利用该漏洞执行任意Java对象的方法,简单的说就是通过addJavascriptInterface给WebView加入一个JavaScript桥接接口,JavaScript通过调用这个接口可以直接操作本地的JAVA接口.该

  • Android使用WebView实现文件下载功能

    本文实例为大家分享了WebView实现文件下载功能的具体代码,供大家参考,具体内容如下 本节引言 本节给大家介绍的是WebView下载文件的知识点,当我们在使用普通浏览器的时候,比如UC, 当我们点击到一个可供下载链接的时候,就会进行下载,WebView作为一个浏览器般的组件, 当然也是支持下载,我们可以自己来写下载的流程,设置下载后的文件放哪,以什么文件名 保存,当然也可以调用其它内置的浏览器来进行下载,比如Chrome,UC等等! 下面给大家演示下用法! 1.调用其它浏览器下载文件: 这个很

  • Android实现视频播放--腾讯浏览服务(TBS)功能

    TBS视频播放 TBS视频播放器可以支持市面上几乎所有的视频格式,包括mp4, flv, avi, 3gp, webm, ts, ogv, m3u8, asf, wmv, rm, rmvb, mov, mkv等18种视频格式.同时支持硬件解码,使得内存占用,稳定性相较于系统播放器都更优. 接入TBS 1.导入jar文件和so文件 官网SDK下载地址:https://x5.tencent.com/tbs/sdk.html,示例中有jar文件和so文件,具体导入方式我上一篇文章有详细介绍(Andro

  • Android WebView实现截长图功能

    本文实例为大家分享了Android实现截长图功能的具体代码,供大家参考,具体内容如下 先看看手机自带的长截屏功能:  机型: vivo x9 plus 大胆推测实现逻辑: 1:需要一个可以滚动的View 2:截取View在屏幕渲染的内容 3:不断滚动View,截取View渲染的内容,存储到容器中 4:将容器中图片,按顺序拼接组装起来. 5.保存 根据我们推测的逻辑,一步步实现: 1.我们这里以WebView控件为介绍对象 <WebView android:id="@+id/web_view

  • Android开发笔记之如何正确获取WebView的网页Title

    前言 现在APP中用到H5页面的越来越多,而如何正确获取WebView的网页title是必须要考虑的. 最近做项目的时候,老大让我把之前做的webview打开网页的功能修改一下,说是要动态的获取网页的标题,然后显示在我们自己app的标题栏上,然后我就屁颠屁颠的跑去看webview的源码,看看有没有获取标题这个方法. 网上能查的大部分方法都是在WebChromeClient的onReceivedTitle(WebView view, String title)中拿到title.但是这个方法在网页回

  • 快速解决android webview https图片不显示的问题

    Android webview 从Lollipop(5.0)开始webview默认不允许混合模式,https当中不能加载http资源,需要设置开启. 解决方法: if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { webview.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); } 以上这篇快速解决android webview

  • Android混合开发教程之WebView的使用方法总结

    前言: 今天修改项目中一个有关WebView使用的bug,激起了我总结WebView的动机,今天抽空做个总结. 简介 WebView是一个基于webkit引擎.展现web页面的控件. Android的Webview在低版本和高版本采用了不同的webkit版本内核,4.4后直接使用了Chrome. 作用 显示和渲染Web页面 直接使用html文件(网络上或本地assets中)作布局 可和JavaScript交互调用 WebView控件功能强大,除了具有一般View的属性和设置外,还可以对url请求

  • Android在项目中接入腾讯TBS浏览器WebView的教程与注意的地方

    腾讯TBS浏览器服务 我们都知道,在Android开发中,经常会用到Webview,而且WebView是出了名的坑的,各种bug.这时候腾讯老哥站出来了,搞了一个TBS浏览器服务这个东西. 说得这么屌,其实就是一个webView控件,然后解析解析网页的内核是他自己做的,叫X5内核(系统原生的WebView用的是WebKit内核),所以我们开发者用的时候,主要就是用这个com.tencent.smtt.sdk.WebView控件 当然这个控件有很多功能,当然也有些要注意的地方. 官网地址:http

  • WebView的介绍与简单实现Android和H5互调的方法

    为什么要学习Android与H5互调? 微信,QQ空间等大量软件都内嵌了H5,不得不说是一种趋势.Android与H5互调可以让我们的实现混合开发,至于混合开发就是在一个App中内嵌一个轻量级的浏览器,一部分原生的功能改为Html 5来开发. 优势:使用H5实现的功能能够在不升级App的情况下动态更新,而且可以在Android或iOS的App上同时运行,节约了成本,提高了开发效率. 原理:其实就是Java代码和JavaScript之间的调用. 开局插入一张文章的目录结构: WebView简介 要

  • Android与H5互调详细介绍

    Android与H5互调详细介绍 微信,微博,微商,QQ空间,大量的软件使用内嵌了H5,这个时候就需要了解Android如何更H5交互的了:有些外包公司,为了节约成本,采用Android内嵌H5模式开发,便于在iOS上直接复用页面,最终解决成本. 为什么学android也要学h5? Android很多软件都有内嵌H5的,有什么用处.优势?节约成本,提高开发效率. 实现的原理是什么? 本质是:Java代码和JavaScript调用 案例一:Java与Js简单互调 首先,在Android代码中加载H

  • 简单了解Java创建线程两种方法

    这篇文章主要介绍了简单了解Java创建线程两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Java实现并启动线程有两种方法 1.写一个类继承自Thread类,重写run方法.用start方法启动线程 2.写一个类实现Runnable接口,实现run方法.用new Thread(Runnable target).start()方法来启动 注意:start方法不是立即执行多线程,而是使得该线程变为就绪态(Runnable) 1.通过扩展Th

  • Android WebView 详解及简单实例

    WebView基本使用 WebView是View的一个子类,可以让你在activity中显示网页 可以在布局文件中写入WebView:比如下面这个写了一个填满整个屏幕的WebView: <?xml version="1.0" encoding="utf-8"?> <WebView xmlns:android="http://schemas.android.com/apk/res/android" android:id="

  • Android编程之简单逐帧动画Frame的实现方法

    本文实例讲述了Android编程之简单逐帧动画Frame的实现方法.分享给大家供大家参考,具体如下: 1.逐帧动画 即是通过播放预先排序好的图片来实现动态的画面,感觉像是放电影. 2.实现步骤: ① 在工程里面导入要播放的图片.此简单例子中为start_icon1,2,3. ② 在工程res文件目录下新建一个anim文件夹,在里面新建一个start_animation.xml格式文件,此文件用来定义动画播放图片的顺序及每一张图片显示停留时间. 代码如下: <?xml version="1.

  • PHP简单判断iPhone、iPad、Android及PC设备的方法

    本文实例讲述了PHP简单判断iPhone.iPad.Android及PC设备的方法.分享给大家供大家参考,具体如下: 因为工作需要我们需要知道是什么样了用户访问了我网站了,现在的移动设备种类多了,下面我们一起来看小编整理的一段PHP判断iPhone.iPad.Android.PC设备的例子. 我将使用Windows系统的设备定为PC,毕竟博客面向中国用户,大部分家用设备还是用的Windows系统. 原理是判断浏览器提交的USER AGENT,代码如下: <?php //获取USER AGENT

  • Android中imageview.ScaleType使用方法详细介绍

    Android中imageview.ScaleType使用方法详细介绍 ScaleType属性用以表示显示图片的方式,共有8种取值: ScaleType.CENTER:图片大小为原始大小,如果图片大小大于ImageView控件,则截取图片中间部分,若小于,则直接将图片居中显示. ScaleType.CENTER_CROP:将图片等比例缩放,让图像的短边与ImageView的边长度相同,即不能留有空白,缩放后截取中间部分进行显示. ScaleType.CENTER_INSIDE:将图片大小大于Im

  • Android简单实现自定义流式布局的方法

    本文实例讲述了Android简单实现自定义流式布局的方法.分享给大家供大家参考,具体如下: 首先来看一下 手淘HD - 商品详情 - 选择商品属性 页面的UI 商品有很多尺码,而且展现每个尺码所需要的View的大小也不同(主要是宽度),所以在从服务器端拉到数据之前,展现所有尺码所需要的行数和每一行的个数都无法确定,因此不能直接使用GridView或ListView. 如果使用LinearLayout呢? 一个LinearLayout只能显示一行,如果要展示多行,则每一行都要new一个Linear

  • Android简单实现屏幕下方Tab菜单的方法

    本文实例讲述了Android简单实现屏幕下方Tab菜单的方法.分享给大家供大家参考,具体如下: 看到很多热门的Android程序(如:新浪微博.腾讯微博.京东商城.淘宝.当当等等)使用选项卡风格作为程序界面的主框架结构,而Android的选项卡控件默认是按钮在上方的.我在网上看到有多种实现方法,这里提供一种个人觉得比较简单的.由于我对Android开发所知甚少,方法的优劣目前不好评价,欢迎各位提供更好的思路. 主要原理:设置 TabWidget 控件的 android:layout_alignP

  • Android onTouchEvent事件中onTouch方法返回值(介绍)

    1.若return false说明没有成功执行onTouch事件,在执行完onTouch里面的代码之后,onTouch事件并没有结束.因此某些组件如Gallery会自动执行它所在view里onTouch方法的代码.若在onTouch方法里面增加你的代码并且最后return false就会执行你在OnTouch方法中的处理操作了. 2.若return true说明你已经成功执行onTouch方法了,在执行完onTouch中的代码之后,这个onTouch事件就结束了.也不会再调用组件如Gallery

随机推荐