Android与WebView的同步和异步访问机制

WKWebView调用evaluateJavaScript异步转同步返回的潜在问题 子线程中WKWebView调用evaluateJavaScript同步返回潜在问题 业务背景 UIWebView执行JS是同步返回,WKWebView执行JS是异步返回。 这里通过死循环阻塞线程,以达到WKWebView执行JS同步返回的效果。 当调用该代码片段的业务代码是在网络请求回调或者扫描二维码回调中时,就需要从子线程切换主线程。我遇到的情况就是在扫描二维码界面,需要切换主线程。 出现问题 但是当外部业务代码使用dispatch_async和dispatch_get_main_queue切换主线程执行 阅读详情

大家都知道,通过WebView,我们可以在Android客户端,用Web开发的方式来开发我们的应用。

如果一个应用就是单纯一个WebView,所有的逻辑都只需要在网页上交互的话,那我们其实就只需要通过html和javascript来跟服务器交互就可以了。

但是很多情况下,我们的应用不是单纯一个WebView就可以了,有可能会需要运用到Android本身的应用,比如拍照,就需要调用Android本身的照像机等,要产生震动,在需要运用到手机特性的一些场景下,肯定需要这么一套机制在javascript和Android之间互相通信,包括同步和异步的方式,而这套机制就是本文中我想要介绍的。

一步一步来,我们先从最简单的地方讲起:

1)需要一个WebView去展现我们的页面,首先定义一个布局,非常简单,就是一个WebView,如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width= "match_parent"
    android:layout_height= "match_parent"
    android:orientation= "vertical">

    <WebView
        android:id="@+id/html5_webview"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

这个WebView就是承载我们页面展现的一个最基本的控件,所有在页面上的逻辑,需要跟Android原生环境交互的逻辑数据都是通过它来传输的。

2)在对应的Activity中,对WebView进行一些初始化

mWebView = (WebView) findViewById(R.id. html5_webview );
WebSettings webSettings = mWebView.getSettings();
webSettings.setJavaScriptCanOpenWindowsAutomatically( true );
webSettings.setJavaScriptEnabled( true );
webSettings.setLayoutAlgorithm(LayoutAlgorithm. NORMAL );


mWebView.setWebChromeClient( new WebServerChromeClient());
mWebView.setWebViewClient( new WebServerViewClient());

mWebView.setVerticalScrollBarEnabled( false );
mWebView.requestFocusFromTouch();

mWebView.addJavascriptInterface( new AppJavascriptInterface(), "nintf" );


在上面的代码中,主要是对WebView的一些初始化,但其中最重要的几句代码是这么几句:

2.1)webSettings.setJavaScriptEnabled( true );

告诉WebView,让它能够去执行JavaScript语句。在一个交互的网页上,javascript是没办法忽略的。

2.2)mWebView.setWebChromeClient( new WebServerChromeClient());
2.3)mWebView.setWebViewClient( new WebServerViewClient());
WebChromeClient和WebViewClient是WebView应用中的两个最重要的类。

通过这两个类,WebView能够捕获到Html页面中url的加载,javascript的执行等的所有操作,从而能够在Android的原生环境中对这些来自网页上的事件进行判断,解析,然后将对应的处理结果返回给html网页。

这两个类是html页面和Android原生环境交互的基础,所有通过html页面来跟后台交互的操作,都在这两个类里面实现,在后面我们还会详细说明。

2.4)mWebView.addJavascriptInterface( new AppJavascriptInterface(), "nintf" );

这个JavascriptInterface,则是Android原生环境和javascript交互的另一个窗口。

将我们自定义的AppJavascriptInterface类,调用mWebView的addJavascriptInterface方法,可以将这个对象传递给mWebView中Window对象的nintf属性("nintf"这个属性名称是自定义的)之后,

就可以直接在javascript中调用这个Java对象的方法。


3)接下来,我们就先来看看在Html中的javascript是如何跟Android原生环境来交互的。

我们按照事件发生的顺序机制来看,这样有个先后的概念,理解起来会容易一点。

