[android] 의도를 사용하여 한 Android 활동에서 다른 활동으로 객체를 보내는 방법은 무엇입니까?

Intent 클래스 의 메소드를 사용하여 한 활동 에서 다른 활동 으로 사용자 정의 유형의 객체를 전달하는 putExtra()방법은 무엇입니까?



답변

객체를 그냥지나 가면 Parcelable 이 이것을 위해 설계되었습니다. Java의 기본 직렬화를 사용하는 것보다 사용하는 데 약간의 노력이 필요하지만 더 빠릅니다 (즉, WAY가 빠릅니다).

문서에서 구현 방법에 대한 간단한 예는 다음과 같습니다.

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

    // write your object's data to the passed-in Parcel
    @Override
    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 방식으로)이 작업을 수행해야합니다.

당신이 당신의 객체를 일단 구현 Parcelable그냥 당신에 넣어의 문제 텐트putExtra () :

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

그런 다음 getParcelableExtra ()를 사용하여 다시 가져올 수 있습니다 .

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

객체 클래스가 Parcelable 및 Serializable을 구현하는 경우 다음 중 하나에 캐스트해야합니다.

i.putExtra("parcelable_extra", (Parcelable) myParcelableObject);
i.putExtra("serializable_extra", (Serializable) myParcelableObject);


답변

객체를 일종의 문자열 표현으로 직렬화해야합니다. 가능한 문자열 표현 중 하나는 JSON이며 Android에서 JSON으로 직렬화하는 가장 쉬운 방법 중 하나는 Google GSON 입니다.

이 경우 문자열 반환 값을 입력하고 문자열 값을 (new Gson()).toJson(myObject);검색 fromJson하여 객체로 다시 변환 하는 데 사용 합니다.

그러나 객체가 매우 복잡하지 않은 경우 오버 헤드의 가치가 없으므로 객체의 별도 값을 전달하는 것을 고려할 수 있습니다.


답변

의도를 통해 직렬화 가능한 객체를 보낼 수 있습니다

// 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 {
} 


답변

응용 프로그램 내에서 데이터를 전달할 경우 “전역”(정적 클래스와 같은)을 사용하십시오.

여기에 무엇 다이앤 Hackborn : 문제에 대해 말을했다 – (구글 안드로이드 소프트웨어 엔지니어 hackbod가)

활동이 동일한 프로세스에서 실행 중임을 알고있는 상황에서는 글로벌을 통해 데이터를 공유 할 수 있습니다. 예를 들어, 전역을 가질 HashMap<String, WeakReference<MyInterpreterState>>
수 있고 새로운 MyInterpreterState를 만들 때 고유 한 이름을 만들어 해시 맵에 넣을 수 있습니다. 해당 상태를 다른 활동으로 보내려면 단순히 고유 이름을 해시 맵에 넣고 두 번째 활동이 시작되면 수신 한 이름으로 해시 맵에서 MyInterpreterState를 검색 할 수 있습니다.


답변

클래스는 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");

나는 그것이 도움이되기를 바랍니다 : D


답변

빠른 요구에 대한 짧은 답변

1. 클래스를 직렬화 가능하게 구현하십시오.

내부 클래스가 있으면 Serializable에 구현하는 것을 잊지 마십시오!

public class SportsData implements  Serializable
public class Sport implements  Serializable

List<Sport> clickedObj;

2. 당신의 물건을 의도에 두십시오

 Intent intent = new Intent(SportsAct.this, SportSubAct.class);
            intent.putExtra("sport", clickedObj);
            startActivity(intent);

3. 다른 활동 클래스에서 물건을받습니다.

Intent intent = getIntent();
    Sport cust = (Sport) intent.getSerializableExtra("sport");


답변

객체 클래스가를 구현하는 경우 Serializable다른 작업을 수행 할 필요가 없으면 직렬화 가능한 객체를 전달할 수 있습니다.
그것이 내가 사용하는 것입니다.