我有两个活动,活动A和B.活动数据传递使用意图我通过从活动A对象活动B。当我对活动B中的对象进行更改时,数据更改不会反映在活动A中。我是否错过了某些内容?使用意图
使用意图
回答
您错过了一个事实,即当您通过意图将活动A中的对象O传递给活动B时,活动B接收到对象O的复制。事情工作的方式是将对象O序列化(转换为字节),然后将该字节序列传递给活动B,然后活动B在序列化时重新创建对象O的副本。序列化后对原始对象的任何更改都不会反映在其副本中。
如果两个活动是相同的应用程序的一部分,那么只需要使用一个静磁场(或单身)在它们之间进行通信。
如果你传递一个字符串,那么就不会改变,因为它们是不可变的。
编辑:请参阅下面的替代物意图演员。
好的一点要注意:intents并不是传递可变对象的最好方法,因为您会注意到extras()仅限于基本类型,Bundle,Parcelable和Serializable,以及任何情况下的对象在另一端得到充气不一定是你放在第一位的。如果您计划传递要反思活动之间的变化,使用处理或静态对象或服务或别的东西,而不是一个Intent对象。 – Femi 2011-05-03 14:38:15
谢谢。我要去辛格尔顿的方式。 :-) – 2011-05-04 13:06:25
如果您希望使用通过不可变对象以消息的架构,你可以创建一个不可改变的序列化的数据类。使用startActivityForResult在意图中传递数据类的不可变实例。当第二个活动完成时,将同一个不可变数据类的不同实例发送回第一个活动,并将其捕获到onActivityResult中。所以在代码中,给定一个具有public 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;
}
}
当您完成原型设计和数据对象是稳定的,你可以重构使用包裹,而不是序列化对象的代码。由于使用序列化在活动之间发送副本,因此可能会认为使用不可变对象是过度的。使用可变对象和序列化第二个活动中的可变对象将简化实现。
希望有所帮助。JAL
- 1. 使用意图
- 2. 使用意图
- 3. 使用意图
- 4. 意图chatBot使用rasa_nlu
- 5. 使用意图与动作
- 6. 的Android使用意图
- 7. Android的使用意图
- 8. Android意图使用(Call_action&new_task_launch)
- 9. 使用意图的android eclipse
- 10. 使用Robotium与意图
- 11. 如何使用意图
- 12. 使用谷歌地图意图
- 13. 谷歌地图使用意图
- 14. 以明确的意图使用意图过滤器
- 15. 如何使用其他意图传递意图数据?
- 16. 分享意图不使用Facebook信使
- 17. 当应用程序未使用意图
- 18. 无法在Android意图中使用库
- 19. 使用非活动类的意图
- 20. 回拨使用phonegap的Android意图
- 21. 在botbuilder中使用api.ai的意图
- 22. 使用SharedPreferences设置意图的类值
- 23. 在意图初始化中使用xyz.class
- 24. 如何使用意图过滤
- 25. - 使用烟灰Android的意图分析
- 26. 在Android上使用意图问题
- 27. 使用意图的空指针异常
- 28. 如何使用意图更新活动?
- 29. 使用隐式意图启动活动?
- 30. 如何在Asynctask类中使用意图?
谢谢。这让我对intents的工作方式有了很好的了解。我现在正在用单身的方式来交流活动。 – 2011-05-04 13:05:35