Android混合开发详解

2023-11-03

1 Android加载HTML页面
1.1 WebView简介与使用

  1. Webview的应用场景

WebView控件功能强大,除了具有一般View的属性和设置外,还可以对url请求、页面加载、渲染、页面交互进行强大的处理,主要用于html页面的加载。

  1. WebView的使用步骤

(1) 在xml布局中创建对应的webview控件

                                           image001.jpg

(2) 代码中通过findViewByid找出对应的控件

image002.jpg

(3) Webview通过地址URL加载网页

// 1. 直接加载一个网页

webview.loadUrl(“http://baidu.com”);

注意:采用上面的方式加载网页,系统会重新打开浏览器加载网页,用户体验不好,需要进行以下设置

//2.处理跳转打开新的浏览器的问题setWebViewClient
webview.setWebViewClient(
new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
//3.告诉系统不要打开新的浏览器了自己处理页面
return true;
}
}
);
//4.网页控件默认不支持JavaScript 需要用户打开支持的开关
webview.getSettings().setJavaScriptEnabled(true);
//5.网页控件默认不支持弹出框 alert() prompt() confirm()…
// 但是Html5的弹出框是默认支持的設置setWebChromeClient
webview.setWebChromeClient(new WebChromeClient() {
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
return super.onJsAlert(view, url, message, result);
}
});
}
(4) WebView加载本地html页面

首先需要在Android项目的src—main包下面创建assets文件夹,将对应的html放入其中,如下图所示:

image003.jpg

