Java 如何在Bundle中传递自定义对象?

Java 如何在Bundle中传递自定义对象?,java,android,object,android-intent,bundle,Java,Android,Object,Android Intent,Bundle,我正在尝试将自己的自定义对象传递到捆绑包中: Bundle b = new Bundle(); STMessage message = (STMessage)a.getAdapter().getItem(position); b.putObject("message",message); 我得到一个错误: The method putObject(String, Object) is undefined for the type

我正在尝试将自己的自定义对象传递到捆绑包中:

Bundle b = new Bundle();
                STMessage message = (STMessage)a.getAdapter().getItem(position);
                b.putObject("message",message);
我得到一个错误:

The method putObject(String, Object) is undefined for the type Bundle

一种方法是让自定义对象实现Parcelable接口并使用
Bundle.putParcelable/Bundle.getParcelable

使自定义对象可打包或序列化,然后使用putParcelable或putSerializable


根据对象的复杂性,一个或另一个可能更容易。

如Ryan所述。此外,如果只想在软杀伤中传递一个对象,请考虑使用OnRealDebug配置实例和GETLaSTunNo构化实例传递可序列化对象。整个对象树必须是可序列化的。如果您通过意图传递该对象,那么在架构稳定后,考虑将对象代码重构为可稍后处理的代码。最后,考虑在将对象存储到包中时使用类的完全限定名,如:

inPWState= (PasswordState) getIntent().getSerializableExtra("jalcomputing.confusetext.PasswordState");
希望有帮助。
日航

车型等级

package com.sam.bundleobjectpass;

import java.io.Serializable;

/**
 * Created by Samir on 31.8.2016.
 */
public class Model implements Serializable {
    private String name;
    private String surName;
    private int age;

    public Model(String name, String surName, int age) {
        this.name = name;
        this.surName = surName;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    
    public String getSurName() {
        return surName;
    }


    public int getAge() {
        return age;
    }


}
main活动

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        Model model = new Model("Sam", "Sami",32);
        
        Intent i = new Intent(MainActivity.this, ReceiverActivity.class);
        i.putExtra("Editing", model); // sending our object. In Kotlin is the same
        startActivity(i);

    }
}
public class ReceiverActivity extends Activity {

    TextView txt_name;
    TextView txt_surname;
    TextView txt_age;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second);

        txt_name = (TextView)findViewById(R.id.txt_name);
        txt_surname = (TextView)findViewById(R.id.txt_surname);
        txt_age = (TextView)findViewById(R.id.txt_age);
        // receiving our object
        Model model = (Model) getIntent().getSerializableExtra("Editing");

        txt_name.setText(model.getName());
        txt_surname.setText(model.getSurName());
        txt_age.setText(""+model.getAge());


    }
}
接管人活动

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        Model model = new Model("Sam", "Sami",32);
        
        Intent i = new Intent(MainActivity.this, ReceiverActivity.class);
        i.putExtra("Editing", model); // sending our object. In Kotlin is the same
        startActivity(i);

    }
}
public class ReceiverActivity extends Activity {

    TextView txt_name;
    TextView txt_surname;
    TextView txt_age;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second);

        txt_name = (TextView)findViewById(R.id.txt_name);
        txt_surname = (TextView)findViewById(R.id.txt_surname);
        txt_age = (TextView)findViewById(R.id.txt_age);
        // receiving our object
        Model model = (Model) getIntent().getSerializableExtra("Editing");

        txt_name.setText(model.getName());
        txt_surname.setText(model.getSurName());
        txt_age.setText(""+model.getAge());


    }
}
//科特林

val model: ProgramModel? = intent.getSerializableExtra("Editing") as ProgramModel?
        model?.let { // means if not null or empty
            txt_act_daily_topic.text = it.title
        }

由于使用
Parsable
是为一些评论中提到的高性能IPC传输而设计的,因此我尝试使用不同的方法

我的方法是使用谷歌的图书馆

范例

public class Person{
    private String name;
    private int age;
    // Getter and Setters omitted
}
您可以在实用程序类中有一个返回Gson实例的方法,这是为了干净的代码和组织。我将使用的情况下,有人什么来注册自定义适配器

public class Utils {
    private static Gson gson;
    
    private static Gson getGsonParser() {
        if(null == gson) {
            GsonBuilder builder = new GsonBuilder();
            gson = builder.create();
        }
        return gson;
    }
}
关键时刻

得到


目前我不知道这种方法的性能限制。但是它工作得很好

文档中指出,不应将Serializable用作go-to-parceling机制。因为它使用反射,所以对系统来说相当沉重。请看(查找WriteSeriable)我没有意识到这一点,谢谢您的更正。答案更新了,没问题!奇怪的是,文档在Bundle one中没有提到这个警告。我们还可以使用putSerializable,它将一个序列化对象放入Bundle中,使您的类可以使用serializable接口序列化。必须注意的是,这一点非常重要。Bundle不执行实际的包关联或序列化。
Parcel
类没有。无论何时外部系统决定(例如活动冷休闲、简单旋转的软休闲,可能根本不会发生关联)<代码>捆绑只缓存复杂对象。有一次我假设对象是扁平的,这个错误的假设导致了严重的泄漏,需要2天才能找到它们。这个问题是要使用bundle传递数据,而不是Intent。