[Android] 起動先アクティビティから結果を送り返してもらう方法

startActivityForResult により起動させたアクティビティは終了したときに 起動元に Intentインスタンス を送る。 これは起動元の onActivityResult に渡されるのでここで返ってきたデータの処理を行う。

起動元のアクティビティ

package jp.fernweh;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;

public class StartActivityForResultTest
  extends Activity implements View.OnClickListener {

  LinearLayout layout;
  Button btn;
  TextView text;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    layout = new LinearLayout(this);
    layout.setOrientation(LinearLayout.VERTICAL);
    btn = new Button(this);
    btn.setText("startActivityForResult");
    btn.setOnClickListener(this);
    text = new TextView(this);

    layout.addView(btn);
    layout.addView(text);
    setContentView(layout);
  }

  public void onClick(View v) {
    // 起動先アクティビティからデータを返してもらいたい場合は
    // Activity#startActivityForResult(intent, requestCode) を使う
    // 第二引数の requestCode は 下の onActivityResult の
    // 第一引数に渡される値で、条件分岐のための数値。
    // requestCode が 0 未満の場合は startActivity(intent) と等価
    Intent intent = new Intent(this, AnotherActivity.class);
    int requestCode = 123;
    startActivityForResult(intent, requestCode);
  }

  // startActivityForResult で起動させたアクティビティが
  // finish() により破棄されたときにコールされる
  // requestCode : startActivityForResult の第二引数で指定した値が渡される
  // resultCode : 起動先のActivity.setResult の第一引数が渡される
  // Intent data : 起動先Activityから送られてくる Intent
  @Override
  protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    Bundle bundle = data.getExtras();

    switch (requestCode) {
    case 123:
      if (resultCode == RESULT_OK) {
        text.setText(
            "requestCode:" + requestCode
            + "\nresultCode:" + resultCode
            + "\ndata:" + bundle.getString("key.StringData")
            + bundle.getInt("key.intData"));
      } else if (resultCode == RESULT_CANCELED) {
        text.setText(
            "requestCode:" + requestCode
            + "\nresultCode:" + resultCode
            + "\ndata:" + bundle.getString("key.canceledData"));
      }
      break;

    default:
      break;
    }
  }
}

起動先のアクティビティ

package jp.fernweh;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;

public class AnotherActivity
  extends Activity implements OnClickListener {

  LinearLayout layout;
  Button btn_ok, btn_canceled;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    layout = new LinearLayout(this);
    btn_ok = new Button(this);
    btn_ok.setText("OK");
    btn_ok.setOnClickListener(this);
    btn_canceled = new Button(this);
    btn_canceled.setText("CANCELED");
    btn_canceled.setOnClickListener(this);

    layout.addView(btn_ok);
    layout.addView(btn_canceled);
    setContentView(layout);
  }

  public void onClick(View v) {
    if (v.equals(btn_ok)) {
      // 返すデータ(Intent&Bundle)の作成
      Intent data = new Intent();
      Bundle bundle = new Bundle();
      bundle.putString("key.StringData", "送り返す文字列");
      bundle.putInt("key.intData", 123456789);
      data.putExtras(bundle);

      // setResult() で bundle を載せた
      // 送るIntent dataをセットする

      // 第一引数は…Activity.RESULT_OK,
      // Activity.RESULT_CANCELED など
      setResult(RESULT_OK, data);

      // finish() で終わらせて
      // Intent data を送る
      finish();

    } else if (v.equals(btn_canceled)) {
      Intent data = new Intent();
      data.putExtra("key.canceledData", "キャンセル");
      setResult(RESULT_CANCELED, data);
      finish();
    }
  }
}

※マニフェストファイルは省略

Share
関連記事