一个Java方法,可以被Siri、Spotlight和Shortcuts调用,也能驱动安卓桌面快捷方式——这是Codename One的PR #5559引入的功能。
Codename One是一个开源框架,开发者可以用一套Java或Kotlin代码库,构建iOS、Android、桌面和Web应用。这次的新功能,核心是PR #5559引入的com.codename1.intents包和配套的构建期注解。
![]()
一次声明,多个系统入口
开发者只需要在一个公开的静态方法上加上@AppIntent注解,就能把这个方法暴露给苹果生态的Siri、Spotlight和Shortcuts。同一个声明,还能生成安卓的桌面快捷方式,或者作为应用内部命令使用。
构建过程只会为每个目标平台生成它支持的本地声明。也就是说,iOS上生成的是苹果的Intents相关配置,安卓上生成的是对应的快捷方式声明。
无界面进程也能跑
一个值得注意的细节是:应用意图(App Intent)可能在系统为了响应它而专门启动的进程中运行。这种情况下,可能没有应用对象(Application Object),也没有可见的界面表单。这意味着意图处理逻辑必须设计成能在无头(headless)环境下工作。
来看一个实际的例子。下面这段代码注册了一个名为"log_workout"的意图,用于记录一次完成的锻炼:
private static final Object WORKOUT_TOTAL_LOCK = new Object();@AppIntent(value = "log_workout", title = "Log a workout",description = "Records a completed workout",phrases = {"Log a workout in ${applicationName}"},headless = true, timeoutSeconds = 5)public static IntentResult logWorkout(@IntentParam(value = "kind", title = "What kind of workout?",options = {"run", "ride", "swim"}) String kind,@IntentParam(value = "minutes", title = "How many minutes?") int minutes) {int total;synchronized (WORKOUT_TOTAL_LOCK) {total = Preferences.get("totalMinutes", 0) + minutes;Preferences.set("totalMinutes", total);return IntentResult.value(String.valueOf(total)).withDialog("Logged " + minutes + " minutes.");}这个方法的参数也通过@IntentParam注解定义。比如"kind"参数会提供一个选项列表(跑步、骑行、游泳),"minutes"参数则接收一个整数。用户通过Siri说"记录一次跑步30分钟",系统就会调用这个方法,更新累计锻炼时间,并通过withDialog返回一个对话框反馈。
为什么必须是静态方法?
这里有个技术上的硬性要求:方法必须是static的。原因是构建过程会生成直接的方法调用代码。在翻译后的iOS代码中,运行时注解查找(Runtime Annotation Lookup)不可用,而且死代码消除(Dead-Code Elimination)会移除那些没有Java调用者的方法。基于反射的调度器可能编译成功,但从发布的应用中消失。意图处理器可以并发运行。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.