如何使用意图将对象从一个 Android 活动发送到另一个?

如何使用Intent类的putExtra()方法将自定义类型的对象从一个Activity传递到另一个Activity

答案

如果您只是传递对象,那么Parcelable就是为此而设计的。与使用 Java 的本机序列化相比,它需要付出更多的努力,但是它的速度更快(我的意思是, WAY更快)。

在文档中,有关如何实现的一个简单示例是:

// simple class that just has one member property as an example
public class MyParcelable implements Parcelable {
    private int mData;

    /* everything below here is for implementing Parcelable */

    // 99.9% of the time you can just ignore this
    @Override
    public int describeContents() {
        return 0;
    }

    // write your object's data to the passed-in Parcel
    @Override
    public void writeToParcel(Parcel out, int flags) {
        out.writeInt(mData);
    }

    // this is used to regenerate your object. All Parcelables must have a CREATOR that implements these two methods
    public static final Parcelable.Creator<MyParcelable> CREATOR = new Parcelable.Creator<MyParcelable>() {
        public MyParcelable createFromParcel(Parcel in) {
            return new MyParcelable(in);
        }

        public MyParcelable[] newArray(int size) {
            return new MyParcelable[size];
        }
    };

    // example constructor that takes a Parcel and gives you an object populated with it's values
    private MyParcelable(Parcel in) {
        mData = in.readInt();
    }
}

请注意,如果要从给定的宗地中检索多个字段,则必须按照将其放入的相同顺序进行操作(即,采用 FIFO 方法)。

一旦你有你的对象实现Parcelable它只是将它们放在你的事意图putExtra() :

Intent i = new Intent();
i.putExtra("name_of_extra", myParcelableObject);

然后,您可以使用getParcelableExtra()将它们拉出:

Intent i = getIntent();
MyParcelable myParcelableObject = (MyParcelable) i.getParcelableExtra("name_of_extra");

如果您的对象类实现了 Parcelable 和 Serializable,则请确保将其强制转换为以下之一:

i.putExtra("parcelable_extra", (Parcelable) myParcelableObject);
i.putExtra("serializable_extra", (Serializable) myParcelableObject);

您需要将您的对象序列化为某种字符串表示形式。一种可能的字符串表示形式是 JSON,如果您问我的话,在 Android 中从 JSON 序列化 / 序列化的最简单方法之一是通过Google GSON

在这种情况下,您只需将字符串返回值从(new Gson()).toJson(myObject);并检索字符串值,然后使用fromJson将其转换回您的对象。

但是,如果您的对象不是很复杂,则可能不值得承担开销,您可以考虑传递该对象的单独值。

您可以通过意图发送可序列化的对象

// send where details is object
ClassName details = new ClassName();
Intent i = new Intent(context, EditActivity.class);
i.putExtra("Editing", details);
startActivity(i);


//receive
ClassName model = (ClassName) getIntent().getSerializableExtra("Editing");

And 

Class ClassName implements Serializable {
}

对于您知道将在应用程序内传递数据的情况,请使用 “全局变量”(例如静态类)

Dianne Hackborn(hackbod-Google Android 软件工程师)在此问题上必须说的:

对于您知道活动在同一流程中运行的情况,您可以只通过全局变量共享数据。例如,您可能有一个全局HashMap<String, WeakReference<MyInterpreterState>> ,当您创建一个新的 MyInterpreterState 时,会为其命名一个唯一的名称并将其放入哈希映射中。要将状态发送到另一个活动,只需将唯一名称放入哈希图中,当第二个活动启动时,它可以使用接收到的名称从哈希图中检索 MyInterpreterState。

您的类应实现 Serializable 或 Parcelable。

public class MY_CLASS implements Serializable

完成后,您可以在 putExtra 上发送对象

intent.putExtra("KEY", MY_CLASS_instance);

startActivity(intent);

要获得额外费用,您只需要做

Intent intent = getIntent();
MY_CLASS class = (MY_CLASS) intent.getExtras().getSerializable("KEY");

如果您的班级实施了 Parcelable 使用

MY_CLASS class = (MY_CLASS) intent.getExtras().getParcelable("KEY");

希望对您有所帮助:D

快速需求的简短答案

1. 将您的类实现为可序列化。

如果您有任何内部类,也不要忘记将它们实现为 Serializable!

public class SportsData implements  Serializable
public class Sport implements  Serializable

List<Sport> clickedObj;

