我有两个活动,活动A和活动B.我使用意图将活动A中的对象传递给活动B.当我对活动B中的对象进行更改时,数据更改不会反映在活动A中。我是否错过了某些内容?
答案 0 :(得分:1)
如果要传递String,那么它不会更改,因为它们是不可变的。
编辑:请参阅下文,了解Intent extras的替代方案。
答案 1 :(得分:1)
当你通过意图将对象O从活动A传递给活动B时,活动B接收到对象O的COPY。事情的工作方式是对象O被序列化(转换为字节序列)然后将该字节序列传递给Activity B.然后,活动B在序列化时重新创建对象O的副本。序列化后原始对象的任何更改都不会反映在它的副本中。
如果两个活动都是同一个应用程序的一部分,那么只需使用静态字段(或单例)在它们之间进行通信。
答案 2 :(得分:1)
如果您希望使用在消息中传递不可变对象的体系结构,则可以创建不可变的可序列化数据类。使用startActivityForResult在intent中传递数据类的不可变实例。第二个活动完成后,将同一个不可变数据类的不同实例发送回第一个活动,该活动将被捕获在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
它被困在活动一中。
// ON_ACTIVITY_RESULT used for callback from ManageKeys.java
protected void onActivityResult(int request, int result, Intent data)
{
switch (request){
case REQUEST_MANAGE_PASSWORD:
if (result == RESULT_OK) { // Success. New password.
try {
PasswordState inMessage= (PasswordState)data.getSerializableExtra("jalcomputing.confusetext.PasswordState");
password= inMessage.password;
timeExpire= inMessage.timeExpire;
isValidKey= true;
writeToPrefs(); // support first launch and incoming tagged sms, save pw
}
catch(Exception e){ // data == null, extras == null
password= "";
isValidKey= false;
timeExpire= PasswordState.LONG_YEAR_MILLIS;
Log.d(Utilities.TAG,"FailedToGetResult",e); // will be stripped at runtime
}
...
break;
}
}
完成原型设计并且数据对象稳定后,您可以重构代码以使用parcel而不是序列化对象。由于使用序列化在活动之间发送副本,因此可以认为使用不可变对象是过度的。使用可变对象并将可变对象与第二个活动进行序列化将简化实现。
希望有所帮助。 JAL