これを達成するための最も一般的な方法のコンパイル:
- インテント内でデータを送信する
- 静的フィールド
- のハッシュマップ
WeakReferences
- 永続オブジェクト(sqlite、共有設定、ファイルなど)
TL; DR:データを共有する方法は2つあります。インテントのエクストラでデータを渡すか、別の場所に保存します。データがプリミティブ、文字列、またはユーザー定義オブジェクトの場合:インテントエクストラの一部として送信します(ユーザー定義オブジェクトはを実装する必要がありますParcelable
)。複雑なオブジェクトを渡す場合、インスタンスを別の場所のシングルトンに保存し、起動されたアクティビティからそれらにアクセスします。
各アプローチを実装する方法と理由の例:
インテント内にデータを送信する
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("some_key", value);
intent.putExtra("some_other_key", "a value");
startActivity(intent);
2番目のアクティビティ:
Bundle bundle = getIntent().getExtras();
int value = bundle.getInt("some_key");
String value2 = bundle.getString("some_other_key");
プリミティブデータまたは文字列を渡す場合は、このメソッドを使用します。を実装するオブジェクトを渡すこともできますSerializable
。
魅力的ではありますが、使用する前によく考える必要がありますSerializable
。エラーが発生しやすく、非常に遅くなります。したがって、一般的にはSerializable
、可能であれば近づかないでください。複雑なユーザー定義オブジェクトを渡す場合は、Parcelable
インターフェースをご覧ください。実装は困難ですが、に比べて速度が大幅に向上しSerializable
ます。
ディスクに永続化せずにデータを共有する
ほとんどの場合、両方のアクティビティが同じプロセスで実行される場合、データをメモリに保存することにより、アクティビティ間でデータを共有することが可能です。
注:ユーザーがアクティビティを終了すると(終了せずに)、Androidがアプリケーションを強制終了する場合があります。このようなシナリオでは、アプリが終了する前に提供されたインテントを使用して、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を渡す必要がある場合とない場合があります。それはすべてあなたの特定の問題に依存します。
オブジェクトをディスクに永続化する
アイデアは、他のアクティビティを起動する前にデータをディスクに保存することです。
利点:他の場所からアクティビティを起動できます。データがすでに永続化されている場合は、問題なく機能するはずです。
短所:面倒で実装に時間がかかります。より多くのコードを必要とするため、バグが発生する可能性が高くなります。また、それははるかに遅くなります。
オブジェクトを永続化する方法には、次のようなものがあります。