object - Android如何将对象从一个activity到另一个activity

  显示原文与译文双语对照的内容

我想我的工作发送对象客户类从一个在另一个 ActivityActivity 和显示。

客户类的代码:


public class Customer {

 private String firstName, lastName, Address;
 int Age;

 public Customer(String fname, String lname, int age, String address) {

 firstName = fname;
 lastName = lname;
 Age = age;
 Address = address;

 }

 public String printValues() {

 String data = null;

 data ="First Name :" + firstName +" Last Name :" + lastName
 +" Age :" + Age +" Address :" + Address;

 return data;

 }

}

我想将它的对象从一个 Activity 发送到另一个,然后在另一个 Activity 上显示数据。

我如何才能达到?

时间:

使用具有静态字段的类:


public class Globals {
 public static Customer customer = new Customer();
}

在你可以使用的活动中:

Activity 来自:


Globals.customer = myCustomerFromActivity;

Activity 目标:


myCustomerTo = Globals.customer;

为活动传递信息是一种简单的方式。

一个选项可以让你自定义类实现 Serializable 接口,然后你可以通过对象实例 Intent 额外使用 putExtra(Serializable..)Intent#putExtra() 方法的变体。

伪代码:


//to pass :
 intent.putExtra("MyClass", obj); 

//to retrieve object in second Activity
getIntent().getSerializableExtra("MyClass");

使用可以序列化实现类。 假设这是你的实体类:


import java.io.Serializable;

@SuppressWarnings("serial")//with this annotation we are going to hide compiler warning
public class Deneme implements Serializable {

public Deneme(double id, String name){
 this.id = id;
 this.name = name;
}

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

private double id;
private String name;

}

我们正在将名为dene的对象从X Activity 发送到Y Activity 。 在 Activity的某处;


Deneme dene = new Deneme(4,"Mustafa");
Intent i = new Intent(this, Y.class);
i.putExtra("sampleObject", dene);
startActivity(i);

在 Activity 中我们得到了对象。


Intent i = getIntent();
Deneme dene = (Deneme)i.getSerializableExtra("sampleObject");

完成。

使用全局静态变量不是好的软件工程专家实践。字段的对象转换成原始数据类型可以繁忙的工作。 使用可以序列化可以序列化,但它在android平台上不是性能高效的Parcelable是专门为androidand设计你应该使用它。 下面是简单的示例 ,在活动 #android web之间传递自定义对象

调用 Activity 时


Intent intent = new Intent(fromClass.this,toClass.class).putExtra("myCustomerObj",customerObj);

在 toClass.java 中,按接收 Activity


Customer customerObjInToClass = getIntent().getExtras().getParcelable("myCustomerObj");

确保客户类实现 parcelable


public class Customer implements Parcelable {

 private String firstName, lastName, Address;
 int Age;

/* all your getter and setter methods */

 public Customer(Parcel in ) {
 readFromParcel( in );
 }

 public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
 public LeadData createFromParcel(Parcel in ) {
 return new Customer( in );
 }

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


 @Override
 public void writeToParcel(Parcel dest, int flags) {

 dest.writeString(firstName);
 dest.writeString(lastName);
 dest.writeString(Address);
 dest.writeInt(Age);
 }

 private void readFromParcel(Parcel in ) {

 firstName = in. readString();
 lastName = in. readString();
 Address = in. readString();
 Age = in. readInt();
 }

你还可以将对象的数据写入临时字符串和 int,并将它们传递给 Activity 。 当然,你会得到数据传输,但不是对象本身。 但是如果你只是想显示它们,而不是使用其他方法或者类似的对象,那么应该足够了。 我做了同样的事情,只是在另一个 Activity 中显示数据。


String fName_temp = yourObject.getFname();
String lName_temp = yourObject.getLname();
String age_temp = yourObject.getAge();
String address_temp = yourObject.getAddress();

Intent i = new Intent(this, ToClass.class);
 i.putExtra("fname", fName_temp);
 i.putExtra("lname", lName_temp);
 i.putExtra("age", age_temp);
 i.putExtra("address", address_temp);
startActivity(i); 

你也可以直接通过他们而不是临时的实例变量,但是这种方法是清晰的,在我看来。 另外,你可以将temp参数设置为 null,这样它们就会被GarbageCollector清除。

祝你好运

注意:替代 toString() 而不是编写自己的打印方法。

编辑:

就像下面的评论中提到的,这是你如何在其他 Activity 中获取数据的方法:


String fName = getIntent().getExtras().getInt("fname");

根据我的经验,有 3个主要解决方案,每种解决方案都有各自的缺点和优点:

  1. 实现 Parcelable

  2. 实现可以序列化

  3. 使用某种轻型事件总线库( 例如。 EventBus的greenrobot或者正方形的Otto )

Parcelable——快,android标准但有许多样板代码,需要hard-coded字符串当拉值供参考 Intent ( non-strongly类型) 。

Serializable——接近于零样板但是是最慢的方法,还需要hard-coded字符串当拉值 Intent ( non-strongly类型) 。

事件总线——零样板最快的方法,不需要hard-coded字符串,但确实需要额外的依赖(虽然通常是轻量级, ~40Kb)

我对这三种方法进行了非常详细的比较,包括效率基准。 如果你感兴趣,你可以在这里找到它: 在Android活动之间传递对象

我创建了一个包含临时对象的单一 helper 类。


public class IntentHelper {

 private static IntentHelper _instance;
 private Hashtable<String, Object> _hash;

 private IntentHelper() {
 _hash = new Hashtable<String, Object>();
 }

 private static IntentHelper getInstance() {
 if(_instance==null) {
 _instance = new IntentHelper();
 }
 return _instance;
 }

 public static void addObjectForKey(Object object, String key) {
 getInstance()._hash.put(key, object);
 }

 public static Object getObjectForKey(String key) {
 IntentHelper helper = getInstance();
 Object data = helper._hash.get(key);
 helper._hash.remove(key);
 helper = null;
 return data;
 }
}

不要将对象放入 Intent 中,而是使用 IntentHelper:


IntentHelper.addObjectForKey(obj,"key");

在你的新 Activity 中,你可以获取对象:


Object obj = (Object) IntentHelper.getObjectForKey("key");

请记住,一旦加载,对象被删除以避免不必要的引用。

最好的方法是在应用程序中拥有一个 class(call it Control),它将保存'客户'类型的静态变量( 在你的案例中) 。 初始化 Activity 中的变量。 Control.Customer = CustomerClass; 然后转到 Activity 并从控制类获取它。 不要忘记在使用变量后分配空,否则内存将被浪费。

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

A 。数据库

B 。共享首选项。

C 。对象序列化。

可以保存公共数据的类可以命名为公共实用程序,它依赖于你自己。

通过意图和Parcelable接口传递数据。

这取决于你的项目需求。

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

对象序列化对象

如果我们想保存对象状态以通过网络发送对象状态,或者你也可以使用它,也可以使用对象 serlization 。

使用javabean并将它的存储为一个字段,并使用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。CommonUtilities

你可以自己制作一个类,它可以包含你在项目中经常需要的常用数据。

磅样本


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/

...