在这套机制中,提供了两种访问Android原生环境的方法,一种是同步的,一种是异步的。

同步的概念就是说,我在跟你交流的时候,如果我还没有收到你的回复,我是不能跟其他人交流的,我必须等在那里,一直等着你。

异步的概念就是说,我在跟你交流的时候,如果你还没有回复我,我还能够去跟其他人交流,而当我收到你的回复的时候,再去看看你的回复,应该要干些什么。

3.1)同步访问

在Javascript中,我们定义了这样一个方法,如下:

var exec = function (service, action, args) {
        var json = {
               "service" : service,
               "action" : action
       };
        var result_str = prompt(JSON.stringify(json), args);

        var result;
        try {
              result = JSON.parse(result_str);
       } catch (e) {
              console.error(e.message);
       }

        var status = result.status;
        var message = result.message;
        if (status == 0) {

               return message;
       } else {
              console.error( "service:" + service + " action:" + action + " error:" + message);
       }
}

而对此方法的,典型的调用如下:

exec( "Toast", "makeTextShort" , JSON.stringify(text));

其中Toast和makeTextShort是要调用Android原生环境的服务和参数,这些都是在PluginManager中管理的,在下一篇文章中会提及到。

在这里,我们调用了prompt方法,通过这个方法,在WebView中定义的的WebChromeClient就会拦截到这样一个方法,具体代码如下:

class WebServerChromeClient extends WebChromeClient {
     @Override
    public boolean onJsPrompt(WebView view, String url, String message,
              String defaultValue, JsPromptResult result) {   
         System.out.println( "onJsPrompt:defaultValue:" + defaultValue + "|" + url + "," + message);
         JSONObject args = null ;
         JSONObject head = null ;
         try {
              head = new JSONObject(message);            
              args = new JSONObject(defaultValue);
              String execResult = mPluginManager.exec(head.getString(IPlugin.SERVICE),
                        head.getString(IPlugin.ACTION), args);

              result.confirm(execResult);
              return true;

         ...
        
    }         
}

在这里,我们会重载WebChromeClient的onJsPrompt方法,当此方法返回true的时候,就说明WebChromeClient已经处理了这个prompt事件,不需要再继续分发下去;

而当返回false的时候,则此事件会继续传递给WebView,由WebView来处理。

由于我们这里是要利用这个Prompt方法,来实现Javascript跟Android原生环境之间的同步访问,所以我们在这里会拦截这个事件进行处理。

在这里,通过message和defaultValue,我们可以拿到javascript中prompt方法两个参数的值,在这里,它们是Json数据,在这里进行解析之后,由PluginManager来进行处理,最后将结果返回给JsPromptResult的confirm方法中。

此结果就是javascript中prompt的返回值了。

而除了JsPrompt,还有类似Javascript中的Alert方法等,我们知道浏览器弹出的Alert窗口跟我们手机应用中窗口风格样式是很不一样的,而作为一个应用,风格肯定要有一套统一的标准,所以一般情况下,我们也会拦截WebView中的Alert窗口,这个逻辑也同样会是在这里处理,如下:

@Override
public boolean onJsAlert(WebView view, String url, String message,
               final JsResult result) {
       System. out .println("onJsAlert : url:" + url + " | message:" + message);
        if (isFinishing()) {
               return true ;
       }
       CustomAlertDialog.Builder customBuilderres = new CustomAlertDialog.Builder(DroidHtml5.this );
       customBuilderres.setTitle( "信息提示" ).setMessage(message)
                     .setPositiveButton( "确定" , new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int which) {
                                  dialog.dismiss();
                                  result.confirm();
                           }
                     }).create().show();
        return true ;
}


上面描述的都是同步访问Android原生环境的方式,那么,异步的访问方式是怎么样的呢?

3.2)异步访问

同样的,我们会在Javascript中定义如下一个方法:

var exec_asyn = function(service, action, args, success, fail) {
       var json = {
               "service" : service,
               "action" : action
       };              
       var result = AndroidHtml5.callNative(json, args, success, fail);  
}


