Как отправить объект из одной операции Android в другую, используя Intents? - PullRequest
810 голосов
/ 26 января 2010

Как я могу передать объект пользовательского типа из одного Activity в другой, используя метод putExtra() класса Intent ?

Ответы [ 35 ]

3 голосов
/ 07 сентября 2016

Используя библиотеку Google Gson, вы можете передавать объект другим действиям. Фактически мы преобразуем объект в виде строки json, а после перехода к другому действию мы снова преобразуем его в объект, подобный этому

Рассмотрим класс бинов, подобный этому

 public class Example {
    private int id;
    private String name;

    public Example(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public int getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

Нам нужно передать объект класса Example

Example exampleObject=new Example(1,"hello");
String jsonString = new Gson().toJson(exampleObject);
Intent nextIntent=new Intent(this,NextActivity.class);
nextIntent.putExtra("example",jsonString );
startActivity(nextIntent);

Для чтения нам нужно выполнить обратную операцию в NextActivity

 Example defObject=new Example(-1,null);
    //default value to return when example is not available
    String defValue= new Gson().toJson(defObject);
    String jsonString=getIntent().getExtras().getString("example",defValue);
    //passed example object
    Example exampleObject=new Gson().fromJson(jsonString,Example .class);

Добавить эту зависимость в gradle

compile 'com.google.code.gson:gson:2.6.2'
3 голосов
/ 13 августа 2016

Я знаю, что уже поздно, но это очень просто. Все, что вам нужно сделать, это позволить вашему классу реализовать Serializable, как

public class MyClass implements Serializable{

}

тогда вы можете перейти к намерению, как

Intent intent=......
MyClass obje=new MyClass();
intent.putExtra("someStringHere",obje);

Чтобы получить его, просто позвоните

MyClass objec=(MyClass)intent.getExtra("theString");
3 голосов
/ 16 декабря 2013
Intent i = new Intent();
i.putExtra("name_of_extra", myParcelableObject);
startACtivity(i);
2 голосов
/ 23 июня 2017

Запустить другое действие с помощью параметров передачи этого действия через Bundle Object

Intent intent = new Intent(getBaseContext(), YourActivity.class);
intent.putExtra("USER_NAME", "xyz@gmail.com");
startActivity(intent);

Получить другой вид деятельности (YourActivity)

String s = getIntent().getStringExtra("USER_NAME");

Это нормально для простого типа данных. Но если вы хотите передать сложные данные между действиями, вам нужно сначала сериализовать их.

Здесь у нас есть Модель сотрудника

class Employee{
    private String empId;
    private int age;
    print Double salary;

    getters...
    setters...
}

Вы можете использовать Gson lib, предоставленный Google, для сериализации сложных данных. как это

String strEmp = new Gson().toJson(emp);
Intent intent = new Intent(getBaseContext(), YourActivity.class);
intent.putExtra("EMP", strEmp);
startActivity(intent);

Bundle bundle = getIntent().getExtras();
    String empStr = bundle.getString("EMP");
            Gson gson = new Gson();
            Type type = new TypeToken<Employee>() {
            }.getType();
            Employee selectedEmp = gson.fromJson(empStr, type);
2 голосов
/ 24 июня 2010

Самое простое было бы просто использовать следующее, где элемент является строкой:

intent.putextra("selected_item",item)

Для получения:

String name = data.getStringExtra("selected_item");
2 голосов
/ 08 октября 2015

На сегодняшний день самый простой способ ИМХО для посылки объектов. Вы просто добавляете тег аннотации над объектом, который хотите сделать пригодным для продажи.

Пример из библиотеки ниже https://github.com/johncarl81/parceler

@Parcel
public class Example {
    String name;
    int age;

    public Example(){ /*Required empty bean constructor*/ }

    public Example(int age, String name) {
        this.age = age;
        this.name = name;
    }

    public String getName() { return name; }

    public int getAge() { return age; }
}
2 голосов
/ 24 июня 2015

Если у вас есть одноэлементный класс (fx Service), выступающий в качестве шлюза на уровне вашей модели в любом случае, это можно решить, если иметь переменную этого класса с методами получения и установки для него.

В занятии 1:

Intent intent = new Intent(getApplicationContext(), Activity2.class);
service.setSavedOrder(order);
startActivity(intent);

В занятии 2:

private Service service;
private Order order;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_quality);

    service = Service.getInstance();
    order = service.getSavedOrder();
    service.setSavedOrder(null) //If you don't want to save it for the entire session of the app.
}

В службе:

private static Service instance;

private Service()
{
    //Constructor content
}

public static Service getInstance()
{
    if(instance == null)
    {
        instance = new Service();
    }
    return instance;
}
private Order savedOrder;

public Order getSavedOrder()
{
    return savedOrder;
}

public void setSavedOrder(Order order)
{
    this.savedOrder = order;
}

Это решение не требует какой-либо сериализации или другой "упаковки" рассматриваемого объекта. Но это будет выгодно только в том случае, если вы все равно используете эту архитектуру.

2 голосов
/ 19 ноября 2016

Первый инструмент Parcelable в вашем классе. Затем передайте объект следующим образом.

SendActivity.java

ObjectA obj = new ObjectA();

// Set values etc.

Intent i = new Intent(this, MyActivity.class);
i.putExtra("com.package.ObjectA", obj);

startActivity(i);

ReceiveActivity.java

Bundle b = getIntent().getExtras();
ObjectA obj = b.getParcelable("com.package.ObjectA");

Строка пакета не обязательна, просто строка должна быть одинаковой в обеих операциях

ССЫЛКА

1 голос
/ 02 ноября 2014

Если вы не очень заинтересованы в использовании функции putExtra и просто хотите запустить другое действие с объектами, вы можете воспользоваться библиотекой GNLauncher (https://github.com/noxiouswinter/gnlib_android/wiki#gnlauncher), которую я написал, чтобы сделать этот процесс более понятным .

GNLauncher упрощает отправку объектов / данных в Activity из другого Activity и т. Д., Так же как вызов функции в Activity с необходимыми данными в качестве параметров. Он вводит безопасность типов и устраняет все трудности, связанные с сериализацией, присоединением к цели с использованием строковых ключей и отменой того же на другом конце.

0 голосов
/ 03 июля 2019

Самый простой и Java-способ сделать это: реализовать сериализуемость в вашем классе pojo / model

Рекомендовано для Android для просмотра производительности: сделать модель пригодной для продажи

...