uniapp 混合开发 js调用java代码和java调用js

奋斗吧
奋斗吧
擅长邻域:未填写

标签: uniapp 混合开发 js调用java代码和java调用js JavaScript博客 51CTO博客

2023-05-21 18:24:02 245浏览

uniapp 混合开发 js调用java代码和java调用js,参考:uniapp原生插件开发之调用原生方法(android)uniapp结构plugin.js!function(root,factory){if


参考:uniapp原生插件开发之调用原生方法(android)

源码下载地址:源码

uniapp结构

uniapp 混合开发 js调用java代码和java调用js_JSON

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

uniapp 混合开发 js调用java代码和java调用js_JSON_02

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);
        */
    }


}

需要添加

uniapp 混合开发 js调用java代码和java调用js_JSON_03

<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展开评论

暂无评论,快来写一下吧

展开评论

您可能感兴趣的博客

客服QQ 1913284695