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

カタログ
  1. 1. 起動元のアクティビティ
  2. 2. 起動先のアクティビティ

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

起動元のアクティビティ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
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;
}
}
}

起動先のアクティビティ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
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();
}
}
}

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

関連があるかもしれない記事