在delphi Tokyo源代码中,我看到这两种不同的方式来检索“服务管理器”
var FLocationManager: JLocationManager;
FLocationManager := TJLocationManager.Wrap(TAndroidHelper.Context.getSystemService(TJContext.JavaClass.LOCATION_SERVICE));
和:
var FNotificationManager: JNotificationManager;
var NotificationServiceNative: JObject;
NotificationServiceNative := TAndroidHelper.Context.getSystemService(TJContext.JavaClass.NOTIFICATION_SERVICE);
FNotificationManager := TJNotificationManager.Wrap((NotificationServiceNative as ILocalObject).GetObjectID);
这两种方式到底有什么区别?为什么在第二种情况下他们这样做(NotificationServiceNative as ILocalObject).GetObjectID 而不是在第一种情况下?
最佳答案
将 Java 对象引用转换为 ILocalObject
并提取其 ObjectID
是将对象引用转换为另一种对象类型的正确方法,使用 Wrap()
.
但是,更短的方式也可以工作,因为 Wrap()
有一个重载,它将 Java 对象引用作为输入并在内部调用 GetObjectID
就可以了,然后 Wrap()
就可以了。
所以,回答你的问题 - 没有真正的区别。两种方法都有效。
较长的代码可能只是旧版本 Delphi 的遗留物?我不记得 Wrap()
重载是否始终存在。当然,在 Delphi 支持 Android 的早期,您总是必须手动获取 ObjectID
。 Wrap()
重载可能是后来添加的,也许并非所有 FMX 代码都利用它。
关于delphi - 这样做的目的是什么(MyJobject as ILocalObject).GetObjectID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52645534/