uniapp 混合开发 js调用java代码和java调用js
标签: uniapp 混合开发 js调用java代码和java调用js JavaScript博客 51CTO博客
2023-05-21 18:24:02 246浏览
uniapp 混合开发 js调用java代码和java调用js,参考:uniapp原生插件开发之调用原生方法(android)uniapp结构plugin.js!function(root,factory){if
参考:uniapp原生插件开发之调用原生方法(android)
源码下载地址:源码
uniapp结构

plugin.js
! function(root, factory) {
if (typeof exports == 'object' && typeof module != 'undefined') {
module.exports = factory()
} else if (typeof define == 'function' && define.amd) {
define(factory)
} else {
document.addEventListener('plusready', function() {
var moduleName = 'AndroidBridge';
root.plus[moduleName] = factory()
}, false);
}
}(this, function() {
var _BARCODE = 'AndroidBridge';
var plugintest = {
CallAppFunc: function(num, successCallback, errorCallback) {
var success = typeof successCallback !== 'function' ? null : function(args) {
successCallback(args);
},
fail = typeof errorCallback !== 'function' ? null : function(code) {
errorCallback(code);
};
var callbackID = plus.bridge.callbackId(success, fail);
return plus.bridge.exec(_BARCODE, "callAppFunc", [callbackID, num]);
}
};
return plugintest;
});
index.vue
<template>
<view class="content">
<image class="logo" src="/static/logo.png" ></image>
<view class="text-area">
<text class="title">{{title}}</text>
</view>
<button @click="click">调用原生代码</button>
</view>
</template>
<script>
// 导入自己定义的插件js
var AndroidBridge = require('../../common/plugin.js');
export default {
data() {
return {
title: 'Hello',
}
},
onLoad() {
},
methods: {
click(){
AndroidBridge.CallAppFunc(
"这段文字是uniapp传过来的",
function(result) {
uni.showToast({title:JSON.stringify(result),icon:'none',duration:5000});
},
function(result) {
uni.showToast({title:result,icon:"none",duration:5000});
}
);
}
}
}
</script>
<style>
.content {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.logo {
height: 200upx;
width: 200upx;
margin-top: 200upx;
margin-left: auto;
margin-right: auto;
margin-bottom: 50upx;
}
.text-area {
display: flex;
justify-content: center;
}
.title {
font-size: 36upx;
color: #8f8f94;
}
</style>
Andropid

AndroidBridge.java
package io.dcloud.simple.test;
import android.app.Activity;
import android.content.Intent;
import org.json.JSONArray;
import io.dcloud.common.DHInterface.IWebview;
import io.dcloud.common.DHInterface.StandardFeature;
import io.dcloud.common.util.JSUtil;
import io.dcloud.simple.test.activity.TestActivity;
public class AndroidBridge extends StandardFeature {
/**
* @param pWebview
* @param array
*/
public void callAppFunc(IWebview pWebview, JSONArray array) {
// 获取回调ID
String CallBackID = array.optString(0);
// 获取参数并计算(这里模拟原生处理)
String newstring = "你好,这个字符串来自android原生代码,您传过来的参数是:" + array.optString(1);
// 构建回传参数
JSONArray newArray = new JSONArray();
newArray.put(newstring);
// JSUtil.execCallback(IWebview pWebViewImpl,String pCallbackId,String pMessage,int pStatus,boolean pKeepCallback)
// 参数:
// pWebViewImpl - webview对象
// pCallbackId - 回调方法ID
// pMessage - 回调信息
// pStatus - 回调code值 如:OK、ERROR
// pKeepCallback - js层回调function是否要保存
Activity activity = pWebview.getActivity();
activity.startActivity(new Intent(activity, TestActivity.class));
MSTest.showToast(activity);
// 第一个参数是当前函数的入参,直接传入, 第二个是根据入参获取的回调id,第三个是回调的数据,是一个json数组
JSUtil.execCallback(pWebview, CallBackID, newstring, JSUtil.OK, false);//最后一个参数为ture的时候可以长期保持function,也就可以实现Java调用js
/**
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
JSUtil.execCallback(pWebview, CallBackID, System.currentTimeMillis(), JSUtil.OK, true);//true 就可以实现java长期调用js
System.out.println("===========handler=======");
handler.postDelayed(this, 5000);
}
}, 5000);
*/
}
}
需要添加

<feature name="AndroidBridge" value="io.dcloud.simple.test.AndroidBridge"/>
如何使用?
uniapp端
import AndroidBridge from '../../utils/plugin.js'
autoTestClick() {
AndroidBridge.CallAppFunc(JSON.stringify({
"action": 3
}), result => {
const dataJson = JSON.parse(result.replace(/\\/g, "")).data;
uni.navigateTo({
url: '../add-land/add-land?land=' + JSON.stringify(dataJson)
})
});
},
Android端
AndroidBridge.java
package com.mingshine.farmerhelp.utils;
import android.app.Activity;
import android.os.Handler;
import com.mingshine.farmerhelp.handle.AndroidBridgeHandle;
import org.json.JSONArray;
import io.dcloud.common.DHInterface.IWebview;
import io.dcloud.common.DHInterface.StandardFeature;
import io.dcloud.common.util.JSUtil;
public class AndroidBridge extends StandardFeature {
private static AndroidBridge mAndroidBridge;
public static AndroidBridge getInstance() {
return mAndroidBridge;
}
private IWebview mIWebview;
private String mCallBackID;
public void sendAction(String action) {
if (mIWebview != null && mCallBackID != null) {
JSUtil.execCallback(mIWebview, mCallBackID, action, JSUtil.OK, false);
MSLogUtil.e("======sendAction===========");
}
}
/**
* @param pWebview
* @param array
*/
public void callAppFunc(final IWebview pWebview, final JSONArray array) {
MSLogUtil.e("======callAppFunc===========");
final String CallBackID = array.optString(0);
mAndroidBridge = this;
mIWebview = pWebview;
mCallBackID = CallBackID;
Activity activity = pWebview.getActivity();
AndroidBridgeHandle.handle(activity, array.optString(1));
}
}
AndroidBridgeHandle.java
package com.mingshine.farmerhelp.handle;
import android.app.Activity;
import android.content.Intent;
import com.alibaba.fastjson.JSONObject;
import com.mingshine.farmerhelp.activity.MapActivity;
import com.mingshine.farmerhelp.utils.AndroidBridge;
import com.mingshine.farmerhelp.utils.Constant;
import com.mingshine.farmerhelp.utils.MSLogUtil;
public class AndroidBridgeHandle {
public static void handle(Activity activity, String cmdData) {
JSONObject cmdDataJson = JSONObject.parseObject(cmdData);
if (cmdDataJson.getIntValue(Constant.ACTION) == Constant.ACTION_0) {
Intent intent = new Intent(activity, MapActivity.class);
intent.putExtra(Constant.ACTION, cmdDataJson.getIntValue(Constant.ACTION));
activity.startActivity(intent);
} else if (cmdDataJson.getIntValue(Constant.ACTION) == Constant.ACTION_2) {
Intent intent = new Intent(activity, MapActivity.class);
intent.putExtra(Constant.ACTION, cmdDataJson.getIntValue(Constant.ACTION));
intent.putExtra(Constant.DATA, cmdDataJson.getString(Constant.DATA));
MSLogUtil.e(cmdDataJson.getString(Constant.DATA));
activity.startActivity(intent);
AndroidBridge.getInstance().sendAction(cmdDataJson.toJSONString());
}else if (cmdDataJson.getIntValue(Constant.ACTION) == Constant.ACTION_3) {
Intent intent = new Intent(activity, MapActivity.class);
intent.putExtra(Constant.ACTION, cmdDataJson.getIntValue(Constant.ACTION));
activity.startActivity(intent);
}
}
}
备注:有一个简单的方法,JS调用Android代码,但是Android调用不了JS
var TestUtils = plus.android.importClass("com.mingshine.jpushh5.TestUtils");
TestUtils.fun();
package com.mingshine.jpushh5;
import android.app.Activity;
import android.content.Intent;
public class TestUtils {
public static void fun() {
System.out.println("=========TestUtils================");
Activity activity = MyActivityManager.getInstance().getCurrentActivity();
activity.startActivity(new Intent(activity, MainActivity.class));
}
public static void fun1() {
System.out.println("=========fun1================");
}
}
好博客就要一起分享哦!分享海报
此处可发布评论
评论(0)展开评论
暂无评论,快来写一下吧
展开评论