// 加载本地的网页
webview.loadUrl(“file:///android_asset/webview.html”);
(5) WebView直接加载html代码的两种方式

image004.jpg

LoadData与LoadDataWithBaseURL的区别是什么?

两个方法加载的HTML代码片段有些不同,loadData()中的html data中不能包含’#’, ‘%’, ‘’, ‘?‘四中特殊字符,这就为内嵌css等制造了些许麻烦,因为css中经常用’#’, '%'等字符,需要用UrlEncoder编码为%23, %25, %27, %3f

在使用loadDataWithBaseURL时,需要注意的就是 baseUr:虽然API上写的是要传一个Url,但我在用时,发现传一个Url并不可以,我发现这个就是一个标志位,用来标志当前页面的Key值的,而historyUrl就是一个value值,在加载时,它会把baseUrl和historyUrl传到List列表中,当作历史记录来使用,当前进和后退时,它会通过baseUrl来寻找historyUrl的路径来加载historyUrl路径来加载历史界面,需要注意的就是history所指向的必须是一个页面,并且页面存在于SD卡中或程序中(assets),loadDataWithBaseURL,它本身并不会向历史记录中存储数据,要想实现历史记录,需要我们自己来实现,在加载页面时,把数据另外的写到一个html页面中,并把它保存到SD中,当点击返回时,它会通过historyUrl指向的路径来加载页面,这样就解决了历史记录问题

2 HTML与原生Android交互
2.1 HTML页面调用java中的方法
案例以本地的HTML页面为例进行讲解

(1) 在Android中创建供js调用的类和方法

image005.jpg

(2) 在加载网页的时候需要进行相应的设置

image006.jpg

(3) 在js中调用Android中方法的方式

在js中通过myObj调用本地的方法

image007.jpg

2.2 Android中调用HTML中的js代码
image008.jpg

注意:以上方法能够调用的前提是webview已经把对应的网页加载进来了

Js中对应的方法如下:

image009.jpg
3 WebView常用方法细节剖析
3.1 给webView添加header信息的方式
复写loadUrl()方法

@Override public void loadUrl(String url) {

  Map<String, String> map = new   HashMap<String, String>();     
       map.put("ajax", "true");     
       map.put("appversion",   SharedPreferencesUtil.getAppVersion(getContext()));    

map.put(“clientid”, SharedPreferencesUtil.getClientId(getContext()));

  loadUrl(url, map);

}

3.2 Websettings详解

  1. 打开网页时不调用系统浏览器, 而是在本WebView中显示:

mWebView.setWebViewClient(new WebViewClient(){

   @Override

   public boolean shouldOverrideUrlLoading(WebView view, String url) {

        view.loadUrl(url);

        return true;

  }

});

  1. 通过java代码调用javascript

WebSettings webSettings = mWebView .getSettings();

webSettings.setJavaScriptEnabled(true);

mWebView.addJavascriptInterface(new Object() {

         public void clickOnAndroid() {        

             mHandler.post(new Runnable() {        

                public void run() {      

                    webview.loadUrl("javascript:wave()");         

                }      

              });      

          }      

      }, "demo");
  1. 按返回键时, 不退出程序而是返回上一浏览页面:

public boolean onKeyDown(int keyCode, KeyEvent event) {

      if ((keyCode == KeyEvent.KEYCODE_BACK) &&   mWebView.canGoBack()) {      

          mWebView.goBack();      

          return true;      

      }      

    return super.onKeyDown(keyCode, event);      

}
  1. 打开页面时,自适应屏幕:

WebSettings webSettings = mWebView .getSettings();

webSettings.setUseWideViewPort(true);//设置此属性,可任意比例缩放

webSettings.setLoadWithOverviewMode(true);

  1. 页面支持缩放:

WebSettings webSettings = mWebView .getSettings();

webSettings.setJavaScriptEnabled(true);

webSettings.setBuiltInZoomControls(true);

webSettings.setSupportZoom(true);

6.如果webView中需要用户手动输入用户名、密码或其他,则webview必须设置支持获取手势焦点。

webview.requestFocusFromTouch();

3.3 WebviewClient方法详解
WebviewClient常用方法:

1、shouldOverrideUrlLoading(WebView view, String url)

在API 24以后过时,当一个url即将被webview加载时,给Application一个机会来接管处理这个url,方法返回true代表Application自己处理url;返回false代表Webview处理url。举个例子,项目中需要处理传过来的URL是一个事件还是一个HTTP链接,可以通过自定义协议头 (nativeapi://) 来过滤,如:

@Override

public boolean shouldOverrideUrlLoading(WebView view, String url) {

Uri   uri = Uri.parse(url);

   String scheme = uri.getScheme();      

          if (TextUtils.isEmpty(scheme)) return true;    

        if (scheme.equals("nativeapi")) {        

         //如定义nativeapi://showImg是用来查看大图,这里添加查看大图逻辑

       return true;

 }   else if (scheme.equals("http") || scheme.equals("https"))   {        

          //处理http协议

       if (Uri.parse(url).getHost().equals("www.example.com"))   {           

          // 内部网址,不拦截,用自己的webview加载

           return false;

       } else {            

          //跳转外部浏览器

          Intent intent = new Intent(Intent.ACTION_VIEW, uri);

          context.startActivity(intent);             

          return true;

       }

   }     return   super.shouldOverrideUrlLoading(view, url);

}

注:如果使用的是Post请求方式,则此方法不会被回调

2、shouldOverrideUrlLoading(WebView view, WebResourceRequest request)在API 24以后新加的,使用同上。

3、shouldInterceptRequest(WebView view, String url)

在API 21以后过时,通知Application加载资源的请求并返回请求的资源,如果返回值是Null,Webview仍然会按正常加载资源;否则返回的数据将会被使用

注:回调发生在子线程中,不能直接进行UI操作

4、shouldInterceptRequest(WebView view, WebResourceRequest request)

在API 21以后新加,使用同上

5、onPageStarted(WebView view, String url, Bitmap favicon)通知Application页面已经开始加载资源,页面加载过程中,onPageStarted至多会被执行一次

6、onPageFinished(WebView view, String url) 通知Application页面已经加载完毕

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

通知Application有错误发生,这些错误是不可恢复的(即主要的资源不可用)。errorCode参数对应于一个ERROR_ *常量

8、shouldOverrideKeyEvent(WebView view, KeyEvent event)
//重写此方法才能够处理在浏览器中的按键事件。
9、doUpdateVisitedHistory(WebView view, String url, boolean isReload)
//(更新历史记录)
10、onLoadResource(WebView view, String url)
// 在加载页面资源时会调用,每一个资源(比如图片)的加载都会调用一次。
3.4 WebCromeClient方法详解
1、onProgressChanged(WebView view, int newProgress)

通知Application的加载进度,newProgress取值范围[0,100],可以通过这个方法来编写一个带加载进度条的Webview

2、onReceivedTitle(WebView view, String title)

当加载页面标题有改变时会通知Application,title即为新标题。

4 Android studio中打包MUI项目

  1. 使用HBuilder创建一个web app的项目,如下图:

image010.png

  1. 在Android studio中新建一个项目

  2. 去官网下载对应的html5+sdk

  3. 将HBuilder项目拷贝到Android studio中的assets文件夹中

image011.jpg

image012.jpg

  1. 接下来需要将打包所用到的jar包和配置文件从下载的5+SDK中拷贝到Android studio里面

注意:jar包拷贝到libs文件夹下面,在 assets目录下新建一个data文件夹,并将对应的配置文件拷贝过去,更改配置文件中的appid;

从下载的5+SDK中的sdk文件夹下的libs中拷贝相应的jar包到Android studio中

image013.jpg

将5+sdk包中的HBuidler-Integrate下assetsàdata目录中的配置文件全部包拷贝到studio中assets目录下的data目录中更改一下文件名,如下图所示.

image014.jpg

修改control.xml中的appid与hbuilder中的一致

image015.png

将5+sdk下面HBuidler-Integrate-àres下的所有文件拷贝到studio中的res文件夹下,主要是mui项目转换为Android项目后的一些资源文件;

image016.png

拷贝HBuidler-Integrate-à src\com\HBuilder\integrate目录下的SDK_WebApp到对应的studio项目的包下面作为项目的入口Activity,这个时候还需要拷贝HBuilder-Integrate\src下的io包到studio的java目录下,如图所示:

image017.jpg

修改AndroidMnifest.xml配置文件的入口Activity和相应的权限

<?xml version="1.0" encoding="utf-8"?>

 <application
     android:allowBackup="true"
     android:icon="@mipmap/ic_launcher"
     android:label="@string/app_name"
     android:supportsRtl="true"
     android:theme="@style/AppTheme">
     <activity android:name=".SDK_WebApp">
         <intent-filter>
             <action android:name="android.intent.action.MAIN"/>

             <category android:name="android.intent.category.LAUNCHER"/>
         </intent-filter>
     </activity>
 </application>

 <uses-permission android:name="android.permission.INTERNET" />
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
 <uses-permission android:name="android.permission.GET_TASKS" />
 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

运行程序即可,现在就已经把HBuilder的项目转换为原生的Android项目打包结构
转自 http://learnfuture.com/article/1758

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android混合开发详解 的相关文章

  • 2021年全国职业院校技能大赛 “大数据技术与应用”—模拟赛题(一)

    2021年全国职业院校技能大赛 大数据技术与应用 模拟赛题 一 文章适合了解大数据技术与应用技能大赛 赛题 文章在编写过程中难免有疏漏和错误 欢迎大佬指出文章的不足之处 更多内容请点进 Lino White 查看 未来的世界充满着各式各样的
  • 查看权限linux文件权限

    查看权限 rw rw r 一共有10位数 其中 最前面那个 代表的是类型 中间那三个 rw 代表的是所有者 user 然后那三个 rw 代表的是组群 group 最后那三个 r 代表的是其他人 other 然后我再解释一下后面那9位数 r
  • Taro如何打包Android apk?

    首先 我们使用使用命令创建模板项目 创建的命令如下 taro init myApp 然后 使用 yarn 或者 npm install安装依赖包 并使用下面的命令编译Taro项目 yarn dev rn 启动后会开启一个监听的进程 不过 细
  • 知识蒸馏(Knowledge Distillation)

    0 Introduction 知识蒸馏 Knowledge Distillation 简记为 KD 是一种经典的模型压缩方法 核心思想是通过引导轻量化的学生模型 模仿 性能更好 结构更复杂的教师模型 或多模型的 ensemble 在不改变学
  • 邮件附件乱码小技巧

    经常有人收到一些Internet邮件 里面有一个附件 例如文件名叫 我的WORD文档 doc 可是用WORD打开后 提示错误或者乱码 遇到这种情况可以用以下步骤解决 1 重命名 把 我的WORD文档 doc 改名字为 我的WORD文档 uu
  • 简单快速复制CSDN上的博客到自己的电脑上(带图片和格式)

    准备工具 typora md编辑器 直接去官网https www typora io 下载 一直点下一步 下载好了后界面是这样的 清爽且好用 需要做一点设置 文件 偏好设置 图像 如下设置 软件已经安装好并且可以使用了 看到这里可能你会有疑
  • Android混合开发详解

    1 Android加载HTML页面 1 1 WebView简介与使用 Webview的应用场景 WebView控件功能强大 除了具有一般View的属性和设置外 还可以对url请求 页面加载 渲染 页面交互进行强大的处理 主要用于html页面
  • 微信小程序数据传递的几种方式,你都掌握了吗?

    1 组件传递内容给页面 给组件设置myevent事件 通过this triggerEvent myevent myEventDetail 触发该myevent事件并传递内容 在页面用onMyEventshi事件监听传递过来的数据 Page
  • 等保2.0建设

    现在的等保2 0建设都是要完整
  • 未明学院:从国企联通到金融科技随手记,学长告诉你国企和互联网私企差别有多大?

    作者 W同学 未明学院学员 在未明学院完成课程的学习后 成功拿下上汽通用五菱汽车股份有限公司数据工程师offer和香港城市大学资讯ISM研究生offer 正文 首先自我介绍 我是四川大学信息管理与信息系统专业2017届本科毕业生 辅修了财务
  • 用深度学习和CNN进行年龄识别

    DIP大作业 用深度学习和CNN进行年龄识别 基于深度学习的方法 基本步骤 深度学习方法 1 10 需求分析 系统设计 环境搭建 2 10 数据集及预处理 3 40 卷积神经网络模型设计 模型程序编写 模型训练 模型测试 4 30 实验结构
  • 静态代码分析工具清单:开源篇(各语言)

    本文是一个静态代码分析工具的清单 共有26个工具 包括4个 NET工具 2个Ada工具 7个C 工具 4个Java工具 2个JavaScript工具 1个Opa工具 2个Packaging工具 3个Perl工具 1个Python工具 1 N
  • 一个月能做什么?成长&感悟分享

    一个月做了什么 八月做了些什么 单词打卡 第一件事情就是单词打卡 英语很差的我 一样继续打卡 今天是第736天 当你还在纠结扇贝和不背 可可英语哪一个好的时候 别人已经同时使用了 当你还在咨询学编程 敲代码需不需要英语的时候 别人已经开始同
  • 将hexo博客搭建在github上

    注册github账号并创建仓库 首先在github上注册账号 填写用户名 email 密码 会有验证通过邮箱发送给你 进行验证 选择仓库 创建一个和你用户名相同的仓库 如 你的 用户名 github io 必须以用户名开头 创建仓库 步骤
  • 【CSDN】删除文章后,浏览量会减少吗?了解软删除和硬删除

    hello 我是小索奇 如果你也在博客写作的话 有没有考虑到一个问题 文章删除后 浏览量会减少吗 下面就给大家阐述一下 当在CSDN中删除已发布的文章后 该文章的浏览量统计会有以下情况 软删除状态的文章 浏览量统计会保留 不会下降或者重置
  • AI写作神器,轻松解决你的写作难题

    1 全新体验 AI帮你轻松解决写作难题 在现代社会中 每个人都会面临写作的挑战 但对许多朋友而言 这项任务可能会让人感到困惑或头痛 不用担心 有了AI文章免费写作工具 这种情况可以显著缓解了 这是一个全新的写作体验 旨在帮您轻松应对各种写作
  • 校长亲测,文章采集工具:提升学生写作阅读素养利器

    近期 我代表校长身份有幸试用了 文章采集工具 这款线上资源下载利器 通过使用此神器 我得以精准检索海量优秀文章 助力提升学生们的写作及阅读素养 更有效地激发学校文化生活的新活力 1 真实可靠 我原本对在线下载工具持保留意见 但在深入研究并亲
  • AI原创文章在线生成工具:颠覆你的写作体验

    1 引言 身为热爱数码科技的爱好者 我始终对人工智能技术有着浓厚兴趣 近日 我偶然得知有一款名为 AI原创文章在线生成工具 的实用神器 据称能够自动生成各类主题的文章 为确认它的实证性及可信度 我亲身进行了一次细致的测评与比较 2 实用性评
  • AI制文技术:打开创作新天地

    第一印象 人工智能妙不可言 首次尝试使用AI创作文章 我深深感受到其高效与精准 您仅需提供一个富有吸引力的话题 AI便能轻松构思出一个引人入胜的标题 进一步地 电脑能依据您的主题自动生成详细且具有逻辑性的文本内容 无论是在文字数量还是结构框
  • AI制文技术:打开创作新天地

    第一印象 人工智能妙不可言 首次尝试使用AI创作文章 我深深感受到其高效与精准 您仅需提供一个富有吸引力的话题 AI便能轻松构思出一个引人入胜的标题 进一步地 电脑能依据您的主题自动生成详细且具有逻辑性的文本内容 无论是在文字数量还是结构框

随机推荐

  • 情商-《整理情绪的力量》-读后感

    读书使人进步 每天进步一点点 前言 是否有过无法整理好自己情绪的时候 是否有过对自己的情绪无计可施 只能任其左右的时候 心情烦躁 做什么事都心不在焉 生了一肚子气 听不进对方的意见 提不起干劲来 没法好好工作 焦虑万分 不能冷静地行动 虽然
  • 「骚操作」我背着女朋友,用 Python 偷偷抓取了她的行踪

    点击上方 AI派 选择 设为星标 最新分享 第一时间送达 阅读文本大概需要 5 分钟 1 目 标 场 景 有时候女朋友一个人在外面玩耍 问她在哪个地方 就是不告诉我 但是 你又很想知道女朋友的 位置 这该如何是好 其实你可以这样套路女朋友
  • Microsoft首席信息安全官CISO研讨会白皮书:网络安全简介(01)

    Microsoft Cybersecurity Briefing 01 2022年9月22日微软举行了信息安全官 CISO 研讨会 Security is our top priority and we are committed to w
  • Android学习

    Android学习 控件 imageView 主要属性 scalefype属性 演示 主要属性 1 android src 设置图片资源 2 android scalefype 设置图片缩放类型 3 android maxHeight 最大
  • python 随机生成N个坐标,并画随机大小的圆

    python 随机生成N个坐标 并画随机大小的圆 import matplotlib pyplot as plt import numpy as np plt plot x y plt show class Circle def init
  • MacOS Xcode与Swift版本对应关系

    Swift4 Xcode9 0 or later macOS 10 12 6 Xcode 9 4 1 macOS 10 13 2 Swift4 2 Xcode10 or later macOS 10 13 4 Swift5 0 ABI 现在
  • 解决某网站无法调试的问题(function anonymous( ) { debugger })

    Ctrl F8
  • Add Addtional Series with fitlers of Stacked Column Charts or Bar Charts in MS CRM 2011

    Aggregate Total on top of Stacked Column Charts or Bar Charts in MS CRM 2011 Adding an aggregated total to the top of a
  • Oracle面试题整理

    目录 Oracle面试题整理 1 MySQL和Oracle的区别 2 Oracle中function和procedure的区别 3 比较truncate和delete命令 4 oralce中 rowid rownum的定义 5 事务的特性
  • K8S系列一:概念入门

    写在前面 本文组织方式 K8S的架构 作用和目的 需要首先对K8S整体有所了解 K8S是什么 为什么是K8S K8S怎么做 K8S的重要概念 即K8S的API对象 要学习和使用K8S必须知道和掌握的几个对象 Pod 实例 Volume 数据
  • 【目标检测】9、Feature Selective Anchor-Free Module for Single-Shot Object Detection

    文章目录 摘要 1 引言 2 相关工作 3 Anchor free特征选择模型 3 1 网络结构 3 2 Ground truth 和 loss 3 3 在线特征选择 3 4 Joint 推断和训练 4 实验 4 1 消融学习 4 2 与目
  • 生成payload木1马 攻击 linux

    需要 1 生成payload 木马 2 开启httpd 3 启动msfdb run 监听 4 目标机下载payload 并执行 5 6 开始 1 生成payload 木马 把他存放到httpd服务的 var www html 下 msfve
  • 【Vue/element】 el-table实现表格动态新增/插入/删除 表格行,可编辑单元格

    el table实现表格动态新增 插入 删除 表格行 可编辑单元格 效果如下 点击 新增一行 可以在表格最后新增一行 单元格内容可编辑 点击绿色 按钮 可在指定行的后面插入一行 点击红色 按钮 可以删除指定行 原理 表格el table是通
  • 值得收藏的30道Python练手题(附详解)

    今天给大家分享30道Python练习题 建议大家先独立思考一下解题思路 再查看答案 文末附python学习资料 1 已知一个字符串为 hello world yoyo 如何得到一个队列 hello world yoyo 使用 split 函
  • 指针数组与数组指针、函数指针与函数指针数组

    一 指针数组 是一个存放指针的数组 eg int arr 优先级高 所以arr首先是一个数组 里面存放的是一个个指针 int arr 数组中放入二级指针 二 数组指针 是一个指向数组的指针 eg int arr 10 指向int 10 的指
  • Mybatis:in在where查询条件中的写法(mysql和pgsql)

    在mybatis使用过程中 有时需要传递一个包含多个值的参数 用in来查询这些值范围内的数据 如fid是一个Int类型字段 现在需要查询1 2 3 这三个fid的记录 直接将 1 2 3作为一个入参传递进来时 需要做些修改才能正确实现In的
  • 哪些行业需要重点防御ddos攻击

    DDoS攻击是网络安全领域最为常见 危害性十分庞大的攻击方式之一 各大行业都很容 易遭受DDoS攻击 因此受到了各个企业的广泛关注 那么到底什么是DDoS攻击 哪些行业最 需要预防DDoS攻击 我们一起来看看吧 到底什么是DDoS攻击 DD
  • 类什么时候被加载

    在Java中 类会在第一次使用时被加载 而加载类的时机取决于类的加载触发条件 Java类的加载过程是按需加载的 这意味着只有在需要使用类的时候 类才会被加载到内存中 类加载的触发条件包括以下情况 创建类的实例 当你使用 new 关键字创建一
  • 组合优化

    组合优化 MATLAB实现GA BP和PSO BP多输入单输出预测 目录 组合优化 MATLAB实现GA BP和PSO BP多输入单输出预测 基本介绍 程序设计 GA BP PSO BP 参考资料 基本介绍 MATLAB实现GA BP和PS
  • Android混合开发详解

    1 Android加载HTML页面 1 1 WebView简介与使用 Webview的应用场景 WebView控件功能强大 除了具有一般View的属性和设置外 还可以对url请求 页面加载 渲染 页面交互进行强大的处理 主要用于html页面