2011-05-03 41 views
0

我有两个活动,活动A和B.活动数据传递使用意图我通过从活动A对象活动B。当我对活动B中的对象进行更改时,数据更改不会反映在活动A中。我是否错过了某些内容?使用意图

回答

1

您错过了一个事实,即当您通过意图将活动A中的对象O传递给活动B时,活动B接收到对象O的复制。事情工作的方式是将对象O序列化(转换为字节),然后将该字节序列传递给活动B,然后活动B在序列化时重新创建对象O的副本。序列化后对原始对象的任何更改都不会反映在其副本中。

如果两个活动是相同的应用程序的一部分,那么只需要使用一个静磁场(或单身)在它们之间进行通信。

+0

谢谢。这让我对intents的工作方式有了很好的了解。我现在正在用单身的方式来交流活动。 – 2011-05-04 13:05:35

1

如果你传递一个字符串,那么就不会改变,因为它们是不可变的。

编辑:请参阅下面的替代物意图演员。

+4

好的一点要注意:intents并不是传递可变对象的最好方法,因为您会注意到extras()仅限于基本类型,Bundle,Parcelable和Serializable,以及任何情况下的对象在另一端得到充气不一定是你放在第一位的。如果您计划传递要反思活动之间的变化,使用处理或静态对象或服务或别的东西,而不是一个Intent对象。 – Femi 2011-05-03 14:38:15

+0

谢谢。我要去辛格尔顿的方式。 :-) – 2011-05-04 13:06:25

1

如果您希望使用通过不可变对象以消息的架构,你可以创建一个不可改变的序列化的数据类。使用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