uniapp 和原生插件交互

参考 uniapp 官网配置好android 原生工程,在 HBuildX 中奖 uniapp 项目生产本地打包资源,将打包好的资源文件放在原生工程的 src->assets->apps 目录下。

新建一个类Testmodule 基层自 UniModule 类,建议使用的官网离线包,此类已经存在,此类相当于是 uniapp 和原生插件的桥梁。所有需要交互的人口,交互都可以写在这里。

uniapp 调用原生插件方法

java 复制代码
public class TestModule extends UniModule {

    /**
     * 打开视频带看相机
     */
    @UniJSMethod(uiThread = true)
    public void gotoVideoCamera() {
        if (mUniSDKInstance != null && mUniSDKInstance.getContext() instanceof Activity) {
            Intent intent = new Intent(mUniSDKInstance.getContext(), TakeVideoActivity.class);
            mUniSDKInstance.getContext().startActivity(intent);
        }
    }
}

@UniJSMethod 标识的方法表示支持 uniapp 调用,括号中的 uiThread 参数用来表示这个方法是运行在UI线程还是子线程中,一般有 UI 交互的运行在 UI 线程中,比如页面跳转, 存在耗时操作的,比如接口调用或者耗时操作可以标识为线程中。mUniSDKInstance是 UnModule 中的属性,可以用来获取上下文,上下文在 app 开发中还是比较重要的。

uniapp 调用原生方法回调返回值

使用UniJSCallback回调函数来将参数回调给 uniapp,UniJSCallback有两个方法,分别是invoke和invokeAndKeepAlive,

  • invoke调用javascript回调方法,此方法将在调用后被销毁。
  • invokeAndKeepAlive 调用javascript回调方法并保持回调活动以备以后使用。
java 复制代码
   /**
     * 跳转到选择带看视频页面
     */
    @UniJSMethod(uiThread = true)
    public void gotoSelectVideo(String cookie, UniJSCallback callback) {
        if (mUniSDKInstance != null && mUniSDKInstance.getContext() instanceof Activity) {
            videoCallback = callback;
            SPUtils.getInstance().put("Cookie", cookie);
            Intent intent = new Intent(mUniSDKInstance.getContext(), VideosActivity.class);
            intent.putExtra("isSelect", true);
            ((Activity) mUniSDKInstance.getContext()).startActivityForResult(intent, REQUEST_VIDEO);
        }
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == REQUEST_VIDEO) {
            //视频带看相册回调数据,返回包含视频id和视频链接的数据实体
            String videoJson = data.getStringExtra("videoBean");
            if (videoCallback != null) {
                videoCallback.invoke(videoJson);
            }
        } 
    }

如果需要从 uniapp 跳转到原生插件的某个页面,并且返回 uniapp 的时候带上参数传递给 uniapp,可以和和 android 中页面传递参数一样,使用startActivityForResult,并在 onActivityResult 中接收要传递的参数,调用UniJSCallback回调函数将数据传递给 uniapp。

还有一种情况就是,如果从 uniapp 跳转到原生插件某个页面后,点击原生页面的某个按钮就需要将数据传递给 uniapp 中,这个时候,可以在原生类中定义一个静态方法,当点击原生按钮时,调用这个静态方法,在该方法中,回调参数给 uniapp 。

java 复制代码
  /**
     * 原生调用此方法跳转到uniApp详情页面
     *
     * @param propertyCode 房源id
     */
    public static void jumpToHouseDetails(String propertyCode) {
        if (mapFindHouseBack != null) {
            mapFindHouseBack.invokeAndKeepAlive(propertyCode);
            ActivityUtils.getTopActivity().moveTaskToBack(true);
        }
    }

由于需求是点击原生页面按钮后,启动 uniapp 的某个页面,但是不关闭原生页面,当从 uniapp 返回时,再次回到原生的这个页面中,所以这里调用moveTaskToBack方法可以将 acitivty task 移动到后台,启动 uniapp 的页面,当从 uniapp 返回时,再启动原生页面,就可以把此页面移动到前台对用户可见。

js 复制代码
/**
	 * 返回到地图找房页面,
	 */
	backMapFindHouse() {
		switch (uni.getSystemInfoSync().platform) {
			case "android":
				const lib = uni.requireNativePlugin("TestModule")
				//返回到地图找房页面,调用原生backMapFindHouse方法
				lib.backMapFindHouse()
				break;
		}
	}
java 复制代码
   /**
     *  uniapp房源详情页返回原生地图找房页面
     */
    @UniJSMethod(uiThread = true)
    public void backMapFindHouse() {
        if (mUniSDKInstance != null && mUniSDKInstance.getContext() instanceof Activity) {
            startMapFindHouseActivity();
        }
    }

以上就是简单记录下 uniapp 和原生插件交互的参数传递和参数回调方法。主要是通过UniJSCallback回调函数来实现参数的回调。uniapp 传递参数直接在原生方法中定义即可。

相关推荐
zandy10111 小时前
体验家 XMPlus 问卷答题体验优化与完成率提升引擎:从交互设计到行为心理学的工程化实践
windows·microsoft·交互
三声三视15 小时前
uni-app 鸿蒙端传参变成 [object Object]?顺着源码追到 ArkTS router 底层才搞明白
人工智能·ai·uni-app·aigc·ai编程·harmonyos
小徐_23331 天前
Open Wot 1.0.5 发布:让 AI 接入 wot-ui,只需要两条命令
前端·uni-app·ai编程
AI多Agent协作实战派1 天前
AI多Agent协作系统实战(二十二):从6列到12列——任务监控报告的进化之路
java·人工智能·uni-app·bug
小杨小杨、努力变强!1 天前
VS Code运行HBuilder X中的uni-app项目
vscode·uni-app·uni-app run
码兄科技2 天前
实战:基于Spring Boot + UniApp的地理信息小程序开发
spring boot·后端·uni-app
qizayaoshuap2 天前
# [特殊字符] 手电筒 — 鸿蒙ArkTS设备功能调用与UI交互设计
ui·华为·交互·harmonyos
2501_916007472 天前
iOS和macOS应用程序性能分析和优化工具使用综合指南
android·macos·ios·小程序·uni-app·iphone·webview
lialaka2 天前
「解忧暗室(SereneNook)」——全语音_3D_AI_具身交互智能数字人深夜陪伴与情绪自愈舱[1]
人工智能·3d·交互
熊猫钓鱼>_>2 天前
ArkUI 动画实战:从理论到交互,构建流畅的鸿蒙动效体验
华为·架构·交互·harmonyos·arkts·arkui·native