在活动之间传递对象

时间:2017-06-29 13:36:45

标签: android android-activity

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

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

7 个答案:

答案 0 :(得分:4)

假设有一个名为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'

有一件事是将 StudentDataObject 实现为 Parcelable ,如果显示错误,则只需按 alt + Enter 并执行方法。 尝试一次,希望它能起作用。

StudentDataObject的示例示例应该是: -

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

答案 1 :(得分: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");

答案 2 :(得分:1)

这是我的对象类 Book.java

import android.os.Parcel;
import android.os.Parcelable;


public class Book implements Parcelable {
  // book basics
  private String title;
  private String author;

  // main constructor
  public Book(String title, String author) {
    this.title = title;
    this.author = author;
  }

  // getters
  public String getTitle() { return title; }
  public String getAuthor() { return author; }

  // write object values to parcel for storage
  public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(title);
    dest.writeString(author);
  }

  public Book(Parcel parcel) {
    title = parcel.readString();
    author = parcel.readString();
  }

  public static final Parcelable.Creator<Book> CREATOR = new Parcelable.Creator<Book>() {

    @Override
    public Book createFromParcel(Parcel parcel) {
      return new Book(parcel);
    }

    @Override
    public Book[] newArray(int size) {
      return new Book[0];
    }
  };

  public int describeContents() {
    return hashCode();
  }
}

现在您可以像这样传递对象

Button button = (Button) findViewById(R.id.submit_button);

    button.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {

        Book book = new Book(mBkTitle.getText().toString(),
                mBkAuthor.getText().toString());

        Intent intent = new Intent(MainActivity.this, BookActivity.class);
        intent.putExtra("Book", book);
        startActivity(intent);
      }
    });

现在将在接收 ReceivingActivity.java

时接收到这样的对象
Intent intent = getIntent();
    Book book = intent.getParcelableExtra("Book");

    mBkTitle.setText("Title:" + book.getTitle());
    mBkAuthor.setText("Author:" + book.getAuthor());

答案 3 :(得分: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

答案 4 :(得分:0)

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

请在此处阅读如何使您的对象具有可分辨性:https://developer.android.com/reference/android/os/Parcelable.html

在你不熟悉之后,传递你的对象:

intent.putExtra("KEY", your_object);

阅读它:

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

答案 5 :(得分:0)

扩展类并在继承的类中实现serializable或parcelable,并像在其他答案中一样使用其对象。

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

使用此类的对象而不是我的类

答案 6 :(得分:0)

您可以通过两种方式通过意图将自定义对象从一个活动传递到另一个活动。

  1. 通过实现可序列化
  2. 通过实现可拆分

(1)通过实现 Serializable ,无需执行任何操作即可实现 Serializable

public class Note implements Serializable {
  private int id;
  private String title;
}

(2)通过实现 Parcelable (您必须遵循Parcel的写入和读取顺序)

public class Note implements Parcelable {

private int id;
private String title;

public Note() {
}

Note(Parcel in){
    this.id = in.readInt();
    this.title = in.readString();
}

public void setId(int id) {
    this.id = id;
}

public int getId() {
    return id;
}

public void setTitle(String title) {
    this.title = title;
}


public String getTitle() {
    return title;
}

@Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeInt(id);
    dest.writeString(title);
}

public static final Parcelable.Creator<Note> CREATOR = new Parcelable.Creator<Note>(){

    @Override
    public Note createFromParcel(Parcel source) {
        return new Note(source);
    }

    @Override
    public Note[] newArray(int size) {
        return new Note[size];
    }
};
}

然后在您的活动中

活动A

intent.putExtra("NOTE", note);

活动B

Note note = (Note) getIntent().getExtras().get("NOTE");

Imp:可打包的速度比可序列化的速度快10倍