【Android開発】MainActivityに戻る時にデータを渡す方法
Androidアプリで「詳細画面から一覧画面に戻る」際、単純にIntentを投げるとActivityが二重に生成されてしまうことがあります。この記事では、FLAG_ACTIVITY_CLEAR_TOPを使用して既存のActivityを再利用し、onNewIntentを介して安全にデータを渡す方法を解説します。特に、画面回転などで同じ処理が何度も走るバグを防ぐための「一度読み取ったキーの削除」といった工夫も考慮しています。
遷移元(ShowActivity.java)の処理
※サブアクティビティ名をShowActivityとしています。
/** ShowActivity.java **/
// 送信するデータの準備
String text = "ここに渡したいデータを書く";
Intent intent = new Intent(ShowActivity.this, MainActivity.class);
// データをIntentにセット
intent.putExtra("EDIT_KEY", text);
// 【重要】MainActivityを再起動せず、スタックのトップにある既存インスタンスを再利用するフラグ
// これにより、戻った際に MainActivity が新しく作られるのを防ぎます
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
// 画面遷移を実行
startActivity(intent);
// このActivityを終了してスタックから取り除く
finish();
遷移先(MainActivity.java)の処理
既存のActivityが再利用される場合、onCreateではなくonNewIntentが呼ばれます。そこで新しいデータ(Intent)を受け取れるように更新し、onResumeで実際の処理を行います。
/** MainActivity.java **/
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
// 重要:このActivityが保持している古いIntentを、新しく届いたIntentに差し替える
// これを行わないと、getIntent() が古いデータのままになってしまう。
setIntent(intent);
// この後、自動的に onResume() が呼ばれる。
}
@Override
protected void onResume() {
super.onResume();
// 2. Intentから送られてきたデータを取得
editKey = getIntent().getStringExtra("EDIT_KEY");
// データが存在する場合のみ実行
if (editKey != null) {
// ここに反映処理(例:TextViewの更新など)を書く
// 3. 【最重要】一度処理したデータをIntentから削除する
// これを忘れると、画面回転などでActivityが再構成された際、
// 再び onResume が走り、同じ処理(加工処理の重複など)が繰り返されてしまう。
getIntent().removeExtra("EDIT_KEY");
}
}
スポンサーリンク