Androidアプリのキモとなるインテントとは何?
では本題に入ることにしましょう。「インテント」とはAndroid独自の機能です。簡単にいえばアプリケーションやアクティビティを呼び出す機能ですが、他のアプリケーションを機能や扱えるデータ型式で“検索”して呼び出すことができるものです。
たとえば、ウェブブラウザーを呼び出したい場合、「View」(データの表示)というアクションとURLを指定します。ウェブブラウザーの名前などを指定する必要がありません。このインテントが実行されると、Androidは、URLを扱うことができ、かつそれを表示できるアプリケーションを探し、そのアプリケーションにURLを渡して表示を行なわせます。もし、複数のアプリケーションがある場合は、ユーザーがどのアプリケーションを使うのかを選ぶダイアログが表示されます。
このようにアプリケーションでインテントを使うと、コード中にブラウザーの名前を入れる必要もないし、実際の実行時に別のブラウザーに置き換わっていたり、複数のブラウザーが端末にあっても問題ないのです。また逆にブラウザを起動するアプリケーションがあったとしても、ユーザーは別のブラウザをインストールしたら、そちらを起動するようにも指定できます。このようにアプリケーション同士を直接相互依存させるのではなく、実際に行なう作業(アクションといいます)を指定して外部のアプリケーションと間接的に関係させることができるわけです。
また、インテントは1つのアプリケーションの中で、アクティビティを切り替えるのにも利用します。アプリケーションは、必ずアクティビティを含むため、インテントはアクティビティを呼び出しているともいえます。つまり、アプリケーション内での別のアクティビティの呼び出しは、インテントの特殊な形と考えることができるわけです。この場合は、機能などでなく、直接別のアクティビティを示す名前を使います。
インテントによる別アプリケーションの呼び出しでは、Android側がアプリケーションの情報を使って、自動的に起動するアプリケーションを決定します。このため自作ソフトでも、きちんとアクションに対応するように作れば、条件を満たしたときには自作ソフトを呼び出してくれます。
まずは簡単な例を作成してみる
今回は、このためにSample5を作成しました。いつものようにエクスポートしたプロジェクトを用意しました。またAndroidマーケットに動作するサンプル(Sample05)をアップロードしてあります。またソースコードについては以下のリンクからダウンロードしてください。
なおこれままでの解説で、アプリケーションの作り方に慣れたと思いますので、今回からはレイアウト作成などの操作についての説明は省略します。
インテントの最も簡単な例は、アプリケーションから別アプリケーションを呼び出す場合です。まずはAndroidの[設定]にある「日付と時間」を表示させてみましょう。
Android自身が用意しているインテントに関しては、Android DeveloperのReferenceに情報があります。ただし、一ヵ所にすべてまとまっているわけではなく、Intentクラスで規定する標準のアクションと、個々のクラスが持つアクション(アクティビティの表示)に別れています。今回のように設定関連のアクションは、Settingsクラスに定義があります。
Intent intent = new Intent(Settings.ACTION_DATE_SETTINGS);
startActivity(intent);
1行目はIntentオブジェクトの作成で、このとき引数としてアクションを渡します。今回のアクション(Settings.ACTION_DATE_SETTINGS)は、データを別途必要としないので、特になにもせずにstartActivityでアクティビティを表示させることができます。
これがインテントです。このように設定の各項目を簡単に起動することができます。本連載で最終的に作る世界時計のプログラムにおいても、最初はこの機能を使い、ユーザーに自分でタイムゾーンを変更してもらっていました。この方法はユーザーの手間がかかってしまうものの、アプリケーションがタイムゾーンを変更する許可(Permission)を取得する必要がないというメリットがあります。
Androidマーケットからアプリケーションをインストールする際、オレンジの字でアプリケーションがアクセスする機能などについての確認をみたことがあるでしょう。これがその許可になります。ここでOKを押すことで、ユーザーはさまざまな機能へのアクセス(関連情報の変更や読み出し)を許可しているのです。
さて、このコードでIntentのコンストラクタの引数になっている定数(Settings.ACTION_DATE_SETTINGS)は実は文字列で、リファレンスによれば、その中身は"android.settings.DATE_SETTINGS"です。このためこの部分は、
Intent intent = new Intent("android.settings.DATE_SETTINGS");
と書くこともできます。とはいえ、将来的にもこの文字列である保証はない(変更されることはないと思われますが)ので、最初のようにコードでは定数として書いておいたほうがいいでしょう。万一変更があっても、定数はSDK側で定義されているのでコードを再コンパイルするだけで済みます。
この連載の記事
-
第11回
スマホ
アプリケーションをAndroidマーケットに登録する -
第10回
スマホ
ブロードキャストへの応答とタイマ割り込み -
第9回
スマホ
Androidアプリで複数の項目を表示するリストビューを使う -
第8回
スマホ
Androidアプリに必要なダイアログを作る -
第7回
スマホ
Androidアプリの設定画面を作成する -
第6回
スマホ
Androidアプリ内で表示されるメニューを作成する -
第4回
スマホ
Androidアプリを構成する「アクティビティ」を実際に作る -
第3回
スマホ
アプリケーションの基本となる「アクティビティ」 -
第2回
スマホ
開発したアプリをエミュレーターやデバッガ上でテストする -
第1回
スマホ
Androidアプリの開発環境であるEclipseの使い方を知る - この連載の一覧へ