Android 扩展 uni小程序SDK 原生能力

概述

本文档主要介绍如何扩展 uni小程序SDK 原生能力。

什么是扩展原生能力?

扩展原生能力指的是将您原生开发的功能通过一定规范暴露给 uni小程序环境,然后即可在 uni小程序应用中调用您的原生功能。

扩展方式

uni 原生端是基于 WeexSDK 来实现扩展原生能力,扩展原生能力有两种方式:一种是不需要参与页面布局,只需要通过 API 调用原生功能,比如:获取当前定位信息、数据请求等功能,这种情况可通过扩展module的方式来实现;另一种是需要参与页面布局,比如:map、image,这种情况需要通过扩展component即组件的方法来实现;

开发前准备

JAVA环境 jdk1.7+(最优1.8)

下载uni小程序 SDK 详情;

注意事项

如果你扩展的Module或Component要与宿主进行数据交互需要注意。宿主与小程序不在同一进程,内存不共享。所以需要开发者自己实现跨进程通信。后续会完善此交互问题。

关于扩展的Module或Component代码中日志log。小程序运行在io.dcloud.unimp子进程。看日志log需要在这个进程看日志log。

扩展 module

下面以TestModule为例,源码请查看 uni小程序SDK 包中的示例 DEMO 工程;

1.创建Android Studio的Module模块

在现有Android项目中创建library的Module。例如TestModule

配置刚创建的Module的build.gradle信息。

示例:

//导入aar需要的配置

repositories {

flatDir {

dirs 'libs'

}

}

dependencies {

//必须添加的依赖

compileOnly 'com.android.support:recyclerview-v7:27.1.0'

compileOnly 'com.android.support:support-v4:27.1.0'

compileOnly 'com.android.support:appcompat-v7:27.1.0'

compileOnly 'com.alibaba:fastjson:1.1.46.android'

compileOnly fileTree(include: ['uniapp-release.aar'], dir: '../app/libs')

}

Tips:

uniapp-release.aar是扩展module主要依赖库,必须导入此依赖库!

2.创建TestModule类

Module 扩展必须继承 WXModule 类

示例:

public class TestModule extends WXModule

扩展方法必须加上@JSMethod (uiThread = false or true) 注解。Weex 会根据注解来判断当前方法是否要运行在 UI 线程,和当前方法是否是扩展方法。

Weex是根据反射来进行调用 Module 扩展方法,所以Module中的扩展方法必须是 public 类型。

示例:

//run ui thread

@JSMethod(uiThread = true)

public void testAsyncFunc(JSONObject options, JSCallback callback) {

Log.e(TAG, "testAsyncFunc--"+options);

if(callback != null) {

JSONObject data = new JSONObject();

data.put("code", "success");

callback.invoke(data);

}

}

//run JS thread

@JSMethod (uiThread = false)

public JSONObject testSyncFunc(){

JSONObject data = new JSONObject();

data.put("code", "success");

return data;

}

同样因为是通过反射调用,Module 不能被混淆。请在混淆文件中添加代码:-keep public class extends com.taobao.weex.common.WXModule{;}

Module 扩展的方法可以使用 int, double, float, String, Map, List 类型的参数

3.注册TestModule

由于uni小程序运行在独立子进程中。内存与宿主不共享。所以宿主进程注册了TestModule,在uni小程序是无法使用的。

Android创建子进程时会主动再次初始化Application!所以uni小程序注册TestModule必须在Application中的onCreate初始化或注册。

Tips

注册TestModule之前记得配置宿主的build.gradle导入Module模块.

以下示例代码写在宿主的Application中。

示例:

public class App extends Application {

@Override

public void onCreate() {

super.onCreate();

try {

WXSDKEngine.registerModule("TestModule", TestModule.class);

} catch (WXException e) {

e.printStackTrace();

}

}

}

到此,我们已经完成了一个简单的 module 扩展

4. 在 uni小程序 中调用 module 方法

module 支持在 vue 和 nvue 中使用

示例:

testAsyncFunc

testSyncFunc

// 获取 module

var testModule = uni.requireNativePlugin("TestModule")

export default {

methods: {

testAsyncFunc() {

// 调用异步方法

testModule.testAsyncFunc({

'name': 'unimp',

'age': 1

},

(ret) => {

console.log(ret)

})

},

testSyncFunc() {

// 调用同步方法

var ret = testModule.testSyncFunc({

'name': 'unimp',

'age': 1

})

console.log(ret)

}

}

}

扩展组件 component

下面以TestComponent为例,源码请查看 uni小程序SDK 包中的示例 DEMO 工程;

1.创建Android Studio的Module模块

请参考 扩展 Module

2.创建TestComponent类

Component 扩展类必须继承 WXComponent

示例:

public class TestText extends WXComponent

WXComponent的initComponentHostView回调函数。构建Component的view时会触发此回调函数。

示例:

@Override

protected TextView initComponentHostView(@NonNull Context context) {

TextView textView = new TextView(context);

textView.setTextSize(20);

textView.setTextColor(Color.BLACK);

return textView;

}

Component 对应的设置属性的方法必须添加注解 @WXComponentProp(name=value(value is attr or style of dsl))

示例:

@WXComponentProp(name = "tel")

public void setTel(String telNumber) {

getHostView().setText("tel: " + telNumber);

}

Weex sdk 通过反射调用对应的方法,所以 Component 对应的属性方法必须是 public,并且不能被混淆。请在混淆文件中添加代码 -keep public class extends com.taobao.weex.ui.component.WXComponent{;}

Component 扩展的方法可以使用 int, double, float, String, Map, List 类型的参数

Component 自定义事件

对于每个组件默认提供了一些事件能力,如点击等。也可以自定义事件。在uni小程序代码中,通过 @事件名="方法名" 添加事件,如下添加onTel事件

//原生触发fireEvent 自定义事件onTel

Map params = new HashMap<>();

Map number = new HashMap<>();

number.put("tel", telNumber);

//目前uni限制 参数需要放入到"detail"中 否则会被清理

params.put("detail", number);

fireEvent("onTel", params);

//标签注册接收onTel事件

//事件回调

methods: {

onTel: (e)=> {

console.log("onTel="+e.detail.tel);

}

}

注意

执行自定义事件fireEvent时params的数据资源都要放入到"detail"中。如果没有将你得返回的数据放入"detail"中将可能丢失。请注意!!!

3.注册TestComponent组件

由于uni小程序运行在独立子进程中。内存与宿主不共享。所以宿主进程注册了TestComponent,在uni小程序是无法使用的。

Android创建子进程时会主动再次初始化Application!所以uni小程序注册TestComponent必须在Application中的onCreate初始化或注册。

Tips

注册TestModule之前记得配置宿主的build.gradle导入的Module模块.

以下示例代码写在宿主的Application中。

示例:

public class App extends Application {

@Override

public void onCreate() {

try {

WXSDKEngine.registerComponent("myText", TestText.class);

} catch (WXException e) {

e.printStackTrace();

}

super.onCreate();

}

}

到此,我们已经完成了一个简单的 component 扩展

4. 在uni小程序代码中使用组件

注意:扩展的 component 只能在 nvue 文件中使用

示例:

export default {

data() {

return {

}

},

onLoad() {

},

methods: {

onTel: (e)=> {

console.log("onTel="+e.detail.tel);

}

}

}

Android 扩展开发小提示

查看Android原生日志

小程序运行在独立子进程。所以想要看小程序的日志需要将进程切换到io.dcloud.unimp进程查看log!

查看小程序 console日志

修改项目中assets/data/dcloud_control.xml 内部信息。将syncDebug改为true,开启调试模式。 注意正式版需要改为false!!!

修改后查看io.dcloud.unimp进程查看log。TAG为console

在WXModule、WXComponent中跳转原生页面

获取WXSDKInstance对象。该对象中可以获取到上下文。

示例

@JSMethod (uiThread = true)

public void gotoNativePage(){

if(mWXSDKInstance != null) {

Intent intent = new Intent(mWXSDKInstance.getContext(), NativePageActivity.class);

mWXSDKInstance.getContext().startActivity(intent);

}

}

Android扩展类方法,Android 扩展 uni小程序SDK 原生能力相关推荐

  1. 微信开放小程序SDK,几款SDK产品对比分析

    前言 这几天看到微信团队推出了一个名为 Donut 的小程序原生语法开发移动应用框架,通俗的讲就是将微信小程序的能力开放给其他的企业,第三方的 App 也能像微信一样运行小程序了. 其实不止微信,面对 ...

  2. uniapp推出小程序SDK,会是一场技术驱动的行业变革吗?

    背景 2020年2月8日,著名跨端开发技术框架uniapp发布小程序SDK.借用官方的一句话来解释这个SDK的功能: "uni小程序SDK,是一个用于原生App中集成的SDK,它可以帮助原生 ...

  3. Android studio开发-单界面单机小程序

    Android studio开发-单界面单机小程序 最终结果展示 步骤: 建立项目 file-new-new project 新建一个项目文件 选择一个empty activity 配置项目名称以及项 ...

  4. Android安卓的家教平台设计小程序app毕业设计

    Android安卓的家教平台设计小程序app毕业设计

  5. 原生app 打开uni小程序 传参问题

    最近要在一个原生app的基础上开发新功能,  新功能和原app没有太多交集, 考虑到原生app开发复杂,工期较长, 决定在原生app的基础上整合uni小程序, 使用uniapp开发新功能, 在整合的过 ...

  6. 小程序音视频能力技术负责人解读“小程序直播”

    策划 / LiveVideoStack 责编 / 包研 一夜之间,"小程序+直播"成为多媒体开发者热议的话题.从底层技术实现到接口开放程度,是否绑定腾讯云?价格体系?低延迟性能如何 ...

  7. c++小程序代码_# 微信小程序的原生框架和taro对比 ##

    微信小程序的原生框架和taro对比 小程序历史(为什么会出现?) 2007年 iPhone H5 大家知道现在手机端主要是iOS.Android两大系统,实际上在早期有3大系统竞争,还有一个就是诺基亚 ...

  8. 常青:小程序音视频能力再升级

    LiveVideoStack采访了腾讯云音视频业务终端研发团队负责人常青,针对小程序音视频能力技术升级.场景支持.政策审核以及未来演进趋势进行了详细的探讨. 文 / 常青 策划 / LiveVideo ...

  9. 深入解读-微信小程序SDK

    前言   这篇文章主要是对小程序官方文档做部分深入解读:让大家了解小程序实现背后的机制原理. 由于笔者没有获取到微信官方提供的小程序实现原理图,很多内容都是通过阅读文档资料反推和理解所得,如有误解之处 ...

最新文章

  1. make mrproper 删除编译产生的相关文件
  2. HOWTO:InstallShield中如何制作应用程序的卸载快捷方式
  3. 几种C++ std::string和std::wstring相互转换的转换方法
  4. yum java 1.7_centos通过yum安装jdk1.7或1.8
  5. ejb 示例 2018_Java EE EJB拦截器教程和示例
  6. 学习java的经典书籍
  7. LeetCode 1101. 彼此熟识的最早时间(排序+并查集)
  8. JSP tomcat 更新不生效
  9. 禁止特定IP访问Oracle数据库
  10. 卸载阿里云服务器的mysql_阿里云服务器购买,双11领阿里云服务器优惠券!
  11. 微软Windows系统命令和Sysinternals系列工具
  12. PIC单片机IDE,IPE和PICkit3下载使用的几个坑
  13. Unity3D中背景音乐和相关音效的添加,背景音乐暂停、停止和播放的设置
  14. 抖音数据统计_抖音账号数据分析
  15. 慧都与数据库厂商Devart进一步提升合作层次
  16. 0.强化学习概述+policy based+value based
  17. pip使用清华镜像源安装库
  18. 主分区、扩展分区、逻辑分区
  19. mysql 索引代码_mysql索引
  20. java编写car类_java编写一个汽车类,有属性:品牌、型号、排量、速度,有方法:启动、加速、转弯、刹车、息火...

热门文章

  1. 计算机基础知识背诵口诀,内部资料--教育基础知识背诵口诀(一遍记住)
  2. php赋值就变错误了,PHP基础陷阱题(变量赋值)_PHP教程
  3. pg库sharelock_PostgreSQL 行锁解读
  4. Android之ContentProvider数据存储
  5. poco c++ library 特性
  6. sem_wait sem_post信号量操作进本函数
  7. [转]大学里面一定要了解十五件事
  8. C++之++操作符重载
  9. nginx 模块讲解
  10. (7)-(Reverse Integer)-(将整数按位反转成另外一个整数,考虑溢出)-(知道最大整数和最小整数值)...