İşte bunu başarmanın en yaygın yollarının bir derlemesi :
- Amaç içinde veri gönderme
- Statik alanlar
- HashHap
WeakReferences
- Kalıcı nesneler (sqlite, paylaşım tercihleri, dosya vb.)
TL; DR : veri paylaşmanın iki yolu vardır: verileri niyetin ekstralarına aktarmak veya başka bir yere kaydetmek. Veriler temel öğeler, Dizeler veya kullanıcı tanımlı nesneler ise: bunu amaç ekstralarının bir parçası olarak gönderin (kullanıcı tanımlı nesneler uygulanmalıdır Parcelable
). Karmaşık nesneler geçiyorsa bir örneği başka bir yerde tek birtona kaydedin ve başlatılan etkinlikten bunlara erişin.
Her bir yaklaşımın nasıl ve neden uygulanacağına dair bazı örnekler:
Verileri amaçların içine gönderme
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("some_key", value);
intent.putExtra("some_other_key", "a value");
startActivity(intent);
İkinci etkinlikte:
Bundle bundle = getIntent().getExtras();
int value = bundle.getInt("some_key");
String value2 = bundle.getString("some_other_key");
İlkel veri veya Dizeler geçiriyorsanız bu yöntemi kullanın . Ayrıca, uygulayan nesneleri de geçirebilirsiniz Serializable
.
Cazip olmasına rağmen, kullanmadan önce iki kez düşünmelisiniz Serializable
: hata eğilimli ve korkunç derecede yavaş. Genel olarak: mümkünse uzak durunSerializable
. Karmaşık kullanıcı tanımlı nesneler geçmek istiyorsanız, bakmak Parcelable
arayüzüne . Uygulanması daha zor, ancak karşılaştırıldığında önemli ölçüde hız kazancı var Serializable
.
Diske devam etmeden veri paylaşma
Çoğu durumda, her iki faaliyetin de aynı süreçte yürütüldüğü göz önünde bulundurularak, veriler arasında etkinlikler arasında veri paylaşmak mümkündür.
Not: bazen, kullanıcı etkinliğinizden ayrıldığında (istifa etmeden), Android uygulamanızı öldürmeye karar verebilir. Böyle bir senaryoda, android, uygulama öldürülmeden önce sağlanan amacı kullanarak son etkinliği başlatmaya çalıştığı vakaları yaşadım. Bu durumlarda, tek birtonda (sizinkini veya Application
) depolanan veriler kaybolacak ve kötü şeyler meydana gelebilir. Bu gibi durumlardan kaçınmak için, nesneleri diske saklarsınız veya geçerli olduğundan emin olmak için kullanmadan önce verileri kontrol edersiniz.
Tek bir sınıf kullanın
Verileri tutacak bir sınıfa sahip olun:
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;}
}
Başlatılan aktiviteden:
String data = DataHolder.getInstance().getData();
Uygulama singletonunu kullan
Uygulama singletonu, android.app.Application
uygulama başlatıldığında oluşturulan bir örneğidir . Aşağıdakileri genişleterek özel bir tane sağlayabilirsiniz 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;}
}
Etkinliği başlatmadan önce:
MyApplication app = (MyApplication) getApplicationContext();
app.setData(someData);
Ardından, başlatılan etkinlikten:
MyApplication app = (MyApplication) getApplicationContext();
String data = app.getData();
Statik alanlar
Fikir temel olarak singleton ile aynıdır, ancak bu durumda verilere statik erişim sağlarsınız:
public class DataHolder {
private static String data;
public static String getData() {return data;}
public static void setData(String data) {DataHolder.data = data;}
}
Başlatılan aktiviteden:
String data = DataHolder.getData();
HashHap WeakReferences
Aynı fikir, ancak çöp toplayıcısının referanslandırılmamış nesneleri kaldırmasına izin vermek (örneğin, kullanıcı etkinlikten ayrıldığında):
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();
}
}
Etkinliği başlatmadan önce:
DataHolder.getInstance().save(someId, someObject);
Başlatılan aktiviteden:
DataHolder.getInstance().retrieve(someId);
Niyetin ekstralarını kullanarak nesne kimliğini iletmeniz gerekebilir veya gerekmeyebilir. Her şey sizin özel probleminize bağlıdır.
Nesneleri diske devam ettirme
Amaç, diğer etkinliği başlatmadan önce verileri diske kaydetmek.
Avantajları: Etkinliği diğer yerlerden başlatabilirsiniz ve veriler zaten devam ediyorsa, iyi çalışmalıdır.
Dezavantajları: hantaldır ve uygulanması daha fazla zaman alır. Daha fazla kod gerektirir ve bu nedenle hataları ortaya çıkarma şansı daha fazladır. Ayrıca çok daha yavaş olacaktır.
Nesneleri sürdürmenin bazı yolları şunlardır: