Android 使用意图传递数据
我有两个活动,活动A和活动B。我使用意图将对象从活动A传递到活动B。当我在活动B中对对象进行更改时,数据更改不会反映在活动A中。我是否遗漏了某些内容?如果传递的是字符串,则不会更改,因为它们是不可变的Android 使用意图传递数据,android,Android,我有两个活动,活动A和活动B。我使用意图将对象从活动A传递到活动B。当我在活动B中对对象进行更改时,数据更改不会反映在活动A中。我是否遗漏了某些内容?如果传递的是字符串,则不会更改,因为它们是不可变的 编辑:请参见下面的意图附加的替代方法。如果您传递的是字符串,那么它将不会更改,因为它们是不可变的 编辑:参见下面的意图附加的替代方法。您缺少一个事实,即当您通过意图将对象O从活动A传递到活动B时,活动B接收对象O的副本。工作方式是对象O被序列化(转换为字节序列)然后将该字节序列传递给活动B。然后活
编辑:请参见下面的意图附加的替代方法。如果您传递的是字符串,那么它将不会更改,因为它们是不可变的
编辑:参见下面的意图附加的替代方法。您缺少一个事实,即当您通过意图将对象O从活动A传递到活动B时,活动B接收对象O的副本。工作方式是对象O被序列化(转换为字节序列)然后将该字节序列传递给活动B。然后活动B在序列化对象O时重新创建对象O的副本。序列化后对原始对象的任何更改都不会反映在其副本中
如果两个活动都是同一应用程序的一部分,则只需使用静态字段(或单例)在它们之间进行通信。您缺少这样一个事实,即当您通过intents将对象O从活动a传递到活动B时,活动B会收到对象O的副本。事情的工作方式是对象O被序列化(转换为字节序列),然后将该字节序列传递给活动B。然后,活动B在序列化对象O时重新创建对象O的副本。序列化后对原始对象的任何更改都不会反映在其副本中
如果两个活动都是同一应用程序的一部分,则只需使用静态字段(或单例)要在它们之间进行通信。如果希望使用在消息中传递不可变对象的体系结构,可以创建不可变的可序列化数据类。使用startActivityForResult在intent中传递数据类的不可变实例。第二个活动完成后,发送相同不可变数据的不同实例ass返回到第一个活动,它被困在onActivityResult中。因此在代码中,给定一个带有公共final字段的不可变类PasswordState.java
public final class PasswordState implements Serializable {
创建此不可变类的实例并将其发送到第二个活动,如中所示:
private void launchManagePassword() {
Intent i= new Intent(this, ManagePassword.class); // no param constructor
PasswordState outState= new PasswordState(lengthKey,
timeExpire,
isValidKey,
timeoutType,
password,
model.getIsHashPassword(),
model.getMinimumPasswordLength()); // NOT minimumHashedPasswordLength
Bundle b= new Bundle();
b.putSerializable("jalcomputing.confusetext.PasswordState", outState);
i.putExtras(b);
startActivityForResult(i,REQUEST_MANAGE_PASSWORD); // used for callback
}
第二个活动完成后返回一个新对象
PasswordState outPasswordState= new PasswordState(lengthKey,
timeExpire,
isValidKey,
timeoutType,
password,
isHashPassword,
minimumPasswordLength);
Bundle b= new Bundle();
b.putSerializable("jalcomputing.confusetext.PasswordState", outPasswordState);
getIntent().putExtras(b);
setResult(RESULT_OK,getIntent()); // call home with data on success only
finish(); // go back <=== EXITS Here
当您完成原型设计且数据对象稳定后,您可以重构代码以使用包而不是序列化对象。由于使用序列化在活动之间发送副本,因此可能会认为使用不可变对象是过激的。使用可变对象并将可变对象序列化到second活动将简化实现
希望有帮助。
JAL如果希望使用在消息中传递不可变对象的体系结构,则可以创建不可变序列化数据类。使用startActivityForResult在intent中传递数据类的不可变实例。第二个活动完成后,将同一不可变数据类的不同实例发送回第一个活动在代码中,给定一个带有公共final字段的不可变类PasswordState.java
public final class PasswordState implements Serializable {
创建此不可变类的实例并将其发送到第二个活动,如中所示:
private void launchManagePassword() {
Intent i= new Intent(this, ManagePassword.class); // no param constructor
PasswordState outState= new PasswordState(lengthKey,
timeExpire,
isValidKey,
timeoutType,
password,
model.getIsHashPassword(),
model.getMinimumPasswordLength()); // NOT minimumHashedPasswordLength
Bundle b= new Bundle();
b.putSerializable("jalcomputing.confusetext.PasswordState", outState);
i.putExtras(b);
startActivityForResult(i,REQUEST_MANAGE_PASSWORD); // used for callback
}
第二个活动完成后返回一个新对象
PasswordState outPasswordState= new PasswordState(lengthKey,
timeExpire,
isValidKey,
timeoutType,
password,
isHashPassword,
minimumPasswordLength);
Bundle b= new Bundle();
b.putSerializable("jalcomputing.confusetext.PasswordState", outPasswordState);
getIntent().putExtras(b);
setResult(RESULT_OK,getIntent()); // call home with data on success only
finish(); // go back <=== EXITS Here
当您完成原型设计且数据对象稳定后,您可以重构代码以使用包而不是序列化对象。由于使用序列化在活动之间发送副本,因此可能会认为使用不可变对象是过激的。使用可变对象并将可变对象序列化到second活动将简化实现
希望有帮助。
JAL值得注意的一点是:意图并不是传递可变对象的最佳方式,因为您会注意到extras()仅限于基本类型、捆绑、可打包和可序列化,并且在任何情况下,在另一端膨胀的对象都不能保证与您首先放置的对象相同。如果您计划传递要反映活动之间更改的对象,请使用处理程序或静态对象或服务或其他方式,但不是意图。谢谢。我将采用单例方式。:-)值得注意的一点是:意图并不是传递可变对象的最佳方式,因为您会注意到extras()仅限于基本类型,Bundle,可以打包和序列化,而且在任何情况下,在另一端充气的对象都不能保证与您首先放置的对象相同。如果您计划在活动之间传递要反映更改的对象,请使用处理程序、静态对象、服务或其他,但不要使用意图。谢谢。我要走单身汉的路。:-)非常感谢。这让我对intent的工作方式有了很好的了解。我现在用单件的方式和活动进行沟通。谢谢。这让我对intent的工作方式有了很好的了解。我现在使用单例方式与活动进行b/w沟通。