Android에서 한 활동에서 다른 활동으로 오브젝트를 전달하려면 어떻게해야합니까? [복제]
이 질문에는 이미 답변이 있습니다.
앱 내 여러 활동에서 하나의 객체를 사용할 수 있어야하며 동일한 객체 여야 합니다. 가장 좋은 방법은 무엇입니까?
다른 활동에서 액세스 할 수 있도록 객체를 "정적 정적"으로 만들려고했지만 어떤 이유로 든 잘리지 않습니다. 다른 방법이 있습니까?
의도 한 객체를 생성 할 때 두 활동간에 객체를 전달하는 다음 두 가지 방법을 활용할 수 있습니다.
클래스가 Parcelable 또는 Serializable을 구현하도록 할 수 있습니다 . 그런 다음 여러 활동에서 사용자 정의 클래스를 전달할 수 있습니다. 나는 이것이 매우 유용하다는 것을 알았다.
다음은 사용중인 코드 스 니펫입니다.
CustomListing currentListing = new CustomListing();
Intent i = new Intent();
Bundle b = new Bundle();
b.putParcelable(Constants.CUSTOM_LISTING, currentListing);
i.putExtras(b);
i.setClass(this, SearchDetailsActivity.class);
startActivity(i);
그리고 새로 시작된 활동 코드는 다음과 같습니다.
Bundle b = this.getIntent().getExtras();
if (b != null)
mCurrentListing = b.getParcelable(Constants.CUSTOM_LISTING);
Application 의 서브 클래스를 작성하고 공유 오브젝트를 거기에 저장할 수 있습니다. 응용 프로그램 객체는 활성 구성 요소가있는 한 앱 수명 동안 존재해야합니다.
활동에서을 통해 애플리케이션 오브젝트에 액세스 할 수 있습니다 getApplication()
.
이 답변은 전달할 객체에 중첩 된 클래스 구조가있는 상황에만 해당됩니다. 중첩 클래스 구조를 사용하면 Parcelable 또는 Serializeable로 만드는 것이 약간 지루합니다. 또한 객체를 직렬화하는 프로세스는 Android에서 효율적이지 않습니다 . 아래 예를 고려하십시오.
class Myclass {
int a;
class SubClass {
int b;
}
}
Google의 GSON 라이브러리 를 사용하면 객체를 JSON 형식 문자열로 직접 구문 분석하고 사용 후 객체 형식으로 다시 변환 할 수 있습니다. 예를 들어
MyClass src = new MyClass();
Gson gS = new Gson();
String target = gS.toJson(src); // Converts the object to a JSON String
이제 액티비티 인 텐트가있는 액티비티를 통해이 String을 StringExtra로 전달할 수 있습니다.
Intent i = new Intent(FromActivity.this, ToActivity.class);
i.putExtra("MyObjectAsString", target);
그런 다음 수신 액티비티에서 문자열 표현으로부터 원래 객체를 생성합니다.
String target = getIntent().getStringExtra("MyObjectAsString");
MyClass src = gS.fromJson(target, MyClass.class); // Converts the JSON String to an Object
원래 클래스를 깨끗하고 재사용 가능하게 유지합니다. 무엇보다 이러한 클래스 객체가 웹에서 JSON 객체로 생성되면이 솔루션은 매우 효율적이고 시간을 절약 할 수 있습니다.
최신 정보
위에서 설명한 방법은 대부분의 상황에서 작동하지만 명백한 성능상의 이유로 객체를 전달하기 위해 Android의 번들 추가 시스템에 의존하지 마십시오. 이 프로세스를 유연하고 효율적으로 만드는 여러 가지 솔루션이 있습니다. 여기 몇 가지가 있습니다. 각각의 장단점이 있습니다.
어쩌면 그것은 인기가 없을 수도 있지만 과거에는 활동을 통해 유지하려는 객체에 대한 정적 참조가있는 클래스를 사용했습니다. 그래서,
public class PersonHelper
{
public static Person person;
}
Parcelable 인터페이스 경로를 시도했지만 많은 문제가 발생하여 코드의 오버 헤드가 호소력이 없었습니다.
It depends on the type of data you need access to. If you have some kind of data pool that needs to persist across Activity
s then Erich's answer is the way to go. If you just need to pass a few objects from one activity to another then you can have them implement Serializable
and pass them in the extras of the Intent
to start the new Activity
.
Your object can also implement the Parcelable interface. Then you can use the Bundle.putParcelable()
method and pass your object between activities within intent.
The Photostream application uses this approach and may be used as a reference.
'programing tip' 카테고리의 다른 글
숨겨둔 내용으로 패치를 포맷하는 방법 (0) | 2020.07.11 |
---|---|
세션 도용을 방지하는 가장 좋은 방법은 무엇입니까? (0) | 2020.07.11 |
선택된 열만 읽습니다. (0) | 2020.07.11 |
HTML 양식 : 선택 옵션과 데이터 목록 옵션 (0) | 2020.07.11 |
git을 Xcode와 통합 할 수 있습니까? (0) | 2020.07.11 |