您的位置:

Android JS交互详解

现在的APP开发越来越注重交互性,前端技术也在不断发展,所以如何在Android中实现JS交互成为了一个急需解决的问题。本篇文章就从多个方面详细阐述Android JS交互,并给出具体的代码实现。

一、WebView实现

WebView是Android中内置的一个浏览器组件,在页面加载时会自动执行页面内的JavaScript。通过WebView可以实现Android与JS的交互。下面给出一个简单的示例,演示如何通过WebView调起Android原生的Toast组件。


WebView webView = findViewById(R.id.web_view);
webView.getSettings().setJavaScriptEnabled(true);
webView.addJavascriptInterface(new Object() {
    @JavascriptInterface
    public void showToast(String message) {
        Toast.makeText(MainActivity.this, message, Toast.LENGTH_SHORT).show();
    }
}, "app");
webView.loadUrl("file:///android_asset/index.html");

上述代码中,首先通过findViewById获取到WebView组件并使其支持JavaScript。然后通过addJavascriptInterface方法向JS注入一个名为“app”的接口,该接口有一个名为showToast的方法,用于在Android中调起Toast。最后通过loadUrl方法加载HTML文件。下面给出JS代码片段。



上述代码中,通过一个按钮触发调用showToast方法,传递一个字符串参数“Hello World”,调起Android原生的Toast。通过上述代码,我们可以看到Android与JS的交互非常方便,只需要通过addJavascriptInterface方法注入一个接口即可。

二、JSBridge实现

WebView虽然可以实现Android与JS的交互,但其存在一些安全性问题,因为addJavascriptInterface方法有一个漏洞,即允许你暴露Java对象给JS调用,在一定程度上增加了攻击者的威胁。为了解决这个问题,JSBridge应运而生,JSBridge基于WebView的特点实现了安全性更高的交互方式。

下面给出JSBridge库中的具体代码实现。


implementation 'com.github.lzyzsd:jsbridge:1.0.4'

WebView webView = findViewById(R.id.web_view);
webView.getSettings().setJavaScriptEnabled(true);
webView.addJavascriptInterface(new Object() {
    @JavascriptInterface
    public void showToast(String message) {
        Toast.makeText(MainActivity.this, message, Toast.LENGTH_SHORT).show();
    }
}, "app");
webView.loadUrl("file:///android_asset/index.html");
BridgeWebView bridgeWebView = new BridgeWebView(this);
bridgeWebView.loadUrl("file:///android_asset/jsbridge.html");

上述代码中,首先通过implementation引入JSBridge库,并使WebView组件支持JavaScript,并注入一个名为“app”的接口,其中包含一个名为showToast的方法。然后通过BridgeWebView组件加载HTML文件。下面给出JS代码片段。



上述代码中,调用showToast方法时通过javascript:android前缀的方式,直接调用到了注入的接口方法,跨平台交互更加高效、安全。

三、React Native实现

React Native是Facebook推出的一种跨平台移动应用开发框架,能够通过JavaScript语言来构建原生移动应用。React Native基于执行JavaScript代码的方式来跨平台成为了一个实现跨平台开发的利器,因此在Android与JS交互中也能够发挥巨大的作用。

下面给出React Native中实现JS交互的代码示例。

1、Java代码


public class MainActivity extends ReactActivity {

    @Override
    protected String getMainComponentName() {
        return "example";
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ReactRootView rootView = new ReactRootView(this);
        setContentView(rootView);
        ReactInstanceManager mReactInstanceManager = ReactInstanceManager.builder()
                .setApplication(getApplication())
                .setBundleAssetName("index.android.bundle")
                .setJSMainModulePath("index")
                .addPackage(new MainReactPackage())
                .setUseDeveloperSupport(BuildConfig.DEBUG)
                .setInitialLifecycleState(LifecycleState.RESUMED)
                .build();
        rootView.startReactApplication(mReactInstanceManager, "example", null);
    }

    @ReactMethod
    public void showToast(String message) {
        Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
    }
}

上述代码中,首先继承ReactActivity,并复写getMainComponentName方法。然后在onCreate方法中创建ReactRootView组件,并通过ReactInstanceManager实现React Native环境的初始化,最后调用startReactApplication方法加载React Native组件,并注入一个名为“example”的接口,其中包含一个名为showToast的方法。

2、JS代码


import React, {Component} from 'react';
import {Platform, StyleSheet, Text, View, TouchableOpacity} from 'react-native';
import {NativeModules} from 'react-native';

export default class App extends Component
    {
    render() {
        return (
            &ltView style={styles.container}>
                &ltTouchableOpacity onPress={() => NativeModules.MainActivity.showToast('Hello World')} style={styles.btn}>
                    &ltText style={{color: '#ffffff'}}>调用Toast</Text>
                </TouchableOpacity>
            </View>
        );
    }
}

   

上述代码中,在引入NativeModules模块后,直接调用MainActivity中注入的showToast方法即可实现Android与JS的交互。

四、jQuery Mobile实现

jQuery Mobile是一个开源的,跨平台的,针对移动设备的JavaScript框架,它整合了HTML5、CSS3以及jQuery核心库的功能,能够实现跨平台开发和UI实现。下面给出jQuery Mobile的代码实现方式,这里以调用Android的Toast组件为例。


<!DOCTYPE html>
&lthtml>
    &lthead>
        &lttitle&gtjQuery Mobile Example</title>
        &ltmeta name="viewport" content="width=device-width, initial-scale=1" />
        &ltlink rel="stylesheet" href="./jquery.mobile-1.4.5.min.css" />
        &ltscript src="./jquery-1.11.1.min.js"></script>
        &ltscript src="./jquery.mobile-1.4.5.min.js"></script>
    </head>
    &ltbody>
        &ltdiv data-role="page" id="page">
            &ltdiv data-role="header">
                &lta href="#" id="show-button" class="ui-btn-right"&gtShow</a>
                &ltimg src="./android.png" style="max-width: 100%;" />
                &ltH1&gtAndroid &ltspan id="title-text"></span></H1>
            </div>

            &ltdiv data-role="content">
                <!-- Content goes here -->
            </div>

            &ltdiv data-role="footer">
                &ltH1&gtFooter</H1>
            </div>

            &ltscript>
                $("#show-button").click(function() {
                    var message = "Hello World";
                    window.location.href = "app://showToast?message=" + message;
                });
            </script>
        </div>
    </body>
</html>

上述代码中,在点击Show按钮后,调用了一个名为app://showToast的URI。下面给出Android原生代码的实现方式。


webView.setWebViewClient(new WebViewClient() {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (url.startsWith("app://showToast")) {
            String message = Uri.decode(url.substring(18));
            showToast(message);
            return true;
        }
        return super.shouldOverrideUrlLoading(view, url);
    }
});

@JavascriptInterface
public void showToast(String message) {
    Toast.makeText(MainActivity.this, message, Toast.LENGTH_SHORT).show();
}

上述代码中,通过WebViewClient的重写,实现拦截app://showToast的URI,并通过showToast方法实现调起Android原生的Toast组件。

五、总结

本篇文章从WebView、JSBridge、React Native和jQuery Mobile四个方面详细阐述了Android JS交互的实现方式,并给出了具体的代码实现,希望读者可以通过本文更加深入的了解Android与JS交互,并在实际开发中灵活运用。

Android JS交互详解

2023-05-21
iphonejs和ios交互,ios与js交互

本文目录一览: 1、iOS - OC 与 JS 交互六种方式总结 2、js怎么跟Android和ios进行交互呢? 3、iOS 原生与JS交互 (webkit + js) 4、原生APP中js怎样与A

2023-12-08
iosjs交互问题(ios与js交互原理)

本文目录一览: 1、iOS Swift5.0 WKWebView使用JS与Swift交互 2、iOS - OC 与 JS 交互六种方式总结 3、iOS中WkWebView与js交互 4、JS和IOS进

2023-12-08
ios原声js交互(ios原生与js交互的原理是什么)

本文目录一览: 1、iOS - OC 与 JS 交互六种方式总结 2、JS和IOS进行交互 3、iOS WKWebView JS 与 原生交互小结 4、iOS中WkWebView与js交互 5、原生A

2023-12-08
ios与js交互方式,ios交互设计

本文目录一览: 1、JS怎么样调用IOS并且传递参数? 2、js怎么跟Android和ios进行交互 3、iOS - OC 与 JS 交互六种方式总结 4、原生APP中js怎样与Android和ios

2023-12-08
js和webview,Js和webview交互

2022-11-23
重学java笔记,java笔记总结

2022-11-23
android的js框架(android js引擎)

本文目录一览: 1、Android真的推荐用MVI模式?MVI和MVVM有什么区别? 2、在Android上怎样实现JAVA和JS交互 3、android 混合开发 用什么框架好 4、Android如

2023-12-08
webview交互js,webview html5

本文目录一览: 1、iOS下webView和JS交互 2、iOS中WkWebView与js交互 3、android中webview与js交互 iOS下webView和JS交互 下面说一下使用方法 申明

2023-12-08
印象笔记记录java学习(Java成长笔记)

2022-11-12
js高级程序设计笔记14(js高级程序设计笔记14页)

本文目录一览: 1、JavaScript高级程序设计 该怎么看 2、JavaScript学习笔记之数组基本操作示例 3、JS中有关sort以及return的问题 JavaScript高级程序设计 该怎

2023-12-08
ios中仿支付宝js与oc交互,ios和js交互

本文目录一览: 1、iOS开发(OC)——支付宝支付 2、OC与JS交互-WKWebView篇 3、OC仿支付宝返回到后台添加模糊效果 4、JS与OC交互、js事件注入、修改js方法实现 5、iOS

2023-12-08
java客户端学习笔记(java开发笔记)

2022-11-14
java方法整理笔记(java总结)

2022-11-08
java学习笔记(java初学笔记)

2022-11-14
cefgluejs交互,cef js交互

本文目录一览: 1、c#的exe 程序调用 Xilium.CefGlue能出网页内容 ,但是把exe程序换成类库后,在 2、Xilium.CefGlue怎么使用Js调用C#方法 3、如何让webbro

2023-12-08
javascript简要笔记,JavaScript读书笔记

2022-11-17
阿里云笔记的功能与使用详解

2023-05-21
java包笔记,Java语言包

2022-11-18
htmljs编程笔记(html代码笔记)

本文目录一览: 1、html代码和JS代码有什么区别 2、如何在html中调用js函数 3、JavaScript学习笔记之数组基本操作示例 4、HTML5初学者笔记 5、《web前端笔记7》js字符—

2023-12-08