android hybird 与h5 app区别

hybird 与h5 app是不一样的,以前对这两者理解有所误解,在实际开发中也并未真正采用hybird,而是使用h5+app外壳实现移动端应用。虽然开发出来的应用实现了无需升级app实现主功能更新,但是交互体验上较原生相差甚多。

Hybrid App(混合模式移动应用)是指介于web-app、native-app这两者之间的app,兼具“Native App良好用户交互体验的优势”和“Web App跨平台开发的优势”(摘自百度百科)

一般hybird app会将需要动态更新页面及功能内置到app中,也就是将web页面预置到本地,android端通过加载本地html页面实现快速加载,由于不需要经过网络,速度上会有极大的提升。而需要升级是,则需在服务器上建立对应的资源包,并将服务器资源包与本地html版本做对比,若不一致则从服务器加载资源压缩包,并下载到本地,从而实现不需要重新安装app快速升级迭代的目的。此功能适用于需要频繁更新,又对性能要求较高的场景,例如新闻头条页等。若用h5实现,则体验上会相差不少。

android 与js混合调用方式

1.通常android与js混合调用的方式是android端定义webView,并设置如下代码

WebSettings settings = mWebView.getSettings();

settings.setJavaScriptEnabled(true);

//设置本应用加载网页

mWebView.setWebViewClient(new WebViewClient(){

@Override

public boolean shouldOverrideUrlLoading(WebView view, String url) {

view.loadUrl(url)

return true;

}

});

mWebView.loadUrl("***.html");

此处传入url并开启访问网络权限即可实现打开页面.AndroidManifest.xml

下面正式开始JS调用android方式

需要建立一个桥,如下

import android.content.Context;

import android.webkit.JavascriptInterface;

import android.widget.Toast;

public class JsInterface {

private Context mContext;

public JsInterface(Context context){

mContext = context;

}

//必须加注解,为了安全性考虑,4.2后强制

@JavascriptInterface

public void showToast(String params){

Toast.makeText(mContext,"Hello"+params,Toast.LENGTH_LONG).show();

}

}

//MainActivity中

JsInterface jsInterface = new JsInterface(MainActivity.this);

myWebView.addJavascriptInterface(jsInterface,"bridge");

//js中,使用如下代码

document.getElementById('#btn').addEventListener("click",function(){

if(window.bridge){

window.bridge.showToast('from js methods');

}

})

此时js可以成功 调用到android中原生方法,但是回调会很麻烦,4.4中有evaluatejavascript可以实现,但是未兼容到4.4以下。至此,因为本文中的重点,hybird的实现方案及js与android交互方案。

hybird中的实现方式

原理与android中原生schema协议类似,通过拦截URl形式实现。可以通过自定义协议名称,然后webView中拦截这个schema,并解析其中参数与回调函数,js调用android方法,并实现回调。

首先定义协议,即需要拦截的scheme ,我在这里定义 myschema://utils,这个协议名可以是任意的,只要拦截统一即可。

封装的js方法如下

function invoke(action, data, callback) {

// 拼装 schema 协议,action对应需要实现的方法名

var schema = 'myshema://utils/' + action

// 拼接参数 data对应参数

schema += '?a=a'

var key

for (key in data) {

if (data.hasOwnProperty(key)) {

schema += '&' + key +"="+ data[key];

}

}

// 处理 callback

var callbackName = ''

if (typeof callback === 'string') {

callbackName = callback

} else {

callbackName = action + Date.now()

window[callbackName] = callback

}

schema += '&callback='+callbackName;

//最终拼接出来应该是zhezhong这种形式 myshema://utils/actioin?a=a&key=value&callback=callbackName

// 触发

var iframe = document.createElement('iframe')

iframe.style.display = 'none'

iframe.src = schema // 重要!此处会发送连接,会被webviwe捕获到

var body = document.body

body.appendChild(iframe)

setTimeout(function () {

body.removeChild(iframe)

iframe = null

})

}

index中

document.getElementById('btn1').addEventListener('click', function () {

// invokeScan()

invoke('showToast',{name:'js'},function(res){

console.log("回调成功",res)'

})

//location.href="http://www.baidu.com";

})

android中,将js文件与index文件放置与assets文件夹下,webView加载此index,并设置拦截,代码如下

myWebView.setWebViewClient(new WebViewClient(){

@Override

public boolean shouldOverrideUrlLoading(WebView view, String url) {

//重要,此处实现拦截,可解析参数,根据action名称调用不同方法,此处未演示

if(url.contains("myshema://utils/")){

Toast.makeText(MainActivity.this,"调用成功",Toast.LENGTH_LONG).show();

String callback = "";

Mapparams = UriUtil.URLRequest(url);

if(params.containsKey("callback")){

view.loadUrl("javascript:"+params.get("callback")+"()");

}

}else{

view.loadUrl(url);

}

return true;

}

});

myWebView.loadUrl("file:///android_asset/index.html");

至此,实现了通过自定义schema实现js拦截调用android原生方法的方案,此方案好处是可以隐藏调用细节,将调用细节封装到内部,更安全,而且兼容性更好.

若有问题,欢迎提问并与我联系,转载请注明作者!

Android自定义schema,android hybird 实现:自定义schema相关推荐

  1. android炫酷的自定义view,Android自定义View实现炫酷进度条

    本文实例为大家分享了Android实现炫酷进度条的具体代码,供大家参考,具体内容如下 下面我们来实现如下效果: 第一步:创建attrs文件夹,自定义属性: 第二步:自定义View: /** * Cre ...

  2. android单线字体,Android自定义字体

    在main文件夹下,新建assets/fonts文件,添加.otf文件 image.png 字体工具类 import android.app.Application; import android.g ...

  3. android 自定义命名空间,Android自定义ActionBar实例

    本文实例讲述了android自定义actionbar的实现方法.分享给大家供大家参考.具体实现方法如下: android 3.0及以上已经有了actionbar的api,可以通过引入support p ...

  4. Android UI开发第五篇——自定义列表

    自定义列表,设置列表背景.列表的列背景.列表的间隔线. 借鉴了一些前辈的代码. MainActivity.class public class MainActivity extends Activit ...

  5. android sqlite自定义函数,Android中自定义一个View的方法详解

    本文实例讲述了Android中自定义一个View的方法.分享给大家供大家参考,具体如下: Android中自定义View的实现比较简单,无非就是继承父类,然后重载方法,即便如此,在实际编码中难免会遇到 ...

  6. Android View体系(十)自定义组合控件

    相关文章 Android View体系(一)视图坐标系 Android View体系(二)实现View滑动的六种方法 Android View体系(三)属性动画 Android View体系(四)从源 ...

  7. 【Android游戏开发二十三】自定义ListView【通用】适配器并实现监听控件!

    本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/374.html L ...

  8. android 自定义event,Android运用onTouchEvent自定义滑动布局

    写在自定义之前 我们也许会遇到,自定义控件的触屏事件处理,先来了解一下View类中的,onTouch事件和onTouchEvent事件. 1.boolean onTouch(View v, Motio ...

  9. android 在xml文件中引用自定义View

    在xml中引用自定义view 方法一: [java] view plaincopy <com.test.copytext.CopyText android:layout_width=" ...

最新文章

  1. FireFox and IE CSS兼容要点
  2. 3天html自学教程,html自学教程(八)html5基础
  3. git pull代码出现refusing to merge unrelated histories错误
  4. 在配置类上写@CompentScan注解来进行包扫描
  5. C#在Linux+Mono环境中使用微信支付证书
  6. windows apache部署php,Windows下部署Apache+PHP+MySQL运行环境实战
  7. go出现missing go.sum entry for module providing package 错误
  8. 如何在面试时保持冷静_如何保持冷静并成为安全工程师
  9. matlab自相关法,Matlab计算自相关和互相关
  10. Filecoin网络目前总质押量约为2294万枚FIL
  11. 使用pandas的dataframe清理excel里面空值
  12. Hive虚拟内存溢出报错:2.9GB of 2.1GB virtual memory used. Killing container.解决办法
  13. html边框倾斜,弯曲的边框CSS实现
  14. 如何让你的内网服务器可以被外网访问到(端口映射、NAT、域名解析、IP地址)
  15. 基于OSGi的企业级开发框架实践——序篇
  16. python实现截竹竿
  17. 李弘毅老师GAN笔记(二),Conditional GAN
  18. python中uniform_Python基础之uniform()的详解
  19. web无插件解码播放H264/H265(js解码HTML5播放)
  20. 《红色警戒II》全攻略苏军篇

热门文章

  1. windows server 2003的驱动
  2. java猜字母游戏jsp_jsp+servlet实现猜数字游戏
  3. 面向对象有限元框架设计(OOFEM)
  4. 总结蛋糕店如何制定产品策略
  5. 一图看懂《百年孤独》人物关系
  6. CCD视觉高速喷射点胶机的优势
  7. 2023 Mycode码支付系统PHP源码
  8. 2、虚拟机的快照与克隆
  9. Java 基础篇(一)基本概念
  10. 高数 | 一阶可导 一阶连续可导 二阶可导 二阶连续可导 为什么函数二阶可导却不能用两次洛必达法则?