2011年5月18日水曜日

startActivityForResultとonActivityResultとsetResult

このエントリーをはてなブックマークに追加
Activity AからActivity Bを起動し、そのActivity Bの処理結果をActivity Aで受け取りたい時、startActivityForResult、onActivityResultおよびsetResultメソッドを使うと便利です。

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

コメントを投稿