It is convenient to use startActivityForResult, onActivityResult, and setResult to launch Activity B from Activity A, and to receive the processing result of the Activity B with Activity A.
Activityから別のActivityを起動する場合、startActivityやstartActivityForResultメソッドが利用できます。startActivityForResultは、startActivityと比較して、起動したActivityの処理結果を容易に知ることができます。startActivityForResultで起動したActivityの処理結果はonActivityResultメソッドで受け取ることができます。onActivityResultで受け取る処理結果は、起動したActivityのsetResultメソッドで設定できます。
メソッド
public void startActivityForResult (Intent intent, int requestCode)
intentへ起動したいアクティビティをセットします。requestCodeはsetResultへ戻る引数で、識別に便利です。
protected void onActivityResult (int requestCode, int resultCode, Intent data)
requestCodeにはstartActivityForResultの第二引数に指定した値が入ります。resultCodeとdataにはsetResultの引数に指定した値が入ります。
public final void setResult (int resultCode, Intent data)
resultCodeとdataにonActivityResultの対応する引数へ渡したい値をセットします。resultCodeはRESULT_CANCELEDやRESULT_OKといった結果コードを指定します。
プログラム
次の機能を持つプログラムを作成しました。
ActivityTest2
[Go ActivityTest3]ボタンを押すとActivityTest3を起動する。
ActibityTest3
[Back ActivityTest2]ボタンを押すと、"Hello"というメッセージをセットし、ActivityTest3を終了してActivityTest2へ戻る。
/SGL/src/sgl/test/activity/ActivityTest2.java
package sgl.test.activity;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
public class ActivityTest2 extends Activity implements OnClickListener{
private final String TAG = "ActivityTest2";
private final int REQUEST_CODE = 111;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "onCreate");
LinearLayout linearLayout = new LinearLayout(this);
setContentView(linearLayout);
Button button = new Button(this);
button.setText("Go ActivityTest3");
button.setOnClickListener(this);
linearLayout.addView(button);
}
public void onClick(View view) {
Log.d(TAG, "onClick");
Intent intent = new Intent(ActivityTest2.this, ActivityTest3.class);
startActivityForResult(intent, REQUEST_CODE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CODE) {
Log.d(TAG, "requestCode = " + requestCode);
}
if (resultCode == RESULT_OK) {
Log.d(TAG, "resultCode = " + resultCode);
}
if (data != null) {
Log.d(TAG, "data = " + data.getStringExtra("sgl.test.activity.msg"));
}
}
}
/SGL/src/sgl/test/activity/ActivityTest3.java
package sgl.test.activity;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
public class ActivityTest3 extends Activity implements OnClickListener{
private final String TAG = "ActivityTest3";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "onCreate");
LinearLayout linearLayout = new LinearLayout(this);
setContentView(linearLayout);
Button button = new Button(this);
button.setText("Back ActivityTest2");
button.setOnClickListener(this);
linearLayout.addView(button);
}
public void onClick(View view) {
Log.d(TAG, "onClick");
Intent intent = new Intent();
intent.putExtra("sgl.test.activity.msg", "Hello");
setResult(RESULT_OK, intent);
finish();
}
@Override
public void onPause() {
super.onPause();
Log.d(TAG, "onPause");
}
@Override
public void onStop() {
super.onStop();
Log.d(TAG, "onStop");
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy");
}
}
実行結果
[21:45:48.424] ActivityTest2の[Go ActivityTest3]ボタン押下
[21:45:50.824] ActivityTest3の[Back ActivityTest2]ボタン押下
ActivityTest3のonPauseやonStop、onDestroyの中でsetResultを利用してみましたが、この場合はActivityTest2のonActivityResultに値がセットされませんでした。この原因はわかりません。。

0 件のコメント:
コメントを投稿