Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/211.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用意图传递数据_Android - Fatal编程技术网

Android 使用意图传递数据

Android 使用意图传递数据,android,Android,我有两个活动,活动A和活动B。我使用意图将对象从活动A传递到活动B。当我在活动B中对对象进行更改时,数据更改不会反映在活动A中。我是否遗漏了某些内容?如果传递的是字符串,则不会更改,因为它们是不可变的 编辑:请参见下面的意图附加的替代方法。如果您传递的是字符串,那么它将不会更改,因为它们是不可变的 编辑:参见下面的意图附加的替代方法。您缺少一个事实,即当您通过意图将对象O从活动A传递到活动B时,活动B接收对象O的副本。工作方式是对象O被序列化(转换为字节序列)然后将该字节序列传递给活动B。然后活

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

如果传递的是字符串,则不会更改,因为它们是不可变的


编辑:请参见下面的意图附加的替代方法。

如果您传递的是字符串,那么它将不会更改,因为它们是不可变的


编辑:参见下面的意图附加的替代方法。

您缺少一个事实,即当您通过意图将对象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沟通。