このページの本文へ

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

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

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

文● 塩田紳二

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

インテントを用いてウェブブラウザーを起動する

 つづいて、パラメータを渡してみることにしましょう。たとえばウェブブラウザーを開くには、以下のコードを使います。

    Uri myUri = Uri.parse(this.getString(R.string.myURL));
    Intent webIntent = new Intent(Intent.ACTION_VIEW,myUri);
    startActivity(webIntent);

 ここでString.xmlには、“http://~”となるURL文字列がmyURLとして定義されています。これをUriオブジェクトでparseしたのち、UriオブジェクトとしてIntentの引数にします。アクションは「View」で、意味としてはUriオブジェクトを表示できるアプリケーションを起動するということになります。もっとも引数はURLではなく、一般化されたUriなので、この型式だからといって必ずしもウェブブラウザーが起動されるとは限りません。ウェブブラウザーが起動されるのは、Uriの中身がURLになっている(あるいはウェブブラウザーに解釈可能なもの)からです。

 「this.getString(R.string.myURL)」のところは、文字列リソースを取り出しています。「R.string.myURL」は、文字列リソースのIDで、実際には整数値です。getStringメソッドを使うことでリソースIDから文字列を取り出すことができます。

データ型式を指定したインテント

 インテント呼び出しでは、アクションとデータ型式を指定する方法もあります。他のアプリケーションが管理するデータなどを利用するときに、該当アプリケーションの機能をつかってデータを表示させ、そこでユーザーに選択してもらう方法です。

 テキストなどの簡単なデータであれば、わざわざ他のアプリケーションに頼む必要はありません。しかし音楽データなどになると、ファイル名だけでデータを選ぶのは難しく、たとえば音楽データ内にタグとして含まれているタイトルやアーティスト名なども他のアプリケーションから呼び出すための重要な情報となります。

 かといって、アプリケーションに音楽データファイルを解析させて、こうした情報を表示させるのもかなり大変な作業です。そんなことをさせると、音楽データを扱うすべてのプログラムにファイル解析機能が必要になってしまい、プログラムサイズが全体として増大してしまいます。

 Androidでは、こうした場合にインテントを使うことで、他のアプリケーションが持つ機能を簡単に利用できるようにしているのです。

 この例は、サウンドファイルを選択する方法です。

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("audio/*");
startActivity(Intent.createChooser(intent, "Select music"));

 Intentのコンストラクタでは、アクションとして「ACTION_GET_CONTENT」(コンテンツの取得)を指定しており、これは、コンテンツデータを取得するためのアクションです。次のsetTypeメソッドでは、MIMEデータタイプ型式で、オーディオファイルを指定しています。つまり、このインテントはオーディオデータを扱うアプリケーションを呼び出して、そのアプリケーションが扱うオーディオデータを取得するためのものです。

 startActivityは、インテントを引数に取りますが、ここでは、呼び出し先のアプリケーションにコンテンツを選択させる動作を行なわせる「Intent.createChooser」を指定しています。これは呼び出されるアプリケーションに対するアクションになります。つまり、このインテントは「ACTION_GET_CONTENT」というアクションが実行可能かつ"audio/*"(すべてのオーディオ型式)というデータを扱うアプリケーションを呼び出すものですが、呼び出し先のアプリケーションには「ACTION_CHOOSER」というアクションが渡されます。

アプリケーション内で別アクティビティを起動する

 最後にアプリケーションの中で、別のアクティビティを起動する方法を説明しましょう。この場合、アプリケーション起動時に表示されるアクティビティとは別にクラスとその画面の定義が必要です。このため、サンプルプログラムでは、SubActivityクラスを作り、その画面をSub.xmlで定義してあります。

 また、アプリケーション内での起動なので、アクティビティ間でパラメータや結果を受け渡しする必要もあるでしょう。ここでは、起動時にExtraデータとして文字列を渡し、SubActivityからも、Extraデータを受け取る方法を解説します。

 記事最後にまとめて掲載しているリスト1が呼び出し元のMyMainActivyクラス、リスト2が呼び出されるSubActivyクラスの定義です。それぞれでxmlファイル(リスト3)(リスト4)を読み込んでいます。

 呼び出しているのは、MyMainActivityの中のSetButtonOnClickメソッドで、これは、Setボタンを押したときに呼ばれるメソッドです。

Intent subactivity = new Intent(this,com.tyrell_replicants.sample05.SubActivity.class); String sendMessage = inputText.getText().toString(); subactivity.putExtra(this.getString(R.string.ExtraString01), sendMessage); startActivityForResult(subactivity, R.id.IntentRequestGeneral);

 まずはIntentオブジェクトを作ります。この場合のコンストラクタは自分自身(MyMainActivity)と呼び出し先となるSubActivityクラスのクラス名です。自分自身はContextを取得するために使われます。Contextは、android.contentパッケージに含まれており、Activityはそのサブクラスになるため、自分自身を表すthisを指定することで、Contextを指定したことになります。

 何らかのデータを渡したい場合、putExtraなどのメソッドを使います。これは、

putExtra(String name,String value)

という定義になっていて、名前と値の組でデータを指定します。なお、String以外のデータも保存することが可能です。ただし、受け取る側では、データがStringなのかIntなのかを理解している必要があります。なお、ここで指定する名前は、複数のクラスファイルから参照されるため、このサンプルのように文字列リソースとして定義しておくほうが、綴りミスなどを避けることができます。

 そして他のアクティビティを実際に呼び出します。このとき、別のActivityから結果を受け取りたい場合(Extraによるデータを含む)には、このようにstartActivityForResultを使います。ここで指定するのはIntentオブジェクトと、リクエストコードです。リクエストコードは、個々のアクティビティ呼び出しを区別するための数値(0以外)で、これは、起動したアクティビティから戻ってきたときのイベントハンドラが、1つだけしか指定できないため、戻り値に含まれるリクエストコードで、どのアクティビティ呼び出しからの戻りなのかを区別するために使います。

カテゴリートップへ

この連載の記事

注目ニュース

ASCII倶楽部

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

ピックアップ

ASCII.jp RSS2.0 配信中

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