このページの本文へ

これで作れる! Androidのアプリケーション 第5回

インテントによるアプリケーションとアクティビティの呼出し

2010年07月29日 12時00分更新

文● 塩田紳二

  • この記事をはてなブックマークに追加
  • 本文印刷

呼び出されるアクティビティ

 呼び出されたアクティビティ(リスト2)も基本的には、メインのアクティビティと同じくActivityクラスを継承したクラスです。起動され、準備が整うと、onCreateが呼び出されるなど、基本は、メインのアクティビティとまったく同じです。onCreateメソッド内でメインのアクティビティから渡されたExtraデータを取得するには、以下のようにしています。

String displayMessage = getIntent().getStringExtra(this.getString(R.string.ExtraString01));

 getIntentで呼び出し元となったIntentオブジェクトを取得、これに対してgetStringExtraメソッドを使います。前述のように受け取る側は、データの型と名前を正しく把握している必要があります。  さて、このプログラムでは、ボタンを押したら、元の画面に戻るようになっており、ボタンのEventListnerは、以下のようになっています(このメソッド名がsub.xml内でon clickに定義されています)。

    public void returnButtonPushed(View v){
        String returnText = myEditText.getText().toString();
        returnIntent.putExtra(this.getString(R.string.ExtraString01),returnText );
        setResult(RESULT_OK, returnIntent);
        finish();
    }

 ここで使うretrunIntentは、SubActivityクラスの先頭で定義されています。というのは、onCreateの中でもretrunIntentを参照しているためです。

 ここでは、returnIntentにputExtraで、EditTextに設定された文字列をセットし、setResultでリターンコードを設定しています。そののちfinish()で、実行を終了します。このあと、ActivityなのでonPauseやonStrop、onDestroyがあれば呼び出されます。

 setResultは、メインアクティビティに実行の結果を通知するために必要なものです。RESULT_OKはその綴りの通り、インテントとしては成功したことを返すためのものです。

 実は、onCreateにも、インテントから戻るためのコードがあります。それがこれです。

        returnIntent = new Intent();
        setResult(RESULT_CANCELED, returnIntent);

 これは、ユーザーがBackキーを押したときと、ボタンを押したときを区別するためのものです。インテントでの画面遷移は、遷移先でBackキーを無効にしない限り、ユーザーがBackキーを押したら、元のアクティビティに戻るようになっています。このため、Backキーを押したときには、前述のボタン用のEventListnerは実行されません。そうなると、元のアクティビティに結果を通知できません。そこであらかじめsetResultを実行しておき、ボタンを押したときには、これを上書きさせ、そうでないときには、onCreateでのsetResultが有効になるようにしています。もちろん、これは、ユーザーがボタンを押したときと、Backキーを区別するためにやったことです。区別する必要がなければ、たとえば、ボタンで単にfinish()だけを実行するようにして、onPauseなどで、setResultを実行するという方法もあります。

 呼び出されるアクティビティ側では、このようなインテントやExtraデータの扱いに注意するだけで、あとは、メインアクティビティと同じように作ることができます。

戻り値を受け取る

 では、今度は、メインアクティビティで戻り値を受け取るところを見てみましょう(リスト1)。

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK) {
        if (requestCode == R.id.IntentRequestGeneral ){
            String returnMessage = data.getStringExtra(this.getString(R.string.ExtraString01));
            message.setText(this.getString(R.string.MainDispString)+" " +returnMessage);
            }
        }
    else {
        Toast.makeText(this, "onActivityResult NOT RESULT_OK", Toast.LENGTH_SHORT).show();
    }
}

 startActivityForResultでインテントを行なうと、インテント先から戻ってきたときに、このonActivityResultが呼び出されます。このときの引数は、startActivityForResultで指定したリクエストコード、結果、そしてIntentオブジェクトです。まず必要なのは、結果(resultCode)がどうなっているかです。インテント先のアクティビティでは、ボタンを押したときには、RESULT_OK、Backキーが押されたときには、REUSLT_CANCELが戻るようになっています。このため、まずはresultCodeで判定したのち、どのリクエストコードに対応するインテントからの戻りなのかを判定しています。このサンプルでは1つのアクティビティしか呼び出していませんが、複数のアクティビティを呼び出すときには、それぞれでリクエストコードを別にしておくとここでそれぞれの処理に分岐させることができます。

 その後は、IntentオブジェクトからExtraデータを取り出し、適当に処理します。このサンプルでは、TextViewに文字列データを表示させています。

アプリケーションに2つめのActivityを追加するとき

 実はもう1つ作業が残っています。2つ目以降のアクティビティをアプリケーションに追加する場合、AndroidManifest.xmlにアクティビティ名を追加する必要があります。これはAndroidManifest.xmlをダブルクリックで開いて、Manifestエディタを起動し、[Application]タブを開きます。

AndroidManifest.xmlをダブルクリックで開き、Manifestエディタを起動する。Applicationタブにある「Application Nodes」で「Add」ボタンを押す

 ここにある[Application Nodes]で[Add...]ボタンを押し、表示されたダイアログボックスの上にある[Create a new element at the top level,……]を選択、下のリストから「Activity」を選びます。

ダイアログで[Create a new element at the top level, in Application.]を選び、下のリストから[Activity]を選択する

 すると、リストに「Activity」が追加されるので、リスト右側の[name]欄の横にある[Browse...]ボタンを押します。

「Activity」ができるので、右側の[Name]にある[Browse]ボタンを押す

 表示されるダイアログには、Activityを継承しているクラスが表示されるので、追加したクラス(ここではSubActibity)を選択します。これで準備が完了します。

プロジェクト内のActivityクラスの一覧が出るので、追加アクティビティに対応するクラスを選択する

 では、サンプルを実行してみましょう。Sample05を起動し、最初の画面でTextEditに入れた文字列は、Setボタンを押して切り替わった画面の先頭で表示され、SubActivityにあるTextEditに入れた文字列は、ボタンを使って元の画面に戻ると、一番上に表示されます。

SubActivityでは、メインアクティビティ(MyMainActivity)でTextEditに入れた文字列が一番上の行に表示される。ここで、EditTextに文字列を入れ、ボタンを押せば、メインアクティビティに戻る。

ボタンを押して戻ったときには、サブアクティビティで入力した文字列が一番上に表示される

 しかし、Backキーを使って戻ると、文字列は表示されず、代わりにToastメッセージが表示されるはずです。

Backキーで戻った場合、文字列は表示されず、Toastメッセージが表示される

 今回はここまで。なお次ページに今回用いたリストが用意されています。

カテゴリートップへ

この連載の記事

注目ニュース

ASCII倶楽部

プレミアムPC試用レポート

ピックアップ

ASCII.jp RSS2.0 配信中

ASCII.jpメール デジタルMac/iPodマガジン