我们会调用AndroidHtml5的callNative,此方法有四个参数:

a)json:是调用的服务和操作

b)args: 对应的参数数

c)success : 成功时的回调方

d)fail:失败时的回调方

典型的调用如下:

var success = function(data){};
var fail = functio(data){};
exec_asyn( "Contacts", "openContacts" , '{}', success, fail);

在这里,AndroidHtml5是在Javascript中定义的一个对象,它提供了访问Android原生环境的方法,以及回调的队列函数。它的定义如下:
var AndroidHtml5 = {
       idCounter : 0,                 // 参数序列计数器
       OUTPUT_RESULTS : {},      // 输出的结果       
       CALLBACK_SUCCESS : {},  // 输出的结果成功时调用的方法        
       CALLBACK_FAIL : {},       // 输出的结果失败时调用的方法

       callNative : function (cmd, args, success, fail) {
              var key = "ID_" + (++ this.idCounter);
             
              window.nintf.setCmds(cmd, key);
              window.nintf.setArgs(args, key);
              
              if (typeof success != 'undefined'){
                    AndroidHtml5.CALLBACK_SUCCESS[key] = success;
              } else {
                    AndroidHtml5.CALLBACK_SUCCESS[key] = function (result){};
              }
              
              if (typeof fail != 'undefined'){
                    AndroidHtml5.CALLBACK_FAIL[key] = fail;
              } else {
                    AndroidHtml5.CALLBACK_FAIL[key] = function (result){};
              }
              
              //下面会定义一个Iframe,Iframe会去加载我们自定义的url,以androidhtml:开头                         
              var iframe = document.createElement("IFRAME" );
              iframe.setAttribute( "src" , "androidhtml://ready?id=" + key);
              document.documentElement.appendChild(iframe);
              iframe.parentNode.removeChild(iframe);
              iframe = null ;

              return this .OUTPUT_RESULTS[key];
       }, 

       callBackJs : function (result,key) {
               this .OUTPUT_RESULTS[key] = result;
               var obj = JSON.parse(result);
               var message = obj.message;
               var status = obj.status;                 
               if (status == 0) {
                      if (typeof this.CALLBACK_SUCCESS[key] != "undefined"){
                           setTimeout( "AndroidHtml5.CALLBACK_SUCCESS['" +key+"']('" + message + "')", 0);
                     }
              } else {
                      if (typeof this.CALLBACK_FAIL != "undefined") {
                           setTimeout( "AndroidHtml5.CALLBACK_FAIL['" +key+"']('" + message + "')" , 0);
                     }
              }
       }
};

在AndroidHtml5中,有几个地方我们需要注意的。
a)大家还记得我们在WebView初始化时设置的AppJavascriptInterface吗?当时自定义的名称就是"nintf",而在此时,在javascript中,我们就可以直接来运用这个对象所有的方法。
window.nintf.setCmds(cmd, key);
window.nintf.setArgs(args, key);

我们也看一下这个AppJavascriptInterface中的方法,如下:
public class AppJavascriptInterface implements java.io.Serializable {
        
        private static Hashtable<String,String> CMDS = new Hashtable<String,String>();
        private static Hashtable<String,String> ARGS = new Hashtable<String,String>();
               
        @JavascriptInterface
        public void setCmds(String cmds, String id) {
               CMDS .put(id, cmds);
       }      
     
        @JavascriptInterface
        public void setArgs(String args, String id) {
               ARGS .put(id, args);
       }
    
        public static String getCmdOnce(String id) {
              String result = CMDS .get(id);
               CMDS .remove(id);
               return result;
       }

        public static String getArgOnce(String id) {
              String result = ARGS .get(id);
               ARGS .remove(id);
               return result;
       }
}

这个类是简洁而不简单,通过在Javascript中调用类中的set方法,将对应的cmd和args参数给保存起来,目的是为了保存异步请求中多次的命令和操作,然后在Android原生环境中再取出来。

b)第二步呢,也是最重要的一步,会创建一个Iframe,在Iframe中申明一个url,而且是以androidhtml: 开头的。
在上面我们提过,WebView在初始化的时候,会设置一个WebViewClient,这个类的主要作用就是,当在html页面中发生url加载的时候,我们可以拦截这个加载事件,进行处理,重写这次加载事件。
而我们正好是利用了这一点,利用一个Iframe来触发一次Url的拦截事件。
我们来看一下WebViewClient中是如何实现这个异步请求的实现的。

class WebServerViewClient extends WebViewClient {
       
       Handler myHandler = new Handler() {
               ...
       };

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {

               if (url != null && url.startsWith( "androidhtml")) {
                    String id = url.substring(url.indexOf( "id=" ) + 3);
                    JSONObject cmd = null ;
                    JSONObject arg = null ;
                     try {
                           String cmds = AppJavascriptInterface.getCmdOnce(id);
                           String args = AppJavascriptInterface.getArgOnce(id);
                           cmd = new JSONObject(cmds);
                           arg = new JSONObject(args);
                    } catch (JSONException e1) {
                           e1.printStackTrace();
                            return false ;
                    }
                    //另起线程处理请求
                     try {
                           AsynServiceHandler asyn = new AsynServiceHandlerImpl();
                           asyn.setKey(id); 
                           asyn.setService(cmd.getString( "service" ));
                           asyn.setAction(cmd.getString( "action" ));
                           asyn.setArgs(arg);
                           asyn.setWebView( mWebView);
                           asyn.setMessageHandler( myHandler );
                           Thread thread = new Thread(asyn, "asyn_" + (threadIdCounter ++));
                           thread.start();
                    } catch (Exception e) {
                           e.printStackTrace();
                            return false;
                    }
                     return true ;
              }
              //如果url不是以Androidhtml开头的,则由WebView继续去处理。
              view.loadUrl(url);
              return true ;
       }
       
}
我们可以看到,在这方法中,首先只有以androidhtml开头的url才会被拦截处理,而其他的url则还是由WebView进行处理。

而通过AppJavascriptInterface,我们将在Javascript中保存的cmds和args等数据都拿出来了,并由AsynServiceHandler新启一个线程去处理。

我们再来看看AsynServiceHandlerImpl是怎么实现的,

public class AsynServiceHandlerImpl implements AsynServiceHandler {
        @Override
        public void run() {             
           try {
              final String responseBody = PluginManager.getInstance().exec(service,  action,args);                     
              handler.post( new Runnable() {
                      public void run() {       
                           webView .loadUrl( "javascript:AndroidHtml5.callBackJs('"+responseBody+ "','" +key +"')" );
                      }
              });
           } catch (PluginNotFoundException e) {
               e.printStackTrace();
           }
       }
可以看到,当调用PluginManager操作完对应的命令和数据之后,会通过WebView的loadUrl方法,去执行AndroidHtml5的callBackJs方法。

通过key值,我们就可以在AndroidHtml5中的callBackJs方法中找回到对应的回调方法,进行处理。

因此,通过一次Iframe的构建,加载以androidhtml开头的url,再利用WebView的WebViewClient接口对象,我们就能够在Html页面中和Android原生环境进行异步的交互了。

在这一篇文章中,我们几处地方讲到了PluginManager这个类,这是一个管理HTML和Android原生环境交互接口的类。

因为如果把所有的逻辑都放在WebViewClient或者WebChromeClient这两个都来处理,这是不合理的,乱,复杂,看不懂。

所以我们需要把逻辑实现跟交互给分开来,这个机制才显得漂亮,实用,易操作。


秒开WebView Android性能优化全攻略 秒开 WebView 是很多 Android 开发者追求的目标,尤其是在需要加载复杂网页内容或与 Web 进行频繁交互的应用中。然而,由于 WebView 的启动速度较慢且加载资源耗时较多,优化 WebView 的性能是一个非常关键的课题。以下是一些可以提升 WebView 性能的优化策略。 阅读详情

相关推荐

WebView Cookie跨域丢失问题:从原理到Android/iOS实战解决方案

Cookie作为Web开发中维持用户会话状态的核心机制,其工作原理基于HTTP协议在客户端存储服务器下发的键值对,并在后续请求中自动携带以实现状态管理。这一机制在标准浏览器中运行良好,但在移动端混合开发场景下,当Web应用内嵌于App的WebView容器时,常因容器与浏览器内核的差异导致Cookie同步异常,引发用户登录状态丢失等严重问题。从技术价值看,理解并解决WebView的Cookie管理问题,是保障混合应用用户体验与功能完整性的关键工程实践。尤其在涉及跨域请求、HttpOnly安全Cookie及Sa

cojm55771的博客 515

android webview loadurl本地,Android WebView 使用loadUrl方法执行本地JavaScript

X隐私和 Cookie此站点使用 Cookie。继续即表示您同意它们使用 Cookie。了解更多信息,包括如何使用 Cookie。知道了!广告因为Android的WebView类没有像Qt里面的QWebFrame,有一个类似evaluateJavaScript的方法,所以一直以来我都以为Android没办法像Qt一样,可以在加载远程网页之后再注入本地的JavaScript在当前网页内部的JavaS...

weixin_39520393的博客 418

Android WebView开发实战:集成TBS X5内核解决页面白屏与视频播放难题

在Android应用开发中,WebView作为承载H5页面的核心组件,其性能和兼容性直接影响用户体验。系统WebView因Android版本碎片化,常导致页面渲染不一致、视频播放卡顿、文件上传失败等问题。其原理在于不同厂商对系统WebView的定制差异,使得统一优化变得困难。为解决这一痛点,腾讯推出的TBS X5内核基于Chromium深度定制,提供了统一的渲染引擎和增强功能,技术价值在于显著提升了H5页面在复杂场景下的稳定性和性能。尤其在涉及WebGL 3D展示、直播流媒体播放等高级应用场景时,X5内核通

weixin_33802505的博客 365

安卓Webview中异步加载资源

安卓Webview中异步加载资源,资源可以是其他网站的内容,也可以是本地的文件

flyinmind的专栏 907

Android记录25-WebView实现离线缓存阅读

基础知识是前端一面必问的,如果你在基础知识这一块翻车了,就算你框架玩的再6,webpack、git、node学习的再好也无济于事,因为对方就不会再给你展示的机会,千万不要因为基础错过了自己心怡的公司。前端的基础知识杂且多,并不是理解就ok了,有些是真的要去记。当然了我们是牛x的前端工程师,每天像背英语单词一样去背知识点就没必要了,只要平时工作中多注意总结,面试前端刷下题目就可以了。什么?你问面试题资料在哪里,这不是就在你眼前吗(滑稽。

2401_84092068的博客 1111

WebView缓存机制深度解析:从HTTP协议到Android实战避坑指南

HTTP缓存是Web性能优化的核心技术,它通过Cache-Control、ETag等头部字段控制资源的存储与验证,旨在减少网络请求、提升加载速度。其工作原理基于客户端与服务器间的缓存协商机制,在混合开发与移动应用场景中价值显著,能有效优化用户体验并节省流量。然而,不当的缓存策略易引发资源更新滞后、样式错乱等一致性问题,尤其在Android WebView等容器中更为复杂。本文聚焦WebView缓存机制,结合磁盘缓存、缓存策略等热词,深入剖析缓存失效的典型场景与解决方案,为开发者提供从原理到实践的完整调试思路

ckkay800264的博客 314

WebView全面解析

WebView全面解析 简介 WebView是android中一个非常重要的控件,它的作用是用来展示一个web页面。它使用的内核是webkit引擎,4.4版本之后,直接使用Chrome作为内置网页浏览器。 作用 显示和渲染网页; 可与页面JavaScript交互,实现混合开发。 使用介绍 使用WebView之前,不要忘记在清单文件中声明访问网络权限: &amp;lt;uses...

自由奔跑的风 2万+

第九课:Android原生与H5的交互

Android 开发中的页面一般都是原生自己的,就是我们所讲的layout布局文件,但是随着APP开发的发展和快速迭代的需要,App中的很多变化比较频繁的页面通常用H5来替换。所以就有了原生与H5的交互。这节课重点讲一下我们的重要组件webView,在原生中重要通过它来承载H5页面并与H5进行逻辑交互。 一、WebView控件 1.布局文件中添加: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xm...

zhwadezh的博客 597

Android与WebView的同步和异步訪问机制

大家都知道。通过WebView,我们能够在Androidclient。用Web开发的方式来开发我们的应用。 假设一个应用就是单纯一个WebView。全部的逻辑都仅仅须要在网页上交互的话,那我们事实上就仅仅须要通过html和javascript来跟server交互就能够了。 可是非常多情况下。我们的应用不是单纯一个WebView就能够了,有可能会须要运用到Android本身的应用,比方拍...

weixin_34297300的博客 627

【Android知识笔记】Webview专题

Android知识笔记之Webview专题篇。(包含 SPI @AutoService 注解原理)

川峰的博客 677

Android Java与WebView交互实战演示Demo

不要再零散地暴露showToast这样的方法了,我们要抽象成“命令 + 数据 + 回调”模式。"data": {"name": "李四",},对应的 Java 接收方法只有一个入口:try {break;break;default:好处显而易见:新增功能不用改接口签名易于做埋点、日志追踪可集中做权限校验、参数过滤最小暴露原则:只开放必要的方法,避免暴露敏感操作。统一通信协议:用结构化消息取代零散接口。

weixin_42465332的博客 881

Android WebView中JS和Java沟通机制

WebView是Android的一个常用控件,下面介绍下JS和Java的沟通机制通过一个简单的Demo介绍这个机制 布局就是一个简单的WebView, 但是每个连接都加了js方法html中的js这个html中,使用类似javascript:Android.callPhone("15633336666")的进行调用Android中的Java方法,暂时放在assets目录下了<!DOCTYPE htm

博客已搬家,请访问新博客https://kswapd.cn,提供更好的阅读体验。 662

matlab tolx,Nelder-Mead算法matlab

Nelder-Mead算法适合变量数不是很多的方程求极值.原理:Nelder-Mead法是利用多面体来逐步逼近最佳点x*.设函数变量为n维,则在n维空间里多面体有(n+1)个顶点.设x1,x2,...,xn+1为多面体的顶点,且满足:f(x1)<=f(x2)<=...<=f(xn+1)Nelder-Mead法试着将多面体中最差的顶点xn+1(也就是函数的最大点)以新的最佳点替代,...

weixin_36485298的博客 1480

Android与WebWiew的同步和异步访问机制

通过WebView可以在Android客户端用Web开发的方式来开发我们的应用。其实就只需要通过html和javascript来跟服务器交互就可以了。 1)首先定义一个布局,就是一个WebView:                                  android: layout_width = "match_parent"                        

浮华瑰梦 1196

手把手教你搞定爱思唯尔LaTeX投稿:从模板到PDF生成的全流程避坑指南

本文详细介绍了使用LaTeX投稿爱思唯尔期刊的全流程避坑指南,包括模板选择、文件结构规范、投稿系统文件上传策略、PDF生成与检查等关键步骤。特别强调了避免常见错误如宏包冲突、图片丢失和参考文献问题,并提供了投稿后的应急方案和高阶自动化校验脚本,帮助研究者顺利完成投稿。

weixin_42525289的博客 508

TensorFlow_PyTorch实战:构建AI人工智能回归模型

回归分析是机器学习的核心任务之一,用于预测连续型目标变量(如房价、股票价格、用户留存时间等)。基础线性回归模型的数学原理与代码实现多项式回归模型的过拟合处理与正则化技巧自定义数据集加载与数据预处理流程动态图(PyTorch)与静态图(TensorFlow)的编程范式对比模型评估指标与可视化分析方法核心概念:对比两大框架的架构设计,解析回归模型核心组件数学原理:推导线性回归的假设函数、损失函数及优化算法算法实现:提供TensorFlow和PyTorch的完整代码示例项目实战。

AI天才研究院 1429

Android Smart WebView JS Bridge深度解析:如何实现JavaScript与原生Android的双向通信

Android Smart WebView 是一款内置 JS Bridge 双向通信机制的混合应用开发框架。它通过 `JSInterfacePlugin` 插件让 JavaScript 代码调用原生 Android 能力(剪贴板、定位、分享、生物识别等),同时支持原生侧向网页注入事件回调,真正实现 JavaScript 与原生 Android 的双向通信。本文带你完整拆解这套 JS Bridge

gitblog_00023的博客 1058

WSOLA原理及matlab仿真

WSOLA原理 对于 OLA 算法来说,常常无法保持原信号中的周期性结构,在帧裁剪的过程中,不能保证每一个帧都能覆盖完整周期并保证其相位对齐,会产生相位跳跃失真。 为保证**基频不变**,就要使用 WSOLA 算法。 WSOLA 并不直接在 Ha 处找一帧进行直接拼接,而是在一个区间内寻找与理想帧最接近的一帧进行叠加。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/8a234f4fde104fc69a9f3ddb7bcf3014.png?x-oss-process=ima

ManiacLook的博客 3214

android上对cookie的读写操作,android WebView写入清除cookie机制

WebView是基于webkit内核的UI控件,相当于一个浏览器客户端。它会在本地维护每次会话的cookie(保存在data/data/package_name/app_WebView/Cookies.db)打开AndroidStudio右侧边栏的 DeviceFileExplorer查看APP cookie当WebView加载URL的时候,WebView会从本地读取该URL对应的cookie,并...

weixin_29229261的博客 1405

Gazebo仿真平台模型搭建与修改

ROS里踩过的坑(一)Gazebo仿真平台模型搭建与修改文件讲解Models 文件World文件Launch文件模型编辑可视化编辑配置文件编辑模型展示如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出...

Redglass的博客 1万+

DA14531之搭建开发环境

DA14531之搭建开发环境

hejinwu1314的博客 1777

安卓webview开发简介

当页面被失去焦点被切换到后台不可见状态,需要执行onPause动过, onPause动作通知内核暂停所有的动作,比如DOM的解析、plugin的执行、JavaScript执行。当应用程序被切换到后台我们使用了webview, 这个方法不仅仅针对当前的webview而是全局的全应用程序的webview,它会暂停所有webview的layout,parsing,javascripttimer。以当前的index为起始点前进或者后退到历史记录中指定的steps, 如果steps为负数则为后退,正数则为前进。

cqn2bd2b的博客 1637

基于YOLOv8与UI界面的校园垃圾分类督导系统

YOLO(You Only Look Once)是目前最为广泛使用的目标检测算法之一。它通过一次前向传递即完成目标检测,具有极高的速度与效率。YOLOv8是YOLO系列的最新版本,相比于之前的YOLO版本,YOLOv8在速度、精度、检测能力等方面都有了显著的提升。本项目通过结合YOLOv8模型与UI界面,成功实现了校园垃圾分类督导系统。该系统能够自动识别不同类型的垃圾,并通过UI界面实时展示垃圾分类的结果。

YOLO 337

android webview控件中javascript与java的相互调用

首先说明下,本帖主要是为了给出思路,不会给出特别细的教学代码,详细的API使用网上搜就好了。 先给出一个对于webview的帖子:有关webview中js与java互调的帖子 javascript调用java 也就是说通过webview所访问的web站点,希望通过js调用android本身的接口实现某些功能。这种情况下可以用webview控件的addJavascriptInterface...

evasnowind的专栏 130

FPGA原型验证(七):如何选择、搭建原型验证平台?

本篇概要::讨论了在项目初期选择目标FPGA平台的重要性,包括自制板卡与购买现成板卡之间的决策。主要是为那些希望建立基于FPGA的原型平台的工程师和设计师提供了深入的技术细节和决策指导,无论是选择自制还是购买现成的解决方案。

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 943

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

上一篇: 跟面试官讲Binder(零)
下一篇: Android与WebView的插件管理机制
linmiansheng
博客等级 码龄20年 507粉丝 111原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值