文档章节

[Hybrid App]--Android混合开发,Android、Js的交互

o
 osc_8wyy9cyu
发布于 2019/03/28 11:43
字数 583
阅读 36
收藏 0

行业解决方案、产品招募中!想赚钱就来传!>>>

AndroidJs通信

Hybird App

Hybrid 开发:JsBridge - Web 和客户端的桥

Hybrid开发中,web页面往往会跟native进行交互,而JSBridge就是web页面和native进行通信的桥梁,通过JSBridge可以实现web调用native的方法,native可以通过webview.loadUrl之类的方法,将javascript:xxx代码放在页面执行,这有点类似在浏览器地址栏直接输入:javascript:xxx

 

 

web和native进行通信,JsBridge的多种形式

①JavaScriptInterface

// Android java代码
mWebView.addJavascriptInterface(new Class(), 'android');  

public class Class(){
@JavascriptInterface
public void method(){

}
} 


// js 代码
window.android.method();

②改写浏览器原有对象

通过修改原来浏览器的window某些方法,然后拦截固定规则的参数,然后分发给Java对应的方法去处理。这里常用的是以下四个方法:

  • alert,可以被webview的onJsAlert监听
  • confirm,可以被webview的onJsConfirm监听
  • console.log,可以被webview的onConsoleMessage监听
  • prompt,可以被webview的onJsPrompt监听

AgentWeb开源框架的基本使用

Android

if(mAgentWeb!=null){
        //注入对象
        mAgentWeb.getJsInterfaceHolder().addJavaObject("android",new AndroidInterface(mAgentWeb,this.getActivity()));
    }



mAgentWeb.getJsAccessEntrace().quickCallJs("callByAndroidParam","Hello ! Agentweb");



mAgentWeb.getJsAccessEntrace().quickCallJs("callByAndroidMoreParams", new ValueCallback<String>() {
                    @Override
                    public void onReceiveValue(String value) {
                        Log.i("Info","value:"+value);
                    }
                },getJson(),"say:", " Hello! Agentweb");




private String getJson(){

    String result="";
    try {

        JSONObject mJSONObject=new JSONObject();
        mJSONObject.put("id",1);
        mJSONObject.put("name","Agentweb");
        mJSONObject.put("age",18);
        result= mJSONObject.toString();
    }catch (Exception e){

    }

    return result;
}

JsBridge

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;

import com.github.lzyzsd.jsbridge.BridgeHandler;
import com.github.lzyzsd.jsbridge.BridgeWebView;
import com.github.lzyzsd.jsbridge.BridgeWebViewClient;
import com.github.lzyzsd.jsbridge.CallBackFunction;
import com.google.gson.Gson;
import com.just.agentweb.AgentWeb;

/**
* Created by cenxiaozhong on 2017/7/1.
* source code  https://github.com/Justson/AgentWeb
*/

public class JsbridgeWebFragment extends    AgentWebFragment {

    public static JsbridgeWebFragment getInstance(Bundle bundle){

    JsbridgeWebFragment mJsbridgeWebFragment =new JsbridgeWebFragment();
    if(mJsbridgeWebFragment !=null){
        mJsbridgeWebFragment.setArguments(bundle);
    }

    return mJsbridgeWebFragment;
}

private BridgeWebView mBridgeWebView;

@Override
public String getUrl() {
    return super.getUrl();
}

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {

    mBridgeWebView=new BridgeWebView(getActivity());
    mAgentWeb = AgentWeb.with(this)//
            .setAgentWebParent((ViewGroup) view, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT))//
            .useDefaultIndicator(-1, 2)//
            .setAgentWebWebSettings(getSettings())//
            .setWebViewClient(new BridgeWebViewClient(mBridgeWebView))
            .setWebChromeClient(mWebChromeClient)
            .setWebView(mBridgeWebView)
            .setSecurityType(AgentWeb.SecurityType.STRICT_CHECK)
//          .setDownloadListener    (mDownloadListener) 4.0.0 删除该API
            .createAgentWeb()//
            .ready()//
            .go(getUrl());




    initView(view);



    mBridgeWebView.registerHandler("submitFromWeb", new BridgeHandler() {

        @Override
        public void handler(String data, CallBackFunction function) {
            function.onCallBack("submitFromWeb exe, response data 中文 from Java");
        }

    });

    User user = new User();
    Location location = new Location();
    location.address = "SDU";
    user.location = location;
    user.name = "Agentweb --> Jsbridge";



    mBridgeWebView.callHandler("functionInJs", new Gson().toJson(user), new CallBackFunction() {
        @Override
        public void onCallBack(String data) {
            Log.i(TAG,"data:"+data);
        }
    });

    mBridgeWebView.send("hello");



}





static class Location {
    String address;
}

static class User {
    String name;
    Location location;
    String testStr;
}

}

推荐阅读


 

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
浅入浅出Android(003):使用TextView类构造文本控件

基础: TextView是无法供编辑的。 当我们新建一个项目MyTextView时候,默认的布局(/res/layout/activity_main.xml)中已经有了一个TextView: <TextView 运行效果如下: 修改其文本内容...

樂天
2014/03/22
580
1
beego API开发以及自动化文档

beego API开发以及自动化文档 beego1.3版本已经在上个星期发布了,但是还是有很多人不了解如何来进行开发,也是在一步一步的测试中开发,期间QQ群里面很多人都问我如何开发,我的业余时间实在...

astaxie
2014/06/25
2.7W
21
树莓派(Raspberry Pi):完美的家用服务器

自从树莓派发布后,所有在互联网上的网站为此激动人心的设备提供了很多有趣和具有挑战性的使用方法。虽然这些想法都很棒,但树莓派( RPi )最明显却又是最不吸引人的用处是:创建你的完美家用...

异次元
2013/11/09
5.2K
8
程序猿媛一:Android滑动翻页+区域点击事件

滑动翻页+区域点击事件 ViewPager+GrideView 声明:博文为原创,文章内容为,效果展示,思路阐述,及代码片段。文尾附注源码获取途径。 转载请保留原文出处“http://my.oschina.net/gluoyer...

花佟林雨月
2013/11/09
4.1K
1
Web开发组件管理器--Bower

Bower 是一个针对Web开发的包管理器。该工具主要用来帮助用户轻松安装CSS、JavaScript、图像等相关包,并管理这些包之间的依赖。 功能有些类似于Component。不同之处是,Component是围绕Git...

匿名
2013/02/01
1.2W
2

没有更多内容

加载失败,请刷新页面

加载更多

IntelliJ IDEA简介及jetbrains-agent安装教程

IDEA 全称 IntelliJ IDEA,是java编程语言开发的集成环境。IntelliJ在业界被公认为最好的java开发工具,尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(git、svn等)、J...

osc_mxz6aybo
10分钟前
8
0
Arraylist翻译分析

public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable { //序列号UID,代表版本,私有的静态常量 private static final......

osc_bgpugm2v
11分钟前
0
0
深入分析序列化和反序列化原理,终于知道serialVersionUID到底有什么用了

深入序列化和反序列化原理 一个问题引发的思考 什么是序列化和反序列化 为什么需要序列化 序列化的方式 Java序列化 serialVersionUID的作用 serialVersionUID的两种表现形式 Transient关键字...

osc_sw1y4qdg
11分钟前
0
0
039. Nginx 负载均衡

1. 基于反向代理的功能,Nginx 作为负载均衡主要有以下几点理由: 高并发连接。 采用 epoll nio 的形式。 内存消耗少。 使用了大量自带的数据结构(自己设计的)。 数据拷贝采用类零拷贝的形式...

华夏紫穹
13分钟前
12
0
线程的基本概念和线程的使用方法

线程的基本概念 很多人会对程序、进程和线程之间理解比较含糊,在此先给出三者的概念: 程序:是一个指令的集合,意思就是我们为了完成特定的功能而编写的代码。 进程:是指程序的一次静态态执...

osc_t46alvdj
13分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部