[android] 의도를 사용하여 한 Android 활동에서 다른 활동으로 객체를 보내는 방법은 무엇입니까?
답변
객체를 그냥지나 가면 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
다른 작업을 수행 할 필요가 없으면 직렬화 가능한 객체를 전달할 수 있습니다.
그것이 내가 사용하는 것입니다.