使用Intents传递数据

时间:2011-05-03 14:25:20

标签: android

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

3 个答案:

答案 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