首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

uniapp 和原生插件交互

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

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

uniapp 调用原生插件方法

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回调方法并保持回调活动以备以后使用。

/** * 跳转到选择带看视频页面 */ @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 。

/** * 原生调用此方法跳转到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 返回时,再启动原生页面,就可以把此页面移动到前台对用户可见。

/** * 返回到地图找房页面, */ backMapFindHouse() { switch (uni.getSystemInfoSync().platform) { case "android": const lib = uni.requireNativePlugin("TestModule") //返回到地图找房页面,调用原生backMapFindHouse方法 lib.backMapFindHouse() break; } }

/** * uniapp房源详情页返回原生地图找房页面 */ @UniJSMethod(uiThread = true) public void backMapFindHouse() { if (mUniSDKInstance != null && mUniSDKInstance.getContext() instanceof Activity) { startMapFindHouseActivity(); } }

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

  • 发表于:
  • 原文链接https://page.om.qq.com/page/O0Rd-v5GulyR54Cs4n8rHqbw0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券