Android中,每个WebView实例都有自己独立的sessionStorage存储空间,使用不同的WebView实例加载新的网页是无法共享sessionStorage数据的。
原理很好理解,每个WebView都相当于一个Web Broswer,session生命周期是与Browser的使用周期同步的-随Browser的打开而创建,随Browser的关闭(实例销毁)而销毁。
在移动web混合开发中,很多采用多页面多Activity+WebView一对一组合的加载方案,这样非单页面复用WebView的方案,想使用sessionStorage就得谨慎了。
如果想在新的WebView实例中设置sessionStorage数据以实现共享效果,可以通过使用WebViewClient类中的shouldInterceptRequest方法来实现。该方法会在WebView加载资源时被调用,可以在其中设置sessionStorage数据。
代码示例:
private WebView webView1; private WebView webView2; // 在onCreate()方法中初始化第一个WebView实例 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化第一个WebView webView1 = findViewById(R.id.web_view_1); webView1.getSettings().setDomStorageEnabled(true); webView1.loadUrl("https://example.com"); // 在另一个方法中加载新的WebView并共享sessionStorage数据 private void loadNewWebView() { // 初始化第二个WebView webView2 = new WebView(this); webView2.getSettings().setDomStorageEnabled(true); webView2.setWebViewClient(new WebViewClient() { @Override public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { // 在sessionStorage中设置上一个web页面的sessionStorage数据 view.evaluateJavascript("sessionStorage.setItem('key', 'value');", null); return super.shouldInterceptRequest(view, request); // 加载第二个网页 webView2.loadUrl("https://example.com/newpage"); 那么问题来了,上一个web页面的sessionStorage数据怎么取? 要用到WebView的evaluateJavascript()方法,代码示例: // 获取sessionStorage数据 private void getSessionStorageData() { webView.evaluateJavascript("sessionStorage.getItem('key');", new ValueCallback<String>() { @Override public void onReceiveValue(String value) { // 获取到的数据,可以把数据存入静态对象中,以便其它webview设置sessionStorage数据 Log.d("TAG", "Session storage data: " + value); 很多时候Android端并不知道甚至不想知道H5端的key数据,只想一股脑获取后透传给别的webview,该怎么做呢? Android的WebView没有提供直接访问sessionStorage的API,那只能骚操作了~~ 使用JavaScript代码将sessionStorage的数据转换为JSON字符串,然后通过evaluateJavascript()方法获取该字符串,最后使用Android中的JSON解析器将其转换为一个JSON对象,代码示例: // 在另一个方法中获取sessionStorage数据 private void getSessionStorageData() { // 执行JavaScript代码获取sessionStorage数据并将其转换为JSON字符串 webView.evaluateJavascript( "(function(){return JSON.stringify(sessionStorage);})();", new ValueCallback<String>() { @Override public void onReceiveValue(String value) { // 使用JSON解析器将JSON字符串转换为JSON对象 try { JSONObject sessionStorageJson = new JSONObject(value); // 获取到全部数据,可以把数据存入静态变量中,以便其它webview设置sessionStorage数据 Log.d("TAG", "Session storage data: " + sessionStorageJson.toString()); } catch (JSONException e) { e.printStackTrace(); 需要注意,evaluateJavascript()方法是异步执行的,onReceiveValue()可能未被及时调用,因此瞅好时机调用该js很重要,另外也要处理好未被调用带来的问题。 © 版权声明 文章版权归作者所有,未经允许请勿转载。THE ENDAndroid# Android WebView# sessionStorage# 多页面加载# 共享数据# evaluateJavascript()# JSON解析器 喜欢就支持以下吧点赞17 分享QQ空间微博QQ好友海报分享复制链接收藏 玩转Android Studio自定义模板插件-MVP模板为例玩转Android Studio自定义模板插件-MVP模板为例6年前 9195Android转场动画和共享元素动画兼容5.0以下版本的实现Android转场动画和共享元素动画兼容5.0以下版本的实现6年前 8789非Activity环境startActivity的正确姿势非Activity环境startActivity的正确姿势5年前 8398基于Nexus 3.x搭建Gradle Maven本地私有仓库基于Nexus 3.x搭建Gradle Maven本地私有仓库5年前 7457OkHttp实现多线程断点续传,单例模式下多任务下载管理器,一起抛掉sp,sqlite的辅助吧OkHttp实现多线程断点续传,单例模式下多任务下载管理器,一起抛掉sp,s...7年前 6999 玩转Android Studio自定义模板插件-MVP模板为例玩转Android Studio自定义模板插件-MVP模板为例6年前 9195Android转场动画和共享元素动画兼容5.0以下版本的实现Android转场动画和共享元素动画兼容5.0以下版本的实现6年前 8789非Activity环境startActivity的正确姿势非Activity环境startActivity的正确姿势5年前 8398OkHttp实现多线程断点续传,单例模式下多任务下载管理器,一起抛掉sp,sqlite的辅助吧OkHttp实现多线程断点续传,单例模式下多任务下载管理器,一起抛掉sp,sqlite的辅助吧7年前 6999Android自定义导览地图组件(一)Android自定义导览地图组件(一)7年前 6718Flutter开发之Dart线程与异步Flutter开发之Dart线程与异步5年前 6522 评论 共1条 欢迎您留下宝贵的见解!提交 2018年6月10日,来到上海的第6天Hey,沪漂的姑娘# android开发# html开发# java开发6年前3193835 玩转Android Studio自定义模板插件-MVP模板为例Android# android开发# html开发# java开发6年前491950Android转场动画和共享元素动画兼容5.0以下版本的实现Android# android开发# html开发# java开发6年前087891非Activity环境startActivity的正确姿势Android# android开发# html开发# java开发5年前083981对Redis连接池的深入理解与解析Java# android开发# html开发# java开发6年前082371基于Nexus 3.x搭建Gradle Maven本地私有仓库折腾# android开发# html开发# java开发5年前274572热门文章2018年6月10日,来到上海的第6天玩转Android Studio自定义模板插件-MVP模板为例Android转场动画和共享元素动画兼容5.0以下版本的实现非Activity环境startActivity的正确姿势对Redis连接池的深入理解与解析基于Nexus 3.x搭建Gradle Maven本地私有仓库分类 Android Flutter Harmony Hey,沪漂的姑娘 iBeacon Linux MySQL Q5080645455个月前0有没有详细的视频使用教程啊,是只有苹果电脑才可以用吗 王柏元8个月前0老哥你好,友链王柏元的博客,换了域名 baiyuan.wang 可以帮忙改下额再谈Java、Android AES加密算法填充方式 - 算法网2年前0[…] 此前写过一篇关于AES加密的文章《Android加密算法之对称加密AES》,介绍了相关概念,使用以及脱坑姿势。 […]WIND4年前0感谢博主啊啊啊 终于找到解决方案啦, 爱死你开心Blogs4年前1转载一下部分内容,已标记原出处。如有问题可联系删除!小码君4年前0很好,很实用啊今日新鲜事4年前0文章不错支持一下吧热搜榜4年前0文章不错非常喜欢标签android Android MVC Android MVI架构 Android WebView Android应用程序开发 android开发 Apache CentOS 7 EPEL仓库 evaluateJavascript() gradle html开发 java开发 JSON解析器 linux运维 maven maven代理服务器 maven服务器 Model-View-Intent架构 nexus服务器 Nginx PHP 7.4 php开发 Remi仓库 sessionStorage web开发 专注于移动互联网 响应式编程框架 多页面加载 标签云耦合度登录功能架构模式数据绑定拓展依赖开机自启多页面加载响应式编程框架响应式编程命令绑定可测试性可扩展性单元测试升级共享数据乘月网专注于移动互联网web开发sessionStorageRemi仓库 友链申请 · 皖ICP备16021437号-1 · 皖公网安备34010202600253号
那么问题来了,上一个web页面的sessionStorage数据怎么取? 要用到WebView的evaluateJavascript()方法,代码示例:
// 获取sessionStorage数据 private void getSessionStorageData() { webView.evaluateJavascript("sessionStorage.getItem('key');", new ValueCallback<String>() { @Override public void onReceiveValue(String value) { // 获取到的数据,可以把数据存入静态对象中,以便其它webview设置sessionStorage数据 Log.d("TAG", "Session storage data: " + value); 很多时候Android端并不知道甚至不想知道H5端的key数据,只想一股脑获取后透传给别的webview,该怎么做呢? Android的WebView没有提供直接访问sessionStorage的API,那只能骚操作了~~ 使用JavaScript代码将sessionStorage的数据转换为JSON字符串,然后通过evaluateJavascript()方法获取该字符串,最后使用Android中的JSON解析器将其转换为一个JSON对象,代码示例: // 在另一个方法中获取sessionStorage数据 private void getSessionStorageData() { // 执行JavaScript代码获取sessionStorage数据并将其转换为JSON字符串 webView.evaluateJavascript( "(function(){return JSON.stringify(sessionStorage);})();", new ValueCallback<String>() { @Override public void onReceiveValue(String value) { // 使用JSON解析器将JSON字符串转换为JSON对象 try { JSONObject sessionStorageJson = new JSONObject(value); // 获取到全部数据,可以把数据存入静态变量中,以便其它webview设置sessionStorage数据 Log.d("TAG", "Session storage data: " + sessionStorageJson.toString()); } catch (JSONException e) { e.printStackTrace(); 需要注意,evaluateJavascript()方法是异步执行的,onReceiveValue()可能未被及时调用,因此瞅好时机调用该js很重要,另外也要处理好未被调用带来的问题。 © 版权声明 文章版权归作者所有,未经允许请勿转载。THE ENDAndroid# Android WebView# sessionStorage# 多页面加载# 共享数据# evaluateJavascript()# JSON解析器 喜欢就支持以下吧点赞17 分享QQ空间微博QQ好友海报分享复制链接收藏 玩转Android Studio自定义模板插件-MVP模板为例玩转Android Studio自定义模板插件-MVP模板为例6年前 9195Android转场动画和共享元素动画兼容5.0以下版本的实现Android转场动画和共享元素动画兼容5.0以下版本的实现6年前 8789非Activity环境startActivity的正确姿势非Activity环境startActivity的正确姿势5年前 8398基于Nexus 3.x搭建Gradle Maven本地私有仓库基于Nexus 3.x搭建Gradle Maven本地私有仓库5年前 7457OkHttp实现多线程断点续传,单例模式下多任务下载管理器,一起抛掉sp,sqlite的辅助吧OkHttp实现多线程断点续传,单例模式下多任务下载管理器,一起抛掉sp,s...7年前 6999 玩转Android Studio自定义模板插件-MVP模板为例玩转Android Studio自定义模板插件-MVP模板为例6年前 9195Android转场动画和共享元素动画兼容5.0以下版本的实现Android转场动画和共享元素动画兼容5.0以下版本的实现6年前 8789非Activity环境startActivity的正确姿势非Activity环境startActivity的正确姿势5年前 8398OkHttp实现多线程断点续传,单例模式下多任务下载管理器,一起抛掉sp,sqlite的辅助吧OkHttp实现多线程断点续传,单例模式下多任务下载管理器,一起抛掉sp,sqlite的辅助吧7年前 6999Android自定义导览地图组件(一)Android自定义导览地图组件(一)7年前 6718Flutter开发之Dart线程与异步Flutter开发之Dart线程与异步5年前 6522 评论 共1条 欢迎您留下宝贵的见解!提交 2018年6月10日,来到上海的第6天Hey,沪漂的姑娘# android开发# html开发# java开发6年前3193835 玩转Android Studio自定义模板插件-MVP模板为例Android# android开发# html开发# java开发6年前491950Android转场动画和共享元素动画兼容5.0以下版本的实现Android# android开发# html开发# java开发6年前087891非Activity环境startActivity的正确姿势Android# android开发# html开发# java开发5年前083981对Redis连接池的深入理解与解析Java# android开发# html开发# java开发6年前082371基于Nexus 3.x搭建Gradle Maven本地私有仓库折腾# android开发# html开发# java开发5年前274572热门文章2018年6月10日,来到上海的第6天玩转Android Studio自定义模板插件-MVP模板为例Android转场动画和共享元素动画兼容5.0以下版本的实现非Activity环境startActivity的正确姿势对Redis连接池的深入理解与解析基于Nexus 3.x搭建Gradle Maven本地私有仓库分类 Android Flutter Harmony Hey,沪漂的姑娘 iBeacon Linux MySQL Q5080645455个月前0有没有详细的视频使用教程啊,是只有苹果电脑才可以用吗 王柏元8个月前0老哥你好,友链王柏元的博客,换了域名 baiyuan.wang 可以帮忙改下额再谈Java、Android AES加密算法填充方式 - 算法网2年前0[…] 此前写过一篇关于AES加密的文章《Android加密算法之对称加密AES》,介绍了相关概念,使用以及脱坑姿势。 […]WIND4年前0感谢博主啊啊啊 终于找到解决方案啦, 爱死你开心Blogs4年前1转载一下部分内容,已标记原出处。如有问题可联系删除!小码君4年前0很好,很实用啊今日新鲜事4年前0文章不错支持一下吧热搜榜4年前0文章不错非常喜欢标签android Android MVC Android MVI架构 Android WebView Android应用程序开发 android开发 Apache CentOS 7 EPEL仓库 evaluateJavascript() gradle html开发 java开发 JSON解析器 linux运维 maven maven代理服务器 maven服务器 Model-View-Intent架构 nexus服务器 Nginx PHP 7.4 php开发 Remi仓库 sessionStorage web开发 专注于移动互联网 响应式编程框架 多页面加载 标签云耦合度登录功能架构模式数据绑定拓展依赖开机自启多页面加载响应式编程框架响应式编程命令绑定可测试性可扩展性单元测试升级共享数据乘月网专注于移动互联网web开发sessionStorageRemi仓库 友链申请 · 皖ICP备16021437号-1 · 皖公网安备34010202600253号
很多时候Android端并不知道甚至不想知道H5端的key数据,只想一股脑获取后透传给别的webview,该怎么做呢?
Android的WebView没有提供直接访问sessionStorage的API,那只能骚操作了~~
使用JavaScript代码将sessionStorage的数据转换为JSON字符串,然后通过evaluateJavascript()方法获取该字符串,最后使用Android中的JSON解析器将其转换为一个JSON对象,代码示例:
// 在另一个方法中获取sessionStorage数据 private void getSessionStorageData() { // 执行JavaScript代码获取sessionStorage数据并将其转换为JSON字符串 webView.evaluateJavascript( "(function(){return JSON.stringify(sessionStorage);})();", new ValueCallback<String>() { @Override public void onReceiveValue(String value) { // 使用JSON解析器将JSON字符串转换为JSON对象 try { JSONObject sessionStorageJson = new JSONObject(value); // 获取到全部数据,可以把数据存入静态变量中,以便其它webview设置sessionStorage数据 Log.d("TAG", "Session storage data: " + sessionStorageJson.toString()); } catch (JSONException e) { e.printStackTrace(); 需要注意,evaluateJavascript()方法是异步执行的,onReceiveValue()可能未被及时调用,因此瞅好时机调用该js很重要,另外也要处理好未被调用带来的问题。 © 版权声明 文章版权归作者所有,未经允许请勿转载。THE ENDAndroid# Android WebView# sessionStorage# 多页面加载# 共享数据# evaluateJavascript()# JSON解析器 喜欢就支持以下吧点赞17 分享QQ空间微博QQ好友海报分享复制链接收藏 玩转Android Studio自定义模板插件-MVP模板为例玩转Android Studio自定义模板插件-MVP模板为例6年前 9195Android转场动画和共享元素动画兼容5.0以下版本的实现Android转场动画和共享元素动画兼容5.0以下版本的实现6年前 8789非Activity环境startActivity的正确姿势非Activity环境startActivity的正确姿势5年前 8398基于Nexus 3.x搭建Gradle Maven本地私有仓库基于Nexus 3.x搭建Gradle Maven本地私有仓库5年前 7457OkHttp实现多线程断点续传,单例模式下多任务下载管理器,一起抛掉sp,sqlite的辅助吧OkHttp实现多线程断点续传,单例模式下多任务下载管理器,一起抛掉sp,s...7年前 6999 玩转Android Studio自定义模板插件-MVP模板为例玩转Android Studio自定义模板插件-MVP模板为例6年前 9195Android转场动画和共享元素动画兼容5.0以下版本的实现Android转场动画和共享元素动画兼容5.0以下版本的实现6年前 8789非Activity环境startActivity的正确姿势非Activity环境startActivity的正确姿势5年前 8398OkHttp实现多线程断点续传,单例模式下多任务下载管理器,一起抛掉sp,sqlite的辅助吧OkHttp实现多线程断点续传,单例模式下多任务下载管理器,一起抛掉sp,sqlite的辅助吧7年前 6999Android自定义导览地图组件(一)Android自定义导览地图组件(一)7年前 6718Flutter开发之Dart线程与异步Flutter开发之Dart线程与异步5年前 6522 评论 共1条 欢迎您留下宝贵的见解!提交 2018年6月10日,来到上海的第6天Hey,沪漂的姑娘# android开发# html开发# java开发6年前3193835 玩转Android Studio自定义模板插件-MVP模板为例Android# android开发# html开发# java开发6年前491950Android转场动画和共享元素动画兼容5.0以下版本的实现Android# android开发# html开发# java开发6年前087891非Activity环境startActivity的正确姿势Android# android开发# html开发# java开发5年前083981对Redis连接池的深入理解与解析Java# android开发# html开发# java开发6年前082371基于Nexus 3.x搭建Gradle Maven本地私有仓库折腾# android开发# html开发# java开发5年前274572热门文章2018年6月10日,来到上海的第6天玩转Android Studio自定义模板插件-MVP模板为例Android转场动画和共享元素动画兼容5.0以下版本的实现非Activity环境startActivity的正确姿势对Redis连接池的深入理解与解析基于Nexus 3.x搭建Gradle Maven本地私有仓库分类 Android Flutter Harmony Hey,沪漂的姑娘 iBeacon Linux MySQL Q5080645455个月前0有没有详细的视频使用教程啊,是只有苹果电脑才可以用吗 王柏元8个月前0老哥你好,友链王柏元的博客,换了域名 baiyuan.wang 可以帮忙改下额再谈Java、Android AES加密算法填充方式 - 算法网2年前0[…] 此前写过一篇关于AES加密的文章《Android加密算法之对称加密AES》,介绍了相关概念,使用以及脱坑姿势。 […]WIND4年前0感谢博主啊啊啊 终于找到解决方案啦, 爱死你开心Blogs4年前1转载一下部分内容,已标记原出处。如有问题可联系删除!小码君4年前0很好,很实用啊今日新鲜事4年前0文章不错支持一下吧热搜榜4年前0文章不错非常喜欢标签android Android MVC Android MVI架构 Android WebView Android应用程序开发 android开发 Apache CentOS 7 EPEL仓库 evaluateJavascript() gradle html开发 java开发 JSON解析器 linux运维 maven maven代理服务器 maven服务器 Model-View-Intent架构 nexus服务器 Nginx PHP 7.4 php开发 Remi仓库 sessionStorage web开发 专注于移动互联网 响应式编程框架 多页面加载 标签云耦合度登录功能架构模式数据绑定拓展依赖开机自启多页面加载响应式编程框架响应式编程命令绑定可测试性可扩展性单元测试升级共享数据乘月网专注于移动互联网web开发sessionStorageRemi仓库 友链申请 · 皖ICP备16021437号-1 · 皖公网安备34010202600253号
需要注意,evaluateJavascript()方法是异步执行的,onReceiveValue()可能未被及时调用,因此瞅好时机调用该js很重要,另外也要处理好未被调用带来的问题。
Q5080645455个月前0
王柏元8个月前0
再谈Java、Android AES加密算法填充方式 - 算法网2年前0
WIND4年前0
开心Blogs4年前1
小码君4年前0
今日新鲜事4年前0
热搜榜4年前0
友链申请 · 皖ICP备16021437号-1 · 皖公网安备34010202600253号
Q508064545 5个月前0
有没有详细的视频使用教程啊,是只有苹果电脑才可以用吗王柏元8个月前0
老哥你好,友链王柏元的博客,换了域名 baiyuan.wang 可以帮忙改下额再谈Java、Android AES加密算法填充方式 - 算法网2年前0
[…] 此前写过一篇关于AES加密的文章《Android加密算法之对称加密AES》,介绍了相关概念,使用以及脱坑姿势。 […]WIND4年前0
感谢博主啊啊啊 终于找到解决方案啦, 爱死你开心Blogs4年前1
转载一下部分内容,已标记原出处。如有问题可联系删除!小码君4年前0
很好,很实用啊今日新鲜事4年前0
文章不错支持一下吧热搜榜4年前0
文章不错非常喜欢