2017-06-29 276 views
0

我开发了一个由多个活动组成的Android应用程序,我必须在它们之间传递ab对象,但是我无法通过使用意图来传递它,因为对象的类没有实现可序列化,我该怎么做? 我不能修改我的课 谢谢:)的源代码在活动之间传递对象

public class MyClass { //stuff } 
//I can't modify this source code 
MyClass m = new MyClass(); //object I have to pass 
+0

类的使用对象究竟是此对象吗?它的Java类是什么? – CommonsWare

+1

它是一个MongoDBAndroidDriver类 –

+3

我的猜测是它应该是一个单例,直接或通过某种包装。所以,你没有把它传递出去,但所有的东西都可以引用它。无论如何,你没有办法在活动之间传递它,所以它不是要成为一个单身人士,就是你将不得不坚持一项活动(例如,使用多个片段)。 – CommonsWare

回答

3

假设有一个名为StudentDataObject有一些数据类型的数据对象类。

StudentDataObject studentDataObject = new StudentDataObject(); 
Gson gson = new Gson(); 
String studentDataObjectAsAString = gson.toJson(studentDataObject); 

现在我们使用intent将它从一个活动传递给另一个活动。

Intent intent = new Intent(FromActivity.this, ToActivity.class); 
intent.putExtra("MyStudentObjectAsString", studentDataObjectAsAString); 
startActivity(intent); 

现在我们处于新的活动中,我们在这里使用下面一行来获取该对象。

Gson gson = new Gson(); 
String studentDataObjectAsAString = getIntent().getStringExtra("MyStudentObjectAsString"); 
StudentDataObject studentDataObject = gson.fromJson(studentDataObjectAsAString, StudentDataObject.class); 

活动本身知道从哪里我叫的,所以我们可以直接写getIntent()方法。

在这里我们只需要添加一个依赖GSON我们可以使用下面一行添加它的build.gradle文件。

compile 'com.google.code.gson:gson:2.6.2' 

还有一件事是实现StudentDataObjectParcelable如果显示错误,则只需按ALT + ENTER和实现方法。 尝试一次,希望它能工作。

为StudentDataObject样本实施例应该是这样的: -

public class StudentDataObject implements Parcelable { 
     // fields 
     //empty constructor 
     //parameterised constructor 
     //getters and setters 
     //toString method 
     //last implement some Parcelable methods 
     } 
+0

谢谢,这就是我要做的 –

+0

@GCM欢迎,如果您对上述示例有疑问,请告诉我 –

0

此代码可以帮助你:

public class EN implements Serializable { 
//... you don't need implement any methods when you implements Serializable 
} 

FirstActivity

EN enumb = new EN(); 
Intent intent = new Intent(getActivity(), NewActivity.class); 
intent.putExtra("en", enumb); //second param is Serializable 
startActivity(intent); 

SecandActivity

Bundle extras = getIntent().getExtras(); 
if (extras != null) { 
en = (EN)getIntent().getSerializableExtra("en"); //Obtaining data 
} 

Passing data through intent using Serializable

+1

我的类无法实现可串行化,它是一个编译类,我无法修改源代码 –

+0

在您的类中实现Serializable –

+0

//当您实现可序列化时,您不需要实现任何方法 –

0

您需要实现parcelable,然后通过intent传递它。不要使用Serializable原因比parcelable慢。

这里了解如何让你的对象parcelable:https://developer.android.com/reference/android/os/Parcelable.html

你不来以后,通过你的对象是这样的:

intent.putExtra("KEY", your_object); 

来阅读:

getIntent().getExtras().getParcelable("KEY"); 
+0

我不能修改我的类的源代码,所以我不能实现Parcelable –

+0

如果你不能这样做,那么这是不可能的。如果你想要的话,你可以通过设置旧对象的值来创建一个新的可以对象,就像现有对象的克隆一样,或者只传递重要的部分,比如id,name,description等。 –

2

首先创建Parcelable数据模型。

public class DataModel implements Parcelable { 
private int mData; 

public int describeContents() { 
    return 0; 
} 

public void writeToParcel(Parcel out, int flags) { 
    out.writeInt(mData); 
} 

public static final Parcelable.Creator<DataModel> CREATOR 
     = new Parcelable.Creator<DataModel>() { 
    public DataModel createFromParcel(Parcel in) { 
     return new DataModel(in); 
    } 

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

private DataModel(Parcel in) { 
    mData = in.readInt(); 
} 

}

投放对象为目的

intent.putExtra("KEY", object); 

获取对象从意图

object = getIntent().getExtras().getParcelable("KEY"); 
+0

DataModel是我必须通过的对象的类吗? –

0

扩展类并实现在继承的类序列化或parcelable和使用它的对象在其他的答案。

Class NewClass extends MyClass implements serializable { 
//Create a constructor matching super 
} 

这个类,而不是我的