Android混合开发快速上手掌握

目录

一 混合开发简介

二 Android-Js互调

2.1 准备自己的html文件

2.2 WebView控件的准备设置

2.3 Android调用Js代码

2.4 Js调用Android方法和传参数

三 常用的几个方法和注意点

3.1 WebViewClient中的shouldOverrideUrlLoading拦截url

3.2 WebViewClient中的onPageStarted

3.3 WebViewClient中的onPageFinished

3.4 webview的evaluateJavascript方法


先上效果图:

源码地址:https://github.com/LucasXu01/Autils

一 混合开发简介

原生app :java/kotlin 纯原生写出的app;

web app:web写出的app;

hybird app:原生+web(通过webview)写出的app;

当然,现在也有很多第三方混合开发框架以及简便的js桥,但是作为最基础的webview,掌握js/android的互调等相关知识是非常必要的。


二 Android-Js互调

2.1 准备自己的html文件

安卓和html中js的互调,一是要有安卓代码,二肯定需要html网页。工程中,网页都是放在服务器,方便随时更改,用户无需再次更新自己的app,已达到hybrid开发的目的,实例方便起见,将html文件放在了本地。

首先,在自己安卓项目中的app目录下新建assets文件夹(若没有):

接着,在assets文件夹下新建自己的html文件,代码如下:

<html><head><meta http-equiv="Content-Type" charset="GB2312"/><script type="text/javascript">function javacalljs(){document.getElementById("showmsg").innerHTML = "JAVA调用了JS的无参函数";}function javacalljswith(arg){document.getElementById("showmsg").innerHTML = (arg);}</script></head><body><h3 align="center">Web模块</h3><h3 id="showmsg" align="center">调用js显示结果</h3><div style="text-align:center; vertical-align:middle;"><input  type="button" value="Js调用Java代码" onclick="window.android.jsCallAndroid()"/></div><br><br><div style="text-align:center; vertical-align:middle;"><input  type="button" value="Js调用Java代码并传参数" onclick="window.android.jsCallAndroidArgs('Js传过来的参数')"/></div></body>
</html>

 

2.2 WebView控件的准备设置

在自己的activity活动中获得webview控件后,需要进行以下设置:

WebSettings webSettings = webview.getSettings();
//与js交互必须设置
webSettings.setJavaScriptEnabled(true);
webview.loadUrl("file:///android_asset/html.html");
webview.addJavascriptInterface(MainActivity.this,"android");
  • webSettings.setJavaScriptEnabled(true) 表示让WebView支持调用Js;
  • webview.loadUrl("file:///android_asset/html.html") 表示加载assets文件下的html.html文件(因为没有网络地址所以加载的本地文件)
  • webview.addJavascriptInterface(MainActivity.this,"android") 给webview添加Js调用接口,第一个参数为类对象,第二个参数为自定义别名,Js通过这个别名来调用Java的方法,我这里自定义为android。
    html中用到:<input type="button" value="Js调用Java代码" οnclick="window.android.jsCallAndroid()"/>

2.3 Android调用Js代码

在android代码中(如按钮点击事件中),通过webview这个中介调用loadUrl来执行html代码中的Js代码:

 tvJs.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {webview.loadUrl("javascript:javacalljs()");}});

下为html中要被安卓调用的js函数代码,函数意图为:向id为showmsg的h3大小标题中写入字符串“JAVA调用了JS的无参函数”。

function javacalljs(){document.getElementById("showmsg").innerHTML = "JAVA调用了JS的无参函数";}

在上述基础上,若要在Android调用Js函数时传参数,只需要在loadUrl方法中进行字符串的拼接,将参数以字符串形式拼接进去即可。

webview.loadUrl("javascript:javacalljswith(" + "'Android传过来的参数'" + ")");

2.4 Js调用Android方法和传参数

点击html按钮,通过οnclick="window.android.jsCallAndroid()事件,通过android别名调用Java文件的jsCallAndroid()方法。曾经Js可直接调用Java代码窃取App信息,为安全起见,在Android4.4以上并且必须加入@JavascriptInterface才有响应。

@JavascriptInterfacepublic void jsCallAndroid(){tvShowmsg.setText("Js调用Android方法");}@JavascriptInterfacepublic void jsCallAndroidArgs(String args){tvShowmsg.setText(args);}

所有的activity代码如下:

package com.lucas.autils.autils;import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.webkit.JavascriptInterface;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.TextView;/*** 原生webview  js与安卓互调* @author lucas* created at 2019/9/12 12:23 PM*/
public class JsJavaActivity extends Activity {private WebView webview;private TextView tvJs;private TextView tvJsArgs;private TextView tvShowmsg;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_jsjava);setWebview();initView();}private void initView() {tvJs = (TextView) findViewById(R.id.tv_androidcalljs);tvJsArgs = (TextView) findViewById(R.id.tv_androidcalljsargs);tvShowmsg = (TextView) findViewById(R.id.tv_showmsg);tvJs.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {webview.loadUrl("javascript:javacalljs()");}});tvJsArgs.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {webview.loadUrl("javascript:javacalljswith(" + "'Android传过来的参数'" + ")");}});}private void setWebview() {webview = (WebView) findViewById(R.id.webview);WebSettings webSettings = webview.getSettings();webSettings.setBuiltInZoomControls(true);webSettings.setSupportZoom(true);//与js交互必须设置webSettings.setJavaScriptEnabled(true);webview.loadUrl("file:///android_asset/html.html");webview.addJavascriptInterface(JsJavaActivity.this,"android");}@JavascriptInterfacepublic void jsCallAndroid(){tvShowmsg.setText("Js调用Android方法");}@JavascriptInterfacepublic void jsCallAndroidArgs(String args){tvShowmsg.setText(args);}}

三 常用的几个方法和注意点

3.1 WebViewClient中的shouldOverrideUrlLoading拦截url

安卓webview中setWebViewClient方法中需要一个WebViewClient对象,而WebViewClient中有个方法为shouldOverrideUrlLoading,通过此方法可以进行我们需要跳转的url地址的拦截,并根据我们需要进行自定义化的一些操作,解析url做相应的事情。

3.2 WebViewClient中的onPageStarted

onPageStarted会在webview加载相应的url开始之前进行调用,常用来处理需要在加载相应url之前的一些操作。

3.3 WebViewClient中的onPageFinished

onPageStarted会在webview加载相应的url结束之后进行调用,常用来处理需要在加载相应url之后的一些操作,比如加载后更加网页标题填充原生页面最上方的活动标题。

3.4 webview的evaluateJavascript方法

该方法的执行不会使页面刷新,而方法(loadUrl )的执行则会使页面刷新。此Android 4.4 后才可使用。

//拦截urlwebview.setWebViewClient(new WebViewClient(){@Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) {if (url.indexOf("jump")>-1){Toast.makeText(JsJavaActivity.this,"拦截到了相应url",Toast.LENGTH_LONG).show();return true;}else if (url.startsWith("http")){view.loadUrl(url);return true;}return false;}@Overridepublic void onPageStarted(WebView view, String url, Bitmap favicon) {super.onPageStarted(view, url, favicon);// 开始加载页面时}@Overridepublic void onPageFinished(WebView view, String url) {super.onPageFinished(view, url);// 加载结束//因为该方法的执行不会使页面刷新,而方法(loadUrl )的执行则会使页面刷新。//Android 4.4 后才可使用webview.evaluateJavascript("javascript:changename()", new ValueCallback<String>() {@Overridepublic void onReceiveValue(String value) {//此处为 js 返回的结果Log.v("Native",value);}});}});

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/69270.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安卓开发快速集成即时通讯聊天,只需几行代码轻松实现

信贸通即时通讯系统&#xff0c;一款跨平台可定制的 P2P 即时通信系统&#xff0c;为电子商务网站及各行业门户网站和企事业单位提供“一站式”定制解决方案&#xff0c;打造一个稳定&#xff0c;安全&#xff0c;高效&#xff0c;可扩展的即时通信系统&#xff0c;支持在线聊天…

IM即时通讯聊天,5分钟显示一次时间。JS

想在聊天界面想做个和微信一样的时间显示 达到下图这种效果 百度了一下&#xff0c;发现都是有点不全的&#xff0c;把网上的合并了一下组成下方的js文件 记录一下 1.建议新建一个JS文件 common.js 1.第一个方法是把时间戳转成具体时间日期 /** * 对Date的扩展&#xff0c;将…

GPT-4 Copilot X震撼来袭!写代码效率10倍提升,码农遭降维打击

因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享 点击关注#互联网架构师公众号&#xff0c;领取架构师全套资料 都在这里 0、2T架构师学习资料干货分 上一篇&#xff1a;2T架构师学习资料干货分享 大家好&#xff0c;我是互联网架构师&…

什么是生成器 — 一篇文章让你看懂

嗨嗨&#xff0c;我是小圆 ~ 今天来给大家讲讲什么是生成器 生成器是 Python 初级开发者最难理解的概念之一&#xff0c;虽被认为是 Python 编程中的高级技能&#xff0c;但在各种项目中可以随处见到生成器的身影&#xff0c;你得不得去理解它、使用它、甚至爱上它。 提到生成器…

怎么才能大批量生成原创文章

要大批量生成原创文章并不容易。毕竟&#xff0c;原创文章需要花费较多地时间和精力&#xff0c;才能够展现出高质量、有价值地内容。以下是一些方法可以帮助您大批量生成原创文章&#xff1a;1. 利用关键词通过使用关键词工具&#xff0c;寻找与您网站或品牌相关地长尾关键词。…

新媒体必备小技能——文章生成图片

相信公众号运营大家都不陌生了&#xff0c;与运营和自媒体相关的工作大多都会用到图文编辑&#xff0c;当然好看的排版直接影响读者的阅读体验&#xff01;在日常编辑推文以及制作宣传的过程中&#xff0c;图片是必不可少的重要组成部分&#xff01;96编辑器的一键生成图片功能…

狗屁文章生成器-批量生成原创文章自动发布网站-免费下载

狗屁文章生成器,什么是狗屁文章生成器&#xff0c;狗屁文章生成器从字面意思都能理解出来&#xff0c;就是生成的文章毫无逻辑感&#xff0c;胡乱生成&#xff0c;毫无可读性。只需要输入关键词就能实现狗屁文章生成。狗屁文章生成器。火于2020年某老板喊一员工写3000字原创检讨…

AI文章生成

文章 &#x1f9d0;一、我们在做什么&#x1f971;二、项目详情1.前端&#x1f642;&#xff08;1&#xff09;基本要求&#x1f610;&#xff08;2&#xff09;批量操作功能&#x1f641;&#xff08;3&#xff09;模式选择功能 &#x1f61f;&#xff08;4&#xff09;模型选…

文章生成器-原创文章生成器

在网络营销领域&#xff0c;优质文章是吸引新客户和保留老客户的重要工具。然而&#xff0c;生成高质量且符合SEO优化的文章并不是一件容易的事情。这就是为什么网站文章生成器如今备受欢迎的原因。而在众多的文章生成工具中&#xff0c;147GPT批量生成文章软件是一款非常出色的…

GPT关键词挖掘,自动关键词文章生成

随着互联网的发展&#xff0c;内容营销已成为企业营销策略中不可或缺的一环。有效的关键词文章生成可以帮助企业吸引更多的潜在客户&#xff0c;提高品牌曝光度和转化率&#xff0c;从而实现营销目标。 关键词文章生成是指根据特定的关键词和主题&#xff0c;使用软件工具自动生…

ChatGPT添加插件功能:开始联网集成第三方服务 渐成操作系统

雷递网 乐天 3月24日 人工智能公司OpenAI日前宣布&#xff0c;正为ChatGPT添加对插件的支持——将其与第三方服务集成或允许其访问最新信息的扩展。OpenAI称&#xff0c;正从小处着手&#xff0c;研究现实世界的使用、影响、安全和校准挑战。 “据我们的迭代部署理念&#xff0…

最高年薪近56万!猎聘重磅发布2023最新AIGC就业趋势大数据报告

©作者 | 编辑部 来源 | 新智元 猎聘大数据研究院重磅发布《AIGC就业趋势大数据报告2023》&#xff0c;招聘平均年薪已达40万&#xff0c;博士需求量同比增长超100%。 不用赘述&#xff0c;大家都知道&#xff0c;最近半年ChatGPT是有多么火爆。 随着ChatGPT的全球爆火&…

文心一言与GPT-4比对测试!

Waitlist了三个星期&#xff0c;今天下午终于拿到了百度文心一言的体验资格&#xff0c;于是立刻展开测试。 根据文心一言网页端信息显示&#xff0c;目前最新发版是4月1号的版本&#xff0c;版本号是v1.0.3&#xff0c;应该是从上个月16号发布会以后又做了两版迭代。根据文心一…

2013年各大IT公司研发类笔试题

不可以看见的部分请见http://www.iteblog.com/archives/262 一、百度(武汉地区) 第一部分&#xff1a; 1、描述数据库的简单操作。 2、描述TCP\IP四层模型&#xff0c;并简述之。 3、描述MVC的内容。 第二部分&#xff1a; 1、给出a-z0-9&#xff0c;在其中选择三个字符组…

牛客网2018吉比特校招技术开发类试题分析

最近做了两套笔试题&#xff0c;复习一下错题&#xff0c;有很多地方需要查缺补漏&#xff0c;再谈一下感受总结一下。 2018届吉比特校招技术类笔试B卷 吉比特2018届提前批校园招聘-开发类试卷 一、基础题 1.已知 a 6789x 6789、b 6789x 6790、c 6789x 6791&#xff0c…

大厂可能会问的那些思维题和技术点

精选大厂可能会问的那些思维题和技术点 一、题目一1.1、思路&#xff1a;1.2、代码实现 二、题目二三、const 的含义及实现机制, ,比如 : const int i, 是怎么做到 i 只可读的? ?四、到商店里买 200 的商品返还 100 优惠券( ( 可以在本商店代替现金) ) 。请问实际上折扣是多少…

字节跳动数据分析岗笔试分享笔试形式和内容

字节跳动数据分析岗笔试 笔试形式和内容 由于关于字节跳动数据分析的笔试分享经验较少&#xff0c;参加了字节的笔试后&#xff0c;想做一个记录&#xff0c;就写下了这篇文章。不知道自己笔试过了没有&#xff0c;希望能收到面试邀请吧&#xff0c;同时也希望可以帮助到大家…

计算机技术类社团纳新笔试题示例

计算机协会笔试题 学号&#xff1a;_____________ 姓名: _____________ 说明:如若答题空间不够&#xff0c;可自行另附纸张 printf(“Hello Cast!”): 亲爱的学弟学妹们&#xff0c;欢迎参与浙江理工大学计算机协会的笔试选拔部分。我们作为可爱的学长学姐&#xff0c;十…

10道字节跳动C++/Java笔试真题你能做对几道?3道就赢了80%的竞争者(含答案)

整理了几道字节跳动真题&#xff0c;来试试自己水平有多厉害吧&#xff0c;每题还有答案和详细解答哦。 1、变量a是一个64位有符号的整数&#xff0c;初始值用16进制表示为&#xff1a;0x7FFFFFFFFFFFFFFF。变量b是一个64位有符号的整数&#xff0c;初始值用16进制表示为&#…

chatgpt赋能python:Python:为什么没有桌面图标?

Python&#xff1a;为什么没有桌面图标&#xff1f; 作为一种功能强大的编程语言&#xff0c;Python越来越受到开发人员的欢迎。不过&#xff0c;相对于其他流行的应用程序&#xff0c;开发人员可能会发现一个让他们感到疑惑的问题&#xff1a;为什么Python没有桌面图标&#…