Activity間のデータ転送_IntentとstartActivity ForResultの使用

2093 ワード

本節では,Activity間(AとB)のデータがどのように伝達されるかについて述べる.
1、
A->B:AはBにジャンプしながら、いくつかのデータをBに渡す
コード実装:簡単で、AでIntentを生成するときに、伝達するデータをIntentに置くだけで、以下のようにします:(1)A
    Intent intent = new Intent();
			intent.setClass(A.this, B.class);
			Bundle bundle = new Bundle();
			bundle.putString("story", "Tom&jerry");
			intent.putExtra("tag", bundle);
			startActivity(intent);

ここでは「トム&jerry」をBに伝えたいだけなのでintentを使うだけです.putExtras(String,String)でよいが,本例ではbundleを用いて一度カプセル化するのは,主に少し複雑なデータがあればbundleを用いることができることを考慮したものである.
(2)B
BでAから渡されたデータを受け取るには、Bのoncreate()で次のように処理します.
   Intent intent = getIntent();
		Bundle bundle = intent.getBundleExtra("tag");
		String storyName = bundle.getString("story");

2、
Bデータを得た後、Aに戻りたい(または、データを処理してからAに戻りたい).
私たちはまだ1のようにデータを再カプセル化しなければならないのではないでしょうか.もしこのデータのカプセル化過程が面倒だったら、大変ではないでしょうか.答えは否定的だ.AでstartActivity ForResult(intent,0)を使用してBを起動し、0は次のactivityが返す根拠となり、onActivity Resultメソッドを書き換えることができます.以下のようにします.
(1)AでBにジャンプする際にstartActivity(intent)ではなく次のように使用する.
startActivityForResult(intent, 0);

(2)AでonActivity Resultメソッドを書き換える
@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		// TODO Auto-generated method stub
		switch (resultCode) {
		case RESULT_OK:
			Bundle bundle = data.getBundleExtra("tag");
			String storyName = bundle.getString("story");
			tv1.setText(storyName);
			break;
		default:
			break;
		}
	}

(3)Bでは、「Bに戻る」ボタンを使用して、onclickで一言だけ
B.this.setResult(RESULT_OK,intent);
はAインタフェースに戻り、Aにデータを転送することができ、intentのデータはAが最初に転送したデータであってもよいし、Bが処理したデータであってもよい.
実は、BでstartActivity(B.this,A.class)を直接使用し、AのoncreateでIntentにデータがあるかどうかを判断し、ある場合はデータを持ち込み、ない場合はnull値を入力するという方法も実現できますが、少し面倒ですが、システムが私たちにこのstartActivity ForResultの方法を提供してくれた以上、私たちはどうして使わないのですか.