android-intent - 意图如何将对象从一个安卓Activity到另一种模式?

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

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

时间:

如果你只是传递对象,那么 Parcelable 是为这个设计的。 使用本机序列化比使用java序列化需要更多的努力,但它的速度更快。

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


//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
 public int describeContents() {
 return 0;
 }

//write your object's data to the passed-in Parcel
 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方式) 中放置它们的顺序进行操作。

putExtra(), 一旦你的对象实现它,你只需 Parcelable 然后打入你意图 :


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

然后,你可以使用 getParcelableExtra() 。xml将它们撤回:


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

如果你的对象类实现了Parcelable并可以序列化,请确保你确实转换为以下类型之一:


i.putExtra((Parcelable) myParcelableObject);
i.putExtra((Serializable) myParcelableObject);

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

在这种情况下你从 (new Gson()).toJson(myObject); juse放置线的返回值和检索的字符串值并使用 fromJson,以将它的转换回到你的对象。

但是,如果你的对象不是很复杂,那么它可能不值得开销,你可以考虑传递对象的单独值,而不是。

你可以通过 Intent 发送可以序列化对象


//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 web ( hackbod - 一个谷歌Android软件工程师) 在此事件上的说明:

对于你知道活动在同一进程中运行的情况,你可以通过全局共享数据。 例如你可以拥有一个全局 HashMap<String, WeakReference<MyInterpreterState>> 在散列表的一起名字,它 receives,,当你犯了一个新MyInterpreterState想出为它定一个唯一的名称,就将它放入散列映射;发送这一状态到另一个 Activity,索性把唯一的名称放入该哈希映射表和第二个 Activity 启动时它可以检索存储在

如果你的对象类实现 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");

我希望它能帮助:

你可以使用android包进行这里操作。

从你的类创建一个包,比如:


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");
}

在自定义类中声明这里声明并使用。

感谢你的parcelable帮助,但我发现了一个可选的解决方案


 public class getsetclass implements Serializable {
 private int dt = 10;
//pass any object, drwabale 
 public int getDt() {
 return dt;
 }

 public void setDt(int dt) {
 this.dt = dt;
 }
 }

在 Activity 中之一


getsetclass d = new getsetclass ();
 d.setDt(50);
 LinkedHashMap<String, Object> obj = new LinkedHashMap<String, Object>();
 obj.put("hashmapkey", d);
 Intent inew = new Intent(SgParceLableSampelActivity.this,
 ActivityNext.class);
 Bundle b = new Bundle();
 b.putSerializable("bundleobj", obj);
 inew.putExtras(b);
 startActivity(inew);

在 Activity 2中获取数据


 try { setContentView(R.layout.main);
 Bundle bn = new Bundle();
 bn = getIntent().getExtras();
 HashMap<String, Object> getobj = new HashMap<String, Object>();
 getobj = (HashMap<String, Object>) bn.getSerializable("bundleobj");
 getsetclass d = (getsetclass) getobj.get("hashmapkey");
 } catch (Exception e) {
 Log.e("Err", e.getMessage());
 }

在你的第一个 Activity 中:


intent.putExtra("myTag", yourObject);

在你的第二个方面:


myCustomObject myObject = (myCustomObject) getIntent().getSerializableExtra("myTag");

不要忘记使自定义对象可以序列化:


public class myCustomObject implements Serializable {
...
}

我遇到同样的问题。 我使用静态类解决了它,将任何需要的数据存储在HashMap中。 在上面我使用了标准 Activity 类的扩展,在这里我重写了onDestroy的方法,以执行数据传输和数据清除。 某些荒谬的设置必须更改 比如 orientation-handling 。

注释:不提供一般的对象来传递给另一个 Activity,这很麻烦。 它就像在膝盖中弹,希望赢得 100米。 Parcable"不是一个足够的替代。 它让我发笑。我不想实现这个接口到我的technology-free API,因为我想引入一个新的层。。 为什么我们在远离现代范式的移动编程中。

...