let ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); let batteryStatus = context.registerReceiver(null, ifilter); let status = batteryStatus?.getIntExtra(BatteryManager.EXTRA_STATUS, -1); let isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING || status == BatteryManager.BATTERY_STATUS_FULL;
const res : GetBatteryInfoSuccess = { errMsg: 'getBatteryInfo:ok', level, isCharging: isCharging } options.success?.(res) options.complete?.(res) } else { let res = new GetBatteryInfoFailImpl(1001); options.fail?.(res) options.complete?.(res) } }
比如上方代码,通过 import BatteryManager from "android.os.BatteryManager" 可以直接导入使用 Android 的 BatteryManager 对象。
甚至你可以直接在 uts 里直接实现 OnClickListener 接口: js 体验AI代码助手 代码解读复制代码import OnClickListener from 'android.view.View.OnClickListener'; // 实现 OnClickListener 接口 class User { name:string = "name" }
class StartBroadcastListener extends User implements OnClickListener{
override onClick(v?: View):void{
let myReceiver = new ScreenReceiver(); let filter = new IntentFilter(); filter.addAction(Intent.ACTION_SCREEN_OFF); filter.addAction(Intent.ACTION_SCREEN_ON); UTSAndroid.getUniActivity()!.registerReceiver(myReceiver, filter);
而回到平台视角,现在 uni-app x 同样支持了微信小程序,所以从这个节点看,uni-app x 确实可以开始成为 DCloud 的下一代主力框架,如果后续推进顺利,uni-app 也许就成为历史了。 当然,前面展示的随意混编原生代码的写法其实并不规范,正常 uni-app x 还是需要统一成插件形式,官方表示目前插件市场已经有数千款 uni-app x 的插件,其中不少插件已支持鸿蒙next ,不过需要注意的是,uni-app x 不再支持旧有的原生语言插件,所有原生能力扩展都必须通过 uts 插件实现。
另外,它的局限性问题也很明显,因为它的优势在于编译器转译得到原生性能,但是它的劣势也是在于转译,和使用类 skia 独立绘制的场景不同, uni-app x 需要考虑 uts 在不同平台和不同语言之间的同步和约束。 其实在之前我们聊《用 Swift 写 Android App ?来了解下 Skip 原生级跨平台框架》 的时候就讲过,Skip 也是将 Swift 直接翻译成 Kotlin 原生去适配 Android,不同的是它是直接通过 Swift / SwiftUI 去转移为 Kotlin / Compose,所以在语法和兼容成本会更低一点点,但是就算这样,也存在需要需要妥协的地方,例如:
并不支持完整的语言,阉割是必须的,为了支持 Kotlin 和 Compose ,API 必然需要为了转译器而做删减 Skip 转译器不能执行 Swift 类型推理以及完整的 Swift 编译器 语言差异:例如 Swift 和 Kotlin 处理泛型方式不同,又或者 Kotlin 缺乏 static protocol 要求
所以,回到 uni-app x ,Skip 的问题在它这里同样存在,甚至因为支持的平台更多,它需要做的兼容和 if else 场景会更复杂,这对于 uni-app x 的后续推进和细节优化会是最大的挑战,uts 确实也做了一些约束,比如:
在编译到 Kotlin 和 Swift 时,不支持 undefined 类型 不允许以 $ 开头的变量名 使用 var 声明变量可能需要考虑平台差异 一些 uts 内置 API(如 Array.sort() 在 Swift 平台,部分 Math 和 RegExp 的方法)在特定原生平台上的支持可能存在限制或行为差异 ····