文章详情
uni-app进阶之native.js的运用
标签:
  • uni-app
  • native.js
日期:2021-6-23 18:38
摘要:在用uni-app开发安卓应用的时候,uni-app帮我们封装的内容十分有限,很多情况下需要用native.js来支撑...

首先,官方是这么解释native.js的:

“Native.js for Android封装一条通过JS语法直接调用Native Java接口通道,通过plus.android可调用几乎所有的系统API。”

看到这句,说白了这玩意就是个jsBridge,可以用js来写安卓代码,好不好用呢,咱们来瞧瞧。

在开始写native.js之前,咱们得去官方文档瞄一瞄基本的语法:

https://www.html5plus.org/doc/zh_cn/android.html

内容很少,就截图里的这些方法:

官方社区也有一些现成的例子,结合本文后再去看看,轻松举一反三:

https://ask.dcloud.net.cn/docs/#//ask.dcloud.net.cn/article/114

如果之前是写安卓的同学,看到这些估计直接就起飞了,但是对咱们写web的来说,还是得好好研究研究。

重点

native.js虽然强大和开放,但很多web开发者因为不熟悉原生安卓API而难以独立完成。

大部分uni-app的开发者应该没有接触过安卓开发,所以我们面对的是一片盲区,而为了写native.js去学习安卓,显然不是什么好主意,本末倒置。那怎么办,我慢慢摸索出了一套方法。

1.利用搜索引擎搜索现成的native.js代码,抄抄抄,抄出一片未来。

2.实在抄不到,我们去搜索安卓的原始代码,然后翻译成native.js,一枝独秀。

举个简单的例子,现在要获取手机开机的时间,我们先去找到安卓的写法:

看起来很简洁啊,调用SystemClock的一个方法直接拿到了系统从启动到现在的毫秒数,用当前时间减一下就是开机时间了,可我们并不知道SystemClock是个什么东西,所以继续往下查询:



通过查询,我们知道了这是一个类,包名是android.os.SystemClock,并且知道了它的静态方法,那就轮到native.js上场了,直接上代码:

// 引入SystemClock类
const SystemClock = plus.android.importClass("android.os.SystemClock")
// 调用这个类的静态方法
const elapsedRealtime = SystemClock.elapsedRealtime() // 用当前时间戳减去系统运行的时间戳
const startupTime = new Date().getTime() - elapsedRealtime

这就搞定了,此处应有掌声...

我们再来看一个例子,获取设备的剩余电量,这个社区有现成的native.js代码,但那是广播的写法,我们来翻译一个常规的写法,还是先找到安卓的代码:

这段代码也是简洁明了,定义了一个获取电量的函数来返回电量,通过getSystemService方法传入一个Context的某个属性获取到了BATTERY_SERVICE这个服务,然后通过调用这个服务的一个叫getIntProperty的方法传入一个参数来获取当前电量百分比。

这里有几个要点:

1.凡是看到getSystemService出现,就要去用plus.android.runtimeMainActivity()得到的东西来调用。

2.凡是看到Context出现,就要引入"android.content.Context"这个类

3.getSystemService获取到的服务实例,要用plus.android.invoke(服务实例,方法名,参数值)来调用服务实例身上的方法。

说的好像不好理解,结合翻译后的代码应该就明白了,开始翻译:

// 获取应用主Activity实例对象
const MainActivity = plus.android.runtimeMainActivity()
// 引入Context类
const Context = plus.android.importClass("android.content.Context")
// 引入BatteryManager类
const BatteryManager = plus.android.importClass("android.os.BatteryManager")
// 获取电池管理服务
const BATTERY_SERVICE = MainActivity.getSystemService(Context.BATTERY_SERVICE)
// 查询剩余电量百分比
const capacity = plus.android.invoke(BATTERY_SERVICE, "getIntProperty", BatteryManager
.BATTERY_PROPERTY_CAPACITY)

其实BatteryManager里面是有很多其它属性的,可以用同样的方法获取,上面我们拿到的BatteryManager.BATTERY_PROPERTY_CAPACITY其实就是数字4,传4也是一样的,甚至连"android.os.BatteryManager"都可以不引入。

下图是安卓BatteryManager类的源码,里面看得到几个静态常量的值,4就是我们刚刚拿到的。

到点了,下班下班,还有获取传感器数据的例子没讲,例如什么陀螺仪啊,加速度啊等等,这些涉及到实现Interface,会稍微复杂点,留到下次再做记录。


发送
评论(0)