我需要通过一个bundle传递对负责大部分处理的类的引用。
问题在于它与意图或上下文无关,并且具有大量非原始对象。如何将类打包成parcelable/serializable并将其传递给startActivityForResult
?
我需要通过一个bundle传递对负责大部分处理的类的引用。
问题在于它与意图或上下文无关,并且具有大量非原始对象。如何将类打包成parcelable/serializable并将其传递给startActivityForResult
?
你还可以使用Gson将对象转换为JSONObject并在bundle中传递。对我来说,这是我发现的最优雅的方法。我没有测试它对性能的影响。
在初始活动中
Intent activity = new Intent(MyActivity.this,NextActivity.class);
activity.putExtra("myObject", new Gson().toJson(myobject));
startActivity(activity);
在下一个活动中
String jsonMyObject;
Bundle extras = getIntent().getExtras();
if (extras != null) {
jsonMyObject = extras.getString("myObject");
}
MyObject myObject = new Gson().fromJson(jsonMyObject, MyObject.class);
弄清楚该走哪条路不仅需要回答CommonsWare的关键问题“为什么”,还需要回答“要到哪里去?”的问题。
现实情况是,唯一可以通过包传输的是纯净数据——其他所有内容都基于对那些数据意义或指向的解释。你不能直接传递一个对象,但你可以做以下三件事之一:
1) 你可以将对象拆分为其组成数据,并且如果另一端具有相同类型对象的知识,则可以从序列化数据中组装出克隆体。这就是大多数常见类型通过包传递的方式。
2) 您可以传递一个不透明的句柄。如果您在相同的上下文中传递它(虽然可能会问为什么要这样做),那么它将是一个可以调用或引用的句柄。但是,如果您通过Binder将其传递到不同的上下文中,则它的字面值将是一个任意数字(实际上,这些任意数字从启动开始按顺序计数)。除了跟踪它之外,您什么也不能做,直到将其传回原始上下文,这将使Binder将其转换回原始句柄,使其再次有用。
3) 您可以传递一个魔法句柄,例如文件描述符或对某些操作系统/平台对象的引用,如果您设置了正确的标志,则Binder将为接收者创建指向相同资源的克隆体,实际上可以在另一端使用它。但是,这仅适用于非常少量的对象类型。
最有可能的情况是,您要么只是将类传递给另一端以便稍后返回给您,要么将其传递到可以从序列化组成数据中创建克隆体的上下文中……否则,您正在尝试做一些根本行不通的事情,需要重新考虑整个方法。
您还可以将对象序列化,并使用Bundle的getSerializable和putSerializable方法。
更新:
自定义然后将其添加到AndroidManifest.xml中:
<application android:label="@string/app_name" android:debuggable="true" android:name=".CustomApplication"
然后在你的项目中有一个类,像这样:
package com.example;
import android.app.Application;
public class CustomApplication extends Application {
public int someVariable = -1;
}
并且由于“它可以通过从任何Activity或Service中的getApplication()方法访问”,所以您可以像这样使用它:
CustomApplication application = (CustomApplication)getApplication();
application.someVariable = 123;
希望这能有所帮助。可能的解决方案:
Bundle bundle = new Bundle();
bundle.putSerializable("key", new CustomObject());
自定义对象类 CustomObject:
class CustomObject implements Serializable{
private SubCustomObject1 sc1;
private SubCustomObject2 sc2;
}
子自定义对象:
class SubCustomObject1 implements Serializable{ }
class SubCustomObject2 implements Serializable{ }
通过使用 bundle.putByteArray
,还有一种将对象通过 bundle 发送的方法。
public class DataBean implements Serializable {
private Date currentTime;
public setDate() {
currentTime = Calendar.getInstance().getTime();
}
public Date getCurrentTime() {
return currentTime;
}
}
class FirstClass{
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//Your code...
//When you want to start new Activity...
Intent dataIntent =new Intent(FirstClass.this, SecondClass.class);
Bundle dataBundle=new Bundle();
DataBean dataObj=new DataBean();
dataObj.setDate();
try {
dataBundle.putByteArray("Obj_byte_array", object2Bytes(dataObj));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
dataIntent.putExtras(dataBundle);
startActivity(dataIntent);
}
将对象转换为字节数组
/**
* Converting objects to byte arrays
*/
static public byte[] object2Bytes( Object o ) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream( baos );
oos.writeObject( o );
return baos.toByteArray();
}
class SecondClass{
DataBean dataBean;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//Your code...
//Get Info from Bundle...
Bundle infoBundle=getIntent().getExtras();
try {
dataBean = (DataBean)bytes2Object(infoBundle.getByteArray("Obj_byte_array"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
从字节数组中获取对象的方法:
/**
* Converting byte arrays to objects
*/
static public Object bytes2Object( byte raw[] )
throws IOException, ClassNotFoundException {
ByteArrayInputStream bais = new ByteArrayInputStream( raw );
ObjectInputStream ois = new ObjectInputStream( bais );
Object o = ois.readObject();
return o;
}
1.一个非常直接且易于使用的例子,使对象实现Serializable接口以便进行传递。
class Object implements Serializable{
String firstName;
String lastName;
}
2.在bundle中传递对象
Bundle bundle = new Bundle();
Object Object = new Object();
bundle.putSerializable("object", object);
3. 从Bundle中作为Serializable传递的对象,然后将其转换为Object。
Object object = (Object) getArguments().getSerializable("object");
使用Bundle传递对象的另一种简单方法: