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 件のコメント:
コメントを投稿