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&lt/Text>
                &lt/TouchableOpacity>
            &lt/View>
        );
    }
}

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

四、jQuery Mobile实现

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


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

            &ltdiv data-role="content"&gt
                &lt!-- Content goes here --&gt
            &lt/div&gt

            &ltdiv data-role="footer"&gt
                &ltH1&gtFooter&lt/H1&gt
            &lt/div&gt

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

上述代码中,在点击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交互,并在实际开发中灵活运用。

原创文章,作者:VPSI,如若转载,请注明出处:https://www.506064.com/n/147774.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
VPSIVPSI
上一篇 2024-11-02 13:12
下一篇 2024-11-02 13:12

相关推荐

  • JS Proxy(array)用法介绍

    JS Proxy(array)可以说是ES6中非常重要的一个特性,它可以代理一个数组,监听数据变化并进行拦截、处理。在实际开发中,使用Proxy(array)可以方便地实现数据的监…

    编程 2025-04-29
  • 解析js base64并转成unit

    本文将从多个方面详细介绍js中如何解析base64编码并转成unit格式。 一、base64编码解析 在JavaScript中解析base64编码可以使用atob()函数,它会将b…

    编程 2025-04-29
  • Node.js使用Body-Parser处理HTTP POST请求时,特殊字符无法返回的解决方法

    本文将解决Node.js使用Body-Parser处理HTTP POST请求时,特殊字符无法返回的问题。同时,给出一些相关示例代码,以帮助读者更好的理解并处理这个问题。 一、问题解…

    编程 2025-04-29
  • t3.js:一个全能的JavaScript动态文本替换工具

    t3.js是一个非常流行的JavaScript动态文本替换工具,它是一个轻量级库,能够很容易地实现文本内容的递增、递减、替换、切换以及其他各种操作。在本文中,我们将从多个方面探讨t…

    编程 2025-04-28
  • Android ViewPager和ScrollView滑动冲突问题

    Android开发中,ViewPager和ScrollView是两个常用的控件。但是当它们同时使用时,可能会发生滑动冲突的问题。本文将从多个方面介绍解决Android ViewPa…

    编程 2025-04-28
  • Android如何点击其他区域收起软键盘

    在Android应用中,当输入框获取焦点弹出软键盘后,我们希望能够点击其他区域使软键盘消失,以提升用户体验。本篇文章将说明如何实现这一功能。 一、获取焦点并显示软键盘 在Andro…

    编程 2025-04-28
  • JS图片沿着SVG路径移动实现方法

    本文将为大家详细介绍如何使用JS实现图片沿着SVG路径移动的效果,包括路径制作、路径效果、以及实现代码等内容。 一、路径制作 路径的制作,我们需要使用到SVG,SVG是可缩放矢量图…

    编程 2025-04-27
  • 如何使用JS调用Python脚本

    本文将详细介绍通过JS调用Python脚本的方法,包括使用Node.js、Python shell、child_process等三种方法,以及在Web应用中的应用。 一、使用Nod…

    编程 2025-04-27
  • Android Studio HUD 实现指南

    本文将会以实例来详细阐述如何在 Android Studio 中使用 HUD 功能实现菊花等待指示器的效果。 一、引入依赖库 首先,我们需要在 build.gradle 文件中引入…

    编程 2025-04-27
  • 如何反混淆美团slider.js

    本文将从多个方面详细阐述如何反混淆美团slider.js。在开始之前,需要明确的是,混淆是一种保护JavaScript代码的方法,其目的是使代码难以理解和修改。因此,在进行反混淆操…

    编程 2025-04-27

发表回复

登录后才能评论