android软件开发之webView.addJavascriptInterface循环渐进【二】

本文介绍如何在Android应用中实现WebView与本地代码的交互。通过创建简单的示例项目,演示了如何配置WebView,添加JavaScript接口,并处理来自HTML页面的回调。同时展示了如何从Android端调用HTML中的JavaScript函数。
部署运行你感兴趣的模型镜像

新建工程

为了让大家更容易的理解,所以我这里就尽量的将代码缩短,这是我的工程的配置

创建好工程之后,然后将界面调整为下面这样

添加代码

首先将两个button和webview添加进来,并给web添加两个JavaScript调用接口testFunc1testFunc2

private Button  m_testButtom1;
private Button  m_testButtom2;
private WebView m_WebView;

@SuppressLint("SetJavaScriptEnabled")
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    m_testButtom1 = (Button)findViewById(R.id.button1);
    m_testButtom2 = (Button)findViewById(R.id.button2);
    m_WebView = (WebView)findViewById(R.id.webView1);

    m_WebView.getSettings().setJavaScriptEnabled(true);
    m_WebView.addJavascriptInterface(new Object(){
        @SuppressWarnings("unused")  // 这两个函数可以在JavaScript中调用
        public void testFunc1(String string) {messageHandler.obtainMessage(MessageHandler.WM_SET_FUNC1, string).sendToTarget(); }

        @SuppressWarnings("unused")
        public void testFunc2(String string) { messageHandler.obtainMessage(MessageHandler.WM_SET_FUNC2, string).sendToTarget();}
    }, "demo");

    m_WebView.loadUrl("file: ///android_asset/demo.html"); 
}

可以看到里面用到了一个 messageHandler,我们看一下他具体的定义,这个类主要就是用来JavaScript交互的,JavaScript会使用这个消息来和我们的UI进行交互,同样 上一篇也有说过
Looper looper = Looper.myLooper(); //得到当前线程的Looper实例,由于当前线程是UI线程也可以通过Looper.getMainLooper()得到
private Handler messageHandler = new MessageHandler(looper);//此处甚至可以不需要设置Looper,因为 Handler默认就使用当前线程的Looper

public class MessageHandler extends Handler {
    public static final int WM_SET_FUNC1 = 0;
    public static final int WM_SET_FUNC2 = 1;
    public MessageHandler(Looper looper) { super(looper); }
    @Override
    public void handleMessage(Message msg) {
        switch (msg.what) {
        case WM_SET_FUNC1:
            Toast.makeText(getApplicationContext(), msg.obj.toString(), Toast.LENGTH_LONG).show();
            break;
        case WM_SET_FUNC2:
            Toast.makeText(getApplicationContext(), msg.obj.toString(), Toast.LENGTH_LONG).show();
            break;
        default:
            break;
        }
    }
}

添加完成之后,在来添加按钮点击事件
m_testButtom1.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View arg0) {
        String string = "http://www.sollyu.com";
        m_WebView.loadUrl("javascript:testFunc1('"+string+"');");   // 调用html中的JavaScript函数testFunc1,这里只有一个参数
    }
});
m_testButtom2.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View arg0) {
        String string = "这里有两个参数:";
        int nInt = 191067617;
        m_WebView.loadUrl("javascript:testFunc2('"+string+"',"+String.valueOf(nInt)+")"); // 通用这里有2个参数
    }
});

这样在 Android的代码就算写完了,下面在来看一下 demo.html

Html文件

demo.html源代码为:

<html>
    <script language="javascript">
        function testFunc1(var1)
        {
            return_var = "原创文章:" + var1;
            window.demo.testFunc1(return_var);      // 调用Android代码中的 testFunc1 的函数
            return return_var;
        }
        function testFunc2(var1,var2)
        {
            return_var = var1 + var2;
            window.demo.testFunc2(return_var);      // 这里的参数就为返回到android的值
            return return_var;
        }
    </script> 
</html>

运行截图



转载自:android软件开发之webView.addJavascriptInterface循环渐进【二】

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

### 使用 `addJavascriptInterface` 实现 Java 和 JavaScript 交互 为了使 Java 和 JavaScript 能够互相调用,在 Android 开发中可以通过 `WebView` 提供的 `addJavascriptInterface` 方法创建桥梁。具体来说,此方法允许开发者将一个 Java 对象注册给 WebView,从而让 JavaScript 可以访问该对象并调用其公开的方法。 #### 创建自定义接口类 首先需要构建一个新的 Java 类作为 JS 接口: ```java public class WebAppInterface { Context mContext; /** Instantiate the interface and set the context */ WebAppInterface(Context c) { mContext = c; } /** Show a toast from the web page */ @JavascriptInterface public void showToast(String toast) { Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show(); } } ``` 上述代码展示了如何定义一个简单的接口类 `WebAppInterface`[^3]。注意这里的 `@JavascriptInterface` 注解非常重要;它表明这个方法是可以被 JavaScript 访问的。如果缺少这个注解,则即使其他配置都正确也无法成功调用。 #### 将接口添加至 WebView 接着要做的就是把刚刚创建好的接口实例绑定到具体的 WebView 上面去: ```java webView.getSettings().setJavaScriptEnabled(true); webView.addJavascriptInterface(new WebAppInterface(this), "Android"); String url = "file:///android_asset/demo.html"; webView.loadUrl(url); ``` 这段代码片段说明了怎样启用 JavaScript 支持以及通过 `addJavascriptInterface()` 函数关联之前定义的对象与名称 `"Android"` 到一起[^2]。这意味着在 HTML 页面里就可以像下面这样简单地触发原生应用的功能了: ```html <input type="button" value="Say hello" onClick="showAndroidToast('Hello Android!')" /> <script type="text/javascript"> function showAndroidToast(toast) { Android.showToast(toast); } </script> ``` 当点击按钮时会执行内联事件处理器中的函数 `showAndroidToast()`, 它内部又调用了名为 `Android` 的全局变量上的 `showToast()` 方法——这正是前面提到过的那个映射关系所起的作用。 需要注意的是,出于安全考虑,从 API level 17 (Jelly Bean MR1) 开始,默认情况下不允许主线程网络请求和其他一些潜在危险操作。因此建议尽可能避免在主 UI 线程上做耗时任务,并确保遵循最佳实践来处理可能的安全风险[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值