webview系列:Html5页面和Native App怎么进行交互

混合开发的App(Hybrid App)就是在一个App中内嵌一个轻量级的浏览器,一部分原生的功能改为Html5来开发,这部分功能不仅能够在不升级App的情况下动态更新,而且可以在Android或iOS的App上同时运行,让用户的体验更好又可以节省开发的资源。

我觉得一个Hybrid开发的App中必须要要有的功能就是Html5页面和Native App怎么进行交互。比如,我点了一个Html 5页面上的一个按钮或链接,我能不能够跳转到Native App的某个页面;比如我点了Html 5页面上的分享按钮,我能不能调用Native App的分享功能;比如Html加载的时候能不能获取Native App的用户信息等等。

一般来讲,我所知道的两种主流的方式就是:

js调用Native中的代码 
Schema:WebView拦截页面跳转

第2种方式实现起来很简单,但是一个致命的问题就是这种交互方式是单向的,Html5无法实现回调。如果需求变得复杂,假如Html5需要获取Native App中的用户信息,那么最好使用js调用的方式。例如我们通过淘宝客户端进入天猫的h5页面购物,在这种情况下,你就需要在webview页面获取登陆用户的信息。

一.方式1:js和Native进行交互

demo

webview相关页面配置

        WebSettings webSettings = mWebview.getSettings();//①设置WebView允许调用jswebSettings.setJavaScriptEnabled(true);webSettings.setDefaultTextEncodingName("UTF-8");//②将object对象暴露给Js,调用addjavascriptInterfacemWebview.addJavascriptInterface(new MyObject(TestWebViewActivity.this), "myObj");
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

静态页面

<html>
<head><title>Js调用Android</title>
</head><body>
<a href="xl://goods:8888/goodsDetail?goodsId=10011002">test scheme</a><input type="button" value="Toast提示" onclick="myObj.showToast('曹神前来日狗~');"/>
<input type="button" value="列表对话框" onclick="myObj.showDialog();"/>
</body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

MyObject

/*** Created by niehongtao on 16/10/9.*/
public class MyObject {private Context context;public MyObject(Context context) {this.context = context;}//将显示Toast和对话框的方法暴露给JS脚本调用@JavascriptInterfacepublic void showToast(String name) {Toast.makeText(context, name, Toast.LENGTH_SHORT).show();}@JavascriptInterfacepublic void showDialog() {new AlertDialog.Builder(context).setTitle("联系人列表").setIcon(R.mipmap.ic_launcher).setItems(new String[]{"基神", "B神", "曹神", "街神", "翔神"}, null).setPositiveButton("确定", null).create().show();}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

可参考 
Android基础入门教程——7.5.2 WebView和JavaScrip交互基础 
http://blog.csdn.net/coder_pig/article/details/48392621 
这个讲解的最为具体

二.方式2:Scheme:WebView拦截页面跳转

demo

点击网页里的超链接,跳转到原生页面

webviewActivity

package com.ht.fyforandroid.test.webview;import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.KeyEvent;
import android.webkit.WebView;
import android.webkit.WebViewClient;import com.ht.fyforandroid.R;
import com.ht.fyforandroid.base.BaseActivity;import butterknife.InjectView;/*** Created by niehongtao on 16/7/7.* 进行仿微信加载WebView显示进度条,直接调用start()方法进行跳转.*/
public class TestWebViewActivity extends BaseActivity {@InjectView(R.id.webview)WebView mWebview;@Overrideprotected int getLayoutId() {return R.layout.activity_webview;}@Overrideprotected void init(Bundle savedInstanceState) {TestWebViewActivity.super.mLoadingDialog.hideLoading();mWebview.loadUrl("file:///android_asset/test.html");mWebview.setWebViewClient(new WebViewClient() {@Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) {Uri uri = Uri.parse(url);if (uri.getScheme().equals("xl")) {startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));} else {view.loadUrl(url);}return true;}});}public static void startActivity(Context context) {Intent intent = new Intent(context, TestWebViewActivity.class);context.startActivity(intent);}@Overrideprotected void onDestroy() {super.onDestroy();if (mWebview != null) {mWebview.destroy();}}}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65

静态页面test.html

<html><body><a href="xl://goods:8888/goodsDetail?goodsId=10011002">test scheme</a>
</body></html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

需要跳转到的页面

配置信息

        <activity android:name=".test.scheme.Test1Activity"><!--要想在别的App上能成功调起App,必须添加intent过滤器--><intent-filter><!--协议部分,随便设置--><data
                    android:host="goods"android:path="/goodsDetail"android:port="8888"android:scheme="xl"/><!--下面这几行也必须得设置--><category android:name="android.intent.category.DEFAULT"/><action android:name="android.intent.action.VIEW"/><category android:name="android.intent.category.BROWSABLE"/></intent-filter></activity>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

页面

package com.ht.fyforandroid.test.scheme;import android.os.Bundle;import com.ht.fyforandroid.R;
import com.ht.fyforandroid.base.BaseActivity;/*** Created by niehongtao on 16/10/8.*/
public class Test1Activity extends BaseActivity {@Overrideprotected int getLayoutId() {return R.layout.activity_test1;}@Overrideprotected void init(Bundle savedInstanceState) {}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><TextView
        android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"android:text="scheme跳转测试"/></LinearLayout>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

应用场景:

Android中的scheme是一种非常好的实现机制,通过定义自己的scheme协议,可以非常方便跳转app中的各个页面; 
通过scheme协议,服务器可以定制化告诉App跳转那个页面,可以通过通知栏消息定制化跳转页面,可以通过H5页面跳转页面等。 
已经可以适应多数的应用场景

Html5页面和Native App怎么进行交互相关推荐

  1. HTML5 页面制作工具

    https://www.zhihu.com/question/30087283 HTML5 页面制作工具 免费的基于 HTML 5 的 Web Apps 生成器工具网站 81 235 初页  制作微信 ...

  2. native app 、web app 和hybrid app

    现在主流的应用程序可以分为三大类native app .web app 和hybrid app. 先简单介绍下这三类 1.Native App Native App是一种基于智能手机本地操作系统如iO ...

  3. html5页面跳转方式,H5页面跳转的交互设计方法

    今年做了大量的H5项目,遇到了很多坑,有自家的也有第三方的,在这个过程中get到了一些之前不具备的知识,所以这一篇,就简单分享一下这方面的话题吧. 一.传统的MPA 首先,说一个比较古老的东西,叫做M ...

  4. HTML5来到,原生Native APP是否还有市场

    业界很多主流的移动开发框架均源于PhoneGap.较著名的有Worklight.appMobi.WeX5等:其中WeX5为国内打造,完全Apache开源,在融合Phonegap的基础上,做了深度优化, ...

  5. html5微信自动播放视频,科技常识:HTML5页面音视频在微信和app下自动播放的实现方法...

    今天小编跟大家讲解下有关HTML5页面音视频在微信和app下自动播放的实现方法 ,相信小伙伴们对这个话题应该有所关注吧,小编也收集到了有关HTML5页面音视频在微信和app下自动播放的实现方法 的相关 ...

  6. 京东在html5页面中打开本地app的解决方案

    从html5打开本地的app–如果本地没有app就跳转到下载页面,大家都会认为这是一项很简单的操作.网上的教程也很多,但是可行性都不高.因为手机系统和浏览器型号各不相同,所以兼容性会是让各个前端工程师 ...

  7. html音视频app制作,怎么实现HTML5页面音视频在微信和app下自动播放

    怎么实现HTML5页面音视频在微信和app下自动播放 发布时间:2020-09-28 15:52:53 来源:亿速云 阅读:90 作者:小新 这篇文章给大家分享的是有关怎么实现HTML5页面音视频在微 ...

  8. html5页面转appstore,跳转App Store那些事儿

    在开发iOS应用或者开发移动端HTML5页面时候多多少少会跳转到App Store来完成一些事情,比如下载某个应用.应用评分.App Store支付设置等. 跳转到App Store分为引用内跳转和应 ...

  9. html5页面中打开本地app,如果没有跳转下载页面的解决方案

    需求效果 在推广网页上用户点击产品的详细信息时,判断出这个用户手机上是否安装自己的app如果安装了直接自动打开手机内的app应用,若没有则跳转app的下载页 技术实现 直接用window.locati ...

最新文章

  1. 微软发布新的Azure Pipelines功能和集成
  2. 零积分下载,2014年辛星mysql教程秋季版第一本已经完工,期待您的支持
  3. 安装centos系统时,修改默认网卡名
  4. 8、python基础知识-用户输入
  5. 用C语言输出一个字符串的所有子串
  6. oracle11G在linux环境下的卸载操作
  7. Write operations are not allowed in read-only mode (FlushMode.MANUAL)
  8. creo如何更改打开时显示方式_图纸打开显示问号时的一种快捷更改方法【AutoCAD教程】...
  9. 通过用户电脑ip获取用户当前所在城市以及天气
  10. C语言:百鸡百钱问题
  11. php查netstat,Netstat命令详解
  12. 安卓psp模拟器联机教程_安卓PSP模拟器评测:蜘蛛侠2
  13. pg数据库表存放在哪里_pg数据库系统表
  14. 华三防火墙应用二层和三层的配置实例
  15. zookeeper介绍及使用
  16. ReactHooks--踩坑1 :React Hook xx is called in function xx which is neither a React function component
  17. 《惢客创业日记》2021.08.06-09(周五)惢客与征信的区别(下)
  18. 子类能访问父类的哪些成员?
  19. Linux实用的快捷键
  20. 计算机相关专业术语中英文对照

热门文章

  1. sap 新建事务_SAP操作常用事务代码(大全)
  2. python比前端好学吗_前端学习到底难不难?
  3. python解压版怎么安装不了_python 连接数据库mysql解压版安装配置及遇到问题
  4. python内置函数有哪些_Python集合有哪些内置函数可以使用,这些内置函数有什么功能...
  5. 请用状态转换图描述一个绘制折线的对话过程_CAD画一个元器件电路符号(AD)...
  6. HTTP请求中的缓存(cache)机制
  7. 全球的weex资源都在这里
  8. 部署Exchange Server 2007 SCC
  9. php生成sitemap
  10. 《OpenStack 实战》内容概览与作者采访