非IT企業に勤める中年サラリーマンのIT日記

非IT企業でしかもITとは全く関係ない部署にいる中年エンジニア。唯一の趣味がプログラミングという”自称”プログラマー。

【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");
    }
}
 

 

 

スポンサーリンク

 - Androidプログラミング