Android APP开发框架选择——JSBridge既个人心得和技巧

前言: 

 前几年公司要求做手机移动端APP开发,很多牛企也来我们这里推广自己的框架,比如IBM WorkLight,微软office365等等。

  最近做个APP,个人谈谈框架的选择和自己心得。

  首先,作为程序猿,不要抱有什么都是出钱买的想法,首先否定上面牛企的框架,我们客户买过一个10W美刀的授权,不说全国也算全省第一家。

  我首先考虑的当然是Apache Cordova,这个大家都听说过。

  我试验了一个月,结合其他部门使用IBM WorkLight经验,发现这不适合我。

  首先它所谓跨平台,基于JSBridge的再次封装,如果要大量使用原生功能,必须自己写插件。

  其次,所谓插件很多,实际上根本就不好用,不仅要我投入时间学习,比起原始功能开发,慢,我半个月搭好的框架,实际原生开发就一天能实现;

  WorkLight还很特别,因为里面Apache Cordova版本比较老,插件还不能直接用命令行配置,需要自己配置。

  最后,不得以,考虑是否用Android原生框架,后来想想,这样干也不行,因为公司,也可以说基本我们和其他公司都是java/.net web程序猿,

  如果你用Android原生框架倒是省事了,但对于以后来说,加大了人员和维护成本。


  综合上述实际,决定使用JSBridge 作为本次开发框架

  首先说一句:不跨平台,不跨平台,你要跨平台自己选Apache Cordova,苹果常升级IOS,对不起,我们开发部门同事不和你一起加班改兼容性。


  简介

 Android JsBridge 就是用来在 Android app的原生 java 代码与 javascript 代码中架设通信(调用)桥梁的辅助工具。

 形象点说就是HTML通过AJAX类似东西调用后台原生JAVA开放接口,这样前端同事只要完成界面,后台用原生java开发,你不会我也没辙了。


  我选择了xesam的JsBridge 作为开发框架

https://github.com/xesam/JsBridge

  至于怎么使用,我就不说了。


  技巧:

  技巧只有一个,就是怎么使用crosswalk,为什么要用这个呢?用过Cordova的朋友就知道了,早期Android使用webview而不是Chrome作为默认的浏览器内核,这样兼容性和性能很难让人满意。

  怎么下载和集成crosswalk,我就不说了,直接下载官方网站的AA包用AS 引用就可以了。

  官方网站:https://crosswalk-project.org/


  那xesam的JsBridge如何进行修改呢?

  修改如下:

  需要修改 @JavaScriptInterface 所在的包是 import org.xwalk.core.JavascriptInterface;

  要修改JsBridge,ServerProxy两个文件

  原始:

package dev.xesam.android.web.jsbridge;

import android.annotation.SuppressLint;
import android.webkit.WebView;

import java.net.MalformedURLException;
import java.net.URL;

/**
 * JsBridge. invoke js function.and dispatch callback
 * Created by xesamguo@gmail.com on 16-4-7.
 */
public final class JsBridge {

    public static boolean DEBUG = false;

    private WebView mWebView;


package dev.xesam.android.web.jsbridge;

import android.util.Log;
import android.webkit.JavascriptInterface;

import java.util.HashMap;
import java.util.Map;


修改以后:这里写关键部分

package dev.xesam.android.web.jsbridge;

import android.annotation.SuppressLint;
import android.webkit.WebView;

import java.net.MalformedURLException;
import java.net.URL;

/**
 * JsBridge. invoke js function.and dispatch callback
 * Created by xesamguo@gmail.com on 16-4-7.
 */
public final class JsBridge {

    public static boolean DEBUG = false;

    private org.xwalk.core.XWalkView mWebView;


package dev.xesam.android.web.jsbridge;

import android.util.Log;
import org.xwalk.core.JavascriptInterface;

import java.util.HashMap;
import java.util.Map;

/**
 * handle [js -> java] transaction
 * Created by xesamguo@gmail.com on 16-4-7.
 */
class ServerProxy {
    public static final String JAVA_BRIDGE = "JavaExecutor";

    private JsBridge mJsBridge;
    private Map<String, ServerHandler> handlers = new HashMap<>();

    public ServerProxy(JsBridge mJsBridge) {
        this.mJsBridge = mJsBridge;
    }

    public void destroy() {
        handlers.clear();
    }

    /**
     * [js -> java]
     */
    @JavascriptInterface




其他

在使用上还是要注意,所有操作必须要在xwalk 准备好以后才可以用:

public class MainActivity extends XWalkActivity implements MKOfflineMapListener {


    //浏览器
    org.xwalk.core.XWalkView vWebView;

    

    @Override
    /**
     * 所有的操作必须等到Walk准备好才可以
     */
    protected void onXWalkReady() {
        //设置是否支持调试,大家估计不会忘记Chrome调试吧
        XWalkPreferences.setValue(XWalkPreferences.REMOTE_DEBUGGING, true);


        //JS库挂钩
        jsBridge = new JsBridge(vWebView);
        JsBridge.DEBUG = true;

        vWebView.setUIClient(new XWalkUIClient(vWebView) {

            @Override
            public void onPageLoadStarted(XWalkView view, String url) {

                super.onPageLoadStarted(view, url);
            }

            @Override
            public boolean onJsAlert(XWalkView view, String url, String message, XWalkJavascriptResult result) {

                return super.onJsAlert(view, url, message, result);
            }

            @Override
            public void onScaleChanged(XWalkView view, float oldScale, float newScale) {
                if (view != null) {
                    view.invalidate();
                }
                super.onScaleChanged(view, oldScale, newScale);
            }

            @Override
            public void onPageLoadStopped(XWalkView view, String url, LoadStatus status) {
                super.onPageLoadStopped(view, url, status);
                //JS库挂钩监听
                jsBridge.monitor(url);
            }

            @Override
            public boolean onConsoleMessage(XWalkView view, String message, int lineNumber, String sourceId, ConsoleMessageType messageType) {
                Log.i("webView", message);
                Log.i("webView", String.valueOf(lineNumber));
                return super.onConsoleMessage(view, message, lineNumber, sourceId, messageType);
            }
        });

        //如果是原始JsBridge 需要修改 @JavaScriptInterface 所在的包是 import org.xwalk.core.JavascriptInterface;
        //JS库将监听挂钩
        jsBridge.register(new SqlHandle(this, luozhuangModule));//这里是你自己JS处理Class
        vWebView.load("file:///android_asset/index.html", null);

        //加载完毕
       //..........
    }


其他问题:

1、怎么使用Chrome真机调试Html 页面

需要设置Android Debug=true,而且上面代码要用 

XWalkPreferences.setValue(XWalkPreferences.REMOTE_DEBUGGING, true);

至于原生webView怎么开,自己度娘吧。

使用Chrome真机调试Html 时候必须爬墙,因为调试那个页面工具在海外某网站,你懂得


2、错误
I/webView: Uncaught TypeError: JavaExecutor.onTransact is not a function

这个应该是WEBVIEW还没有初始化完毕(特别是用CrossWalk必须初始化),或者把JavascriptInterface混淆了,需要注意。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值