请求的url记录是保存在webviewCache.db,而url的内容是保存在webviewCache文件夹下.
为了便于理解,接下来模拟一个案例,定义一个html文件,在里面显示一张图片,用WebView加载出来,然后再试着从缓存里把这张图片读取出来并显示。
第一步:新建一个Android工程命名为WebViewCache.目录结构如下:
第二步:在assets目录下新建一个html文件,命名为index.html
!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
html
head
titleWebViewCacheDemo/title
meta http-equiv="keywords" cOntent="keyword1,keyword2,keyword3"
meta http-equiv="description" cOntent="this is my page"
meta http-equiv="content-type" cOntent="text/html; charset=UTF-8"
/head
body
img src=""/
/body
/html
第三步:修改main.xml布局文件,一个WebView控件一个Button(点击加载缓存图片用),代码如下:
?xml version="1.0" encoding="utf-8"?
LinearLayout xmlns:android=""
android:orientation="vertical" android:layout_
android:layout_
WebView android:layout_
android:layout_
android:id="@+id/webView"/
Button android:layout_
android:layout_
android:layout_gravity="center_horizontal"
android:text="从缓存读取图片"
android:id="@+id/button"/
/LinearLayout
第四步:修改主核心程序WebViewCacheDemo.java,这里我只加载了index.html文件,按钮事件暂时没写,代码如下:
package com.ljq.activity;
import java.io.File;
import java.io.FileInputStream;
import android.app.Activity;
import android.app.Dialog;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.View;
import android.webkit.WebView;
import android.widget.Button;
import android.widget.ImageView;
public class WebViewActivity extends Activity {
private WebView webView;
private static final String url="";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
webView=(WebView)findViewById(R.id.webView);
webView.loadUrl(url);
}
}
第五步:在AndroidMainifest.xml文件中加访问网络的权限:
uses-permission android:name="android.permission.INTERNET" /
楼主是想在js里调用activity里的方法吗? web是需要经过设置才能调用activity的噢
webView = (WebView) this.findViewById(R.id.webView);
webView.addJavascriptInterface(new JsObject(), TAG); //设置Javascript可用于操作Activity类
webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); //设置无边框
WebSettings settings = webView.getSettings(); //获取webView的设置对象
settings.setJavascriptEnabled(true); //允许使用Javascript脚本语言
settings.setSupportZoom(false); //设置可以支持缩放
settings.setBuiltInZoomControls(false); //隐藏webview缩放按钮
settings.setUseWideViewPort(true); //窗口
settings.setLoadWithOverviewMode(true); //界面载入模式
settings.setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN); //web内容强制满屏
注意这个TAG js是就需要用这个来调用activity的例如我的TAG = "Activity"
那js里的调用方式就是window.Activity.方法名
WebView的缓存可以分为页面缓存和数据缓存。
页面缓存是指加载一个网页时的html、JS、CSS等页面或者资源数据。这些缓存资源是由于浏览器的行为而产生,开发者只能通过配置HTTP响应头影响浏览器的行为才能间接地影响到这些缓存数据。
他们的索引存放在/data/data/package_name/databases下。他们的文件存放在/data/data/package_name/cache/xxxwebviewcachexxx下。文件夹的名字在2.x和4.x上有所不同,但都文件夹名字中都包含webviewcache。
数据缓存分为两种:AppCache和DOM Storage(Web Storage)。他们是因为页面开发者的直接行为而产生。所有的缓存数据都由开发者直接完全地掌控。
AppCache使我们能够有选择的缓冲web浏览器中所有的东西,从页面、图片到脚本、css等等。尤其在涉及到应用于网站的多个页面上的CSS和Javascript文件的时候非常有用。其大小目前通常是5M。
在Android上需要手动开启(setAppCacheEnabled),并设置路径(setAppCachePath)和容量(setAppCacheMaxSize)
Android中Webkit使用一个db文件来保存AppCache数据(my_path/ApplicationCache.db)
如果需要存储一些简单的用key/value对即可解决的数据,DOM Storage是非常完美的方案。根据作用范围的不同,有Session Storage和Local Storage两种,分别用于会话级别的存储(页面关闭即消失)和本地化存储(除非主动删除,否则数据永远不会过期)。
在Android中可以手动开启DOM Storage(setDomStorageEnabled),设置存储路径(setDatabasePath)
Android中Webkit会为DOM Storage产生两个文件(my_path/localstorage/http_h5.m.taobao.com_0.localstorage和my_path/localstorage/Databases.db)
另外,在Android中清除缓存时,如果需要清除Local Storage的话,仅仅删除Local Storage的本地存储文件是不够的,内存里面有缓存数据。如果再次进入页面,Local Storage中的缓存数据同样存在。需要杀死程序运行的当前进程再重新启动才可以。
HTML5的离线应用功能可以使得WebApp即使在网络断开的情况下仍能正常使用,这是个非常有用的功能。近来工作中也要用到HTML5离线应用功能,由于是在Android平台上做,所以自然而然的选择Webview来解析网页。但如何使Webivew支持HTML5离线应用功能呢,经过反复摸索和上网查找资料,反复做试验终于成功了。
你好。
根据你的描述,
android 显示本地html,js和css文件应该放在什么位置,
关键是你的html引用的目录地址是什么,放在同一个文件夹下最好
通过HTTP的META设置expires和cache-control
指令不区分大小写,并且具有可选参数,可以用令牌或者带引号的字符串语法。多个指令以逗号分隔。
客户端可以在HTTP请求中使用的标准 Cache-Control 指令。
Cache-Control: max-stale[=seconds]
Cache-Control: min-fresh=seconds
Cache-control: no-cache
Cache-control: no-store
Cache-control: no-transform
Cache-control: only-if-cached
服务器可以在响应中使用的标准 Cache-Control 指令。
Cache-control: no-cache
Cache-control: no-store
Cache-control: no-transform
Cache-control: public
Cache-control: private
Cache-control: proxy-revalidate
Cache-Control: max-age=seconds
Cache-control: s-maxage=seconds
拓展缓存指令不是HTTP缓存标准的一部分,使用前请注意检查 兼容性 !
Cache-control: immutable
Cache-control: stale-while-revalidate=seconds
Cache-control: stale-if-error=seconds
public
表明响应可以被任何对象(包括:发送请求的客户端,代理服务器,等等)缓存。
private
表明响应只能被单个用户缓存,不能作为共享缓存(即代理服务器不能缓存它)。
no-cache
强制所有缓存了该响应的缓存用户,在使用已存储的缓存数据前,发送带验证器的请求到原始服务器
only-if-cached
表明如果缓存存在,只使用缓存,无论原始服务器数据是否有更新
max-age=seconds
设置缓存存储的最大周期,超过这个时间缓存被认为过期(单位秒)。与Expires相反,时间是相对于请求的时间。
s-maxage=seconds
覆盖max-age 或者 Expires 头,但是仅适用于共享缓存(比如各个代理),并且私有缓存中它被忽略。
max-stale[=seconds]
表明客户端愿意接收一个已经过期的资源。 可选的设置一个时间(单位秒),表示响 应不能超过的过时时间。
min-fresh=seconds
表示客户端希望在指定的时间内获取最新的响应。
must-revalidate
缓存必须在使用之前验证旧资源的状态,并且不可使用过期资源。
proxy-revalidate
与must-revalidate作用相同,但它仅适用于共享缓存(例如代理),并被私有缓存忽略。
immutable
表示响应正文不会随时间而改变。资源(如果未过期)在服务器上不发生改变,因此客户端不应发送重新验证请求头(例如If-None-Match或If-Modified-Since)来检查更新,即使用户显式地刷新页面。在Firefox中,immutable只能被用在 https:// transactions.
发送如下指令可以关闭缓存。此外,可以参考Expires 和 Pragma 标题。
对于应用程序中不会改变的文件,你通常可以在发送响应头前添加积极缓存。这包括例如由应用程序提供的静态文件,例如图像,CSS文件和Javascript文件。另请参阅Expires标题。
缓存主要两个策略 强制缓存 ,协商缓存
强制缓存就是设置本地资源html img js等等缓存多长时间 超过时间就去服务器端取。
协商缓存就是每次都询问服务器资源是否已经过期 没有过期就使用缓存 已经过期就从服务器上重新取。
缓存流程可以分三个阶段 本地缓存,协商缓存 ,缓存失败
现在的vue项目里都不是这样缓存的 我个人感觉这是在静态页面时的缓存办法
现在都是webpack打包时通过 hash chunkhash contenthash来决定缓存方式 主要就是在请求的文件名称后面加一个id 来判断文件是否已经更新。
先把html文件下载到本地,然后更改html中js的路径为本地路径之后进行调用。
1.需要先写一个 LocalFileContentProvider
public class LocalFileContentProvider extends ContentProvider {
public static final String URI_PREFIX = "content://com.youpackage";//这里更改为你的包名
public static String constructUri(String url) {
Uri uri = Uri.parse(url);
return uri.isAbsolute() ? url : URI_PREFIX + url;
}
@Override
public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
File file = new File(uri.getPath());
ParcelFileDescriptor parcel = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY);
return parcel;
}
@Override
public boolean onCreate() {
return true;
}
@Override
public int delete(Uri uri, String s, String[] as) {
throw new UnsupportedOperationException("Not supported by this provider");
}
@Override
public String getType(Uri uri) {
throw new UnsupportedOperationException("Not supported by this provider");
}
@Override
public Uri insert(Uri uri, ContentValues contentvalues) {
throw new UnsupportedOperationException("Not supported by this provider");
}
@Override
public Cursor query(Uri uri, String[] as, String s, String[] as1, String s1) {
throw new UnsupportedOperationException("Not supported by this provider");
}
@Override
public int update(Uri uri, ContentValues contentvalues, String s, String[] as) {
throw new UnsupportedOperationException("Not supported by this provider");
}
}
2. 类似 jsUrl为网络端url jsPath为本地路径 data为html文件的字符串内容
data = data.replace(jsUrl, LocalFileContentProvider.URI_PREFIX+jsPath);
mWebView.loadDataWithBaseURL("", data, "text/html", "UTF-8", "");