2. 将您的对象放入 Intent

Intent intent = new Intent(SportsAct.this, SportSubAct.class);
            intent.putExtra("sport", clickedObj);
            startActivity(intent);

3. 并在另一个活动类中接收您的对象

Intent intent = getIntent();
    Sport cust = (Sport) intent.getSerializableExtra("sport");

如果您的对象类实现了Serializable ,则您无需执行其他任何操作,就可以传递可序列化的对象。
那就是我用的。

在您的课程中实现可序列化

public class Place implements Serializable{
        private int id;
        private String name;

        public void setId(int id) {
           this.id = id;
        }
        public int getId() {
           return id;
        }
        public String getName() {
           return name;
        }

        public void setName(String name) {
           this.name = name;
        }
}

然后,您可以按意图传递此对象

Intent intent = new Intent(this, SecondAct.class);
     intent.putExtra("PLACE", Place);
     startActivity(intent);

在第二个活动中,您可以获得这样的数据

Place place= (Place) getIntent().getSerializableExtra("PLACE");

但是当数据变大时,此方法将很慢。

您可以使用 android BUNDLE 来做到这一点。

从您的班级创建一个捆绑包,例如:

public Bundle toBundle() {
    Bundle b = new Bundle();
    b.putString("SomeKey", "SomeValue");

    return b;
}

然后将这个包与 INTENT 一起传递。现在,您可以通过传递如下束来重新创建类对象

public CustomClass(Context _context, Bundle b) {
    context = _context;
    classMember = b.getString("SomeKey");
}

在您的 Custom 类中声明并使用。

您可以通过几种方法访问其他类或 Activity 中的变量或对象。

A. 数据库

B. 共享首选项。

C. 对象序列化。

D. 可以保存公共数据的类可以命名为 Common Utilities,它取决于您。

E. 通过意图和可打包接口传递数据。

这取决于您的项目需求。

A. 数据库

SQLite 是一个嵌入到 Android 中的开源数据库。 SQLite 支持标准的关系数据库功能,例如 SQL 语法,事务和准备好的语句。

教程 - http: //www.vogella.com/articles/AndroidSQLite/article.html

B. 共享首选项

假设您要存储用户名。因此,现在将有两件事: 关键用户名, 值。

如何储存

// Create object of SharedPreferences.
 SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
 //now get Editor
 SharedPreferences.Editor editor = sharedPref.edit();
 //put your value
 editor.putString("userName", "stackoverlow");

 //commits your edits
 editor.commit();

使用 putString(),putBoolean(),putInt(),putFloat(),putLong()可以保存所需的 dtatype。

如何取得

SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
String userName = sharedPref.getString("userName", "Not Available");

http://developer.android.com/reference/android/content/SharedPreferences.html

C. 对象序列化

如果我们要保存对象状态以通过网络发送它,或者也可以将其用于您的目的,则使用对象序列化。

使用 Java Bean 并将其存储在他的字段中,并为此使用 getter 和 setter

JavaBean 是具有属性的 Java 类。将属性视为私有实例变量。由于它们是私有的,因此可以从类外部访问它们的唯一方法是通过类中的方法。更改属性值的方法称为 setter 方法,而检索属性值的方法称为 getter 方法。

public class VariableStorage implements Serializable  {

    private String inString ;

    public String getInString() {
        return inString;
    }

    public void setInString(String inString) {
        this.inString = inString;
    }


}

使用以下命令在您的邮件方法中设置变量

VariableStorage variableStorage = new VariableStorage();
variableStorage.setInString(inString);

然后使用对象 Serialzation 序列化此对象,并在其他类中反序列化此对象。

在序列化中,对象可以表示为字节序列,其中包括对象的数据以及有关对象类型和对象中存储的数据类型的信息。

将序列化的对象写入文件后,可以从文件中读取并反序列化它,即表示对象及其数据的类型信息和字节可用于在内存中重新创建对象。

如果您要使用此教程,请参考此链接

http://javawithswaranga.blogspot.in/2011/08/serialization-in-java.html

获取其他类中的变量

D. 公用事业

您可以自己创建一个类,其中可以包含项目中经常需要的通用数据。

样品

public class CommonUtilities {

    public static String className = "CommonUtilities";

}

E. 通过意图传递数据

请参阅本教程以了解此传递数据的选项。

http://shri.blog.kraya.co.uk/2010/04/26/android-parcel-data-to-pass-between-activities-using-parcelable-classes/