여기에 이것을 달성하는 가장 일반적인 방법 의 편집 :
- 의도 내에서 데이터 보내기
- 정적 필드
- 해시지도
WeakReferences
- 객체 유지 (sqlite, 공유 환경 설정, 파일 등)
TL; DR : 데이터를 공유하는 두 가지 방법이 있습니다 : 데이터를 인 텐트로 전달하거나 다른 곳에 저장하는 것. 데이터가 기본 요소, 문자열 또는 사용자 정의 오브젝트 인 경우 : 의도 추가 항목의 일부로 전송하십시오 (사용자 정의 오브젝트는을 구현해야합니다 Parcelable
). 복잡한 객체를 전달하는 경우 인스턴스를 다른 곳에 싱글 톤으로 저장하고 시작된 액티비티에서 액세스합니다.
각 접근 방식을 구현하는 방법과 이유에 대한 몇 가지 예 :
의도 내에서 데이터 보내기
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("some_key", value);
intent.putExtra("some_other_key", "a value");
startActivity(intent);
두 번째 활동에서 :
Bundle bundle = getIntent().getExtras();
int value = bundle.getInt("some_key");
String value2 = bundle.getString("some_other_key");
기본 데이터 또는 문자열을 전달하는 경우이 방법을 사용하십시오 . 또한 구현하는 객체를 전달할 수도 있습니다 Serializable
.
유혹적이지만 사용하기 전에 두 번 생각해야합니다 Serializable
. 오류가 발생하기 쉽고 엄청나게 느립니다. 따라서 일반적으로 가능하면 멀리Serializable
하십시오. 복잡한 사용자 정의 객체를 전달 하려면 Parcelable
인터페이스를 살펴보십시오 . 구현하기는 어렵지만에 비해 상당한 속도 향상이 Serializable
있습니다.
디스크를 유지하지 않고 데이터 공유
대부분의 경우 두 활동이 동일한 프로세스에서 실행되는 경우 메모리에 저장하여 활동간에 데이터를 공유 할 수 있습니다.
참고 : 때때로 사용자가 활동을 종료하지 않고 종료 할 때 (Android는) 응용 프로그램을 종료하기로 결정할 수 있습니다. 이러한 시나리오에서 안드로이드가 앱이 종료되기 전에 제공된 의도를 사용하여 마지막 활동을 시작하려는 경우를 경험했습니다. 이 경우 싱글 톤 (귀하의 또는 Application
)에 저장된 데이터 는 사라지고 나쁜 일이 발생할 수 있습니다. 이러한 경우를 피하려면 오브젝트를 디스크에 지속 시키거나 사용하기 전에 데이터를 점검하여 유효한지 확인하십시오.
싱글 톤 클래스 사용
데이터를 보관할 수업을 준비하십시오.
public class DataHolder {
private String data;
public String getData() {return data;}
public void setData(String data) {this.data = data;}
private static final DataHolder holder = new DataHolder();
public static DataHolder getInstance() {return holder;}
}
시작된 활동에서 :
String data = DataHolder.getInstance().getData();
응용 프로그램 싱글 톤 사용
응용 프로그램 싱글 톤은 android.app.Application
앱이 시작될 때 생성 되는 인스턴스입니다 . 다음을 확장하여 사용자 정의 항목을 제공 할 수 있습니다 Application
.
import android.app.Application;
public class MyApplication extends Application {
private String data;
public String getData() {return data;}
public void setData(String data) {this.data = data;}
}
활동을 시작하기 전에 :
MyApplication app = (MyApplication) getApplicationContext();
app.setData(someData);
그런 다음 시작된 활동에서 :
MyApplication app = (MyApplication) getApplicationContext();
String data = app.getData();
정적 필드
아이디어는 기본적으로 싱글 톤과 동일하지만이 경우 데이터에 정적 액세스를 제공합니다.
public class DataHolder {
private static String data;
public static String getData() {return data;}
public static void setData(String data) {DataHolder.data = data;}
}
시작된 활동에서 :
String data = DataHolder.getData();
해시지도 WeakReferences
같은 생각이지만 가비지 수집기가 참조되지 않은 객체를 제거하도록 허용 (예 : 사용자가 활동을 종료 한 경우)
public class DataHolder {
Map<String, WeakReference<Object>> data = new HashMap<String, WeakReference<Object>>();
void save(String id, Object object) {
data.put(id, new WeakReference<Object>(object));
}
Object retrieve(String id) {
WeakReference<Object> objectWeakReference = data.get(id);
return objectWeakReference.get();
}
}
활동을 시작하기 전에 :
DataHolder.getInstance().save(someId, someObject);
시작된 활동에서 :
DataHolder.getInstance().retrieve(someId);
인 텐트의 엑스트라를 사용하여 객체 ID를 전달해야 할 수도 있고 아닐 수도 있습니다. 그것은 모두 특정 문제에 달려 있습니다.
디스크에 객체 유지
아이디어는 다른 활동을 시작하기 전에 디스크에 데이터를 저장하는 것입니다.
장점 : 다른 곳에서 활동을 시작할 수 있으며 데이터가 이미 지속되면 제대로 작동합니다.
단점 : 번거롭고 구현하는 데 시간이 더 걸립니다. 더 많은 코드가 필요하므로 버그가 발생할 가능성이 높습니다. 또한 훨씬 느려질 것입니다.
객체를 유지하는 몇 가지 방법은 다음과 같습니다.