iOS 控制器数据共享与 Android 活动数据共享

iOS controllers data sharing vs Android activities data sharing

我正在为 iOS 和 Android 开发本机应用程序,我注意到一些不同的东西引起了我的兴趣。这不是问题或错误,可能只是不同平台上的不同行为,但我想了解原因以及是否遗漏了什么。

假设有 2 个 Android 活动:

Activity1 starts Activity2 and using intents bundle assign its model to Activity2 model

iOS 控制器相同:

Controller1 starts Controller2 and using segues assign its model to Controller2 model

当我在 Activity2 中修改模型并返回到 Activity1 时,模型没有更新,所以我必须通知此更改(使用广播、委托或其他方式)。 iOS 则不同,因为当我返回 Controller1 时,模型已经更新。

为什么会这样? iOS 个控制器是否在同一个模型实例上工作,而 Android 个活动进行克隆?

检查你的 IOS 代码,你会在第一个控制器上找到一个名为 "viewWillAppear" 的方法,所以这个方法将更新你在上一个屏幕上所做的更改。

您可以通过使用方法 "onResume()" 在 Android 中应用同样的事情,因此实现此方法并将更新任务从 "onCreate()" 方法写入 "onResume()" 方法。

在IOS和Android中,主方法"ViewDidLoad()"和"onCreate()"只在activity或控制器启动时调用一次,然后它们会通知通过 "viewWillAppear" 和 "onResume" 方法。

勾选这对你有帮助。

您注意到的差异是由于使用了两种不同的编程语言。

在 Android 中您使用的是 Java,而在 Java 中没有任何内容通过引用传递 ,所有内容都通过值传递。对象引用按值传递。

此外 字符串在 Java 中是不可变的,因此如果您使用意图包将字符串传递给 Activity2,并且您在 Activity 2、系统在不同的内存地址分配了一个新的String。

参见 this 关于 Java 参数传递的回答。

希望对您有所帮助

在 iOS 上,您通过对新 VC 的引用传递对象。因此,如果您在第二个 VC 中更改该对象的 属性,则该更改对第一个 VC 可见,因为它是同一个对象。

在 Android 上,当您通过 Bundle 传递对象时,它们会被序列化和反序列化,这 可以 创建一个新对象,因此更改是不可见的在原文中Activity。在片段之间传递 Parcelable 数据时,它们可以通过引用传递,并且更改在原始 Fragment.

中可见

编辑: 在 Java/Android 中,对象是按值传递的,而不是按引用传递的,因此当您将新对象分配给变量时,原始片段中的旧对象不会改变。但是,如果您更改其内部状态(例如 property/field),那么这会反映在原始片段中。