activity1 と activity2 という 2 つのアクティビティがあるとします。activity1 から activity2 に移動し、activity2 からいくつかの情報を取得して、それを activity1 に挿入し直したいと思っています。どうすればその状態を保存できますか?
5 に答える
あなたが説明しているのは、このActivity.startActivityForResult()
方法を使用する完璧な古典的な理由です。
これは、グーグルがこのメソッドのドキュメントに書いたことです。
終了時に結果が必要なアクティビティを開始します。このアクティビティが終了すると、onActivityResult()メソッドが指定されたrequestCodeで呼び出されます
したがって、実行する必要があるのは、activity1から結果のアクティビティを開始し、activity2から、setResult(int resultCode, Intent data)
activity1に戻したいデータを使用してメソッドを使用し、呼び出しますfinish()
(onActivityResult()
activity1が以前と同じ状態に戻ります。) 。
オーバーライドonSaveInstanceState(Bundle)
しactivity1
て必要なデータを保存onRestoreInstanceState(Bundle)
し、同じアクティビティでオーバーライドして値を取得します。を使用するBundle
と、必要なほとんどすべてのデータを保存できます。次のようなものをお勧めします。
public class MainActivity extends Activity {
...
public static final String DATA1_KEY = "data1";
private boolean value1;
...
@Override
protected void onSaveInstanceState (Bundle outState) {
outState.putBoolean(DATA1_KEY, value1);
}
@Override
protected void onRestoreInstanceState (Bundle savedInstanceState) {
value1 = savedInstanceState.getBoolean(DATA1_KEY);
}
}
実行時にのみデータを存続させたい場合は、静的メンバーの使用を検討してください。次に、任意のアクティビティからこれらのメンバーにアクセスして操作できます。例えば:
public class FirstActivity extends Activity
{
public static String data = null;
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(...);
data = "This is a test!";
}
}
2番目のアクティビティから、次のような静的変数にアクセスできます。
public class SecondActivity extends Activity
{
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(...);
if(FirstActivity.data!=null)
{
//You can use it:
System.out.println(FirstActivity.data);
}
}
}
もちろん、ゲッター/セッター関数を追加して、より安全でエレガントにすることもできます。
長期間保管したい場合は、以下の使用をご検討ください。
- SharedPreferences
- SQLite
- または、データをオンラインデータベースに保存します。
ユーザーは、新しいアクティビティを開始するアクションをアプリで実行します。2番目のアクティビティが作成されると、現在のアクティビティは停止します。その後、ユーザーが[戻る]ボタンを押すと、最初のアクティビティが再開されます。
アクティビティが停止すると、Activityオブジェクトはメモリに常駐し、アクティビティが再開すると呼び出されます。Resumed状態に至るまでのコールバックメソッドのいずれかで作成されたコンポーネントを再初期化する必要はありません。システムは、レイアウト内の各ビューの現在の状態も追跡するため、ユーザーがEditTextウィジェットにテキストを入力した場合、そのコンテンツは保持されるため、保存して復元する必要はありません。
注:システムが停止中にアクティビティを破棄した場合でも、バンドル(キーと値のペアのブロブ)内のViewオブジェクト(EditTextのテキストなど)の状態を保持し、ユーザーが戻った場合にそれらを復元しますアクティビティの同じインスタンスに。
CommonsWareはここで言います:
ユーザーが「戻るボタンを押す」と、ユーザーがアクティビティの終了を示したため、onSaveInstanceState()からのバンドル(存在する場合)は破棄されます。onSaveInstanceState()バンドルは、ユーザーがアクティビティを終了したと言っていない場合(たとえば、電話の着信を受け入れた場合)、Androidがアクティビティを破棄してRAMを解放することを選択した場合に使用されます。
そしてドキュメントは言う:
永続データはonSaveInstanceState(Bundle)ではなくonPause()に保存することが重要です。後者はライフサイクルコールバックの一部ではないため、ドキュメントで説明されているように、すべての状況で呼び出されるわけではありません。
つまり、非ビューオブジェクトの保存/復元コードをonSaveInstanceState(Bundle)およびonRestoreInstanceState(Bundle)ではなくonPause()およびonResume()に配置します。最後に、Viewオブジェクトしかない場合は状態を保存する必要はなく、他の状態を使用できる場合はpreferences
、file
状態sqlite
を保存してonPause()
取得する必要はないと思いますonResume()
。
詳細については、次のページをご覧ください。Androidでのアクティビティ保存アクティビティ状態
の停止と再開Androidは、アクティビティの現在の状態を保存しません