アンドロイドを使っていると、ときどき、アプリが画像やWebページを開くときに、利用するアプリケーションを聞いてくることがあります(写真01)。これは、内部で「インテント(Intent)」と呼ばれる機能を使って、アプリが他のアプリやアンドロイドに処理を依頼しているのです。このとき、アプリが依頼する処理が可能なアプリが複数あると、このように画面を出して、ユーザーに選択してもらいます。この選択は、依頼元のアプリには見えず、単に処理を依頼して、結果が戻ってくるだけになっています。

写真01: アンドロイドでは、ときどき処理を実行するアプリを選択する画面が表示される。これは、インテントと呼ばれる機能で、その時点でインストールされているアプリの中から最適と思われるものをユーザーが選択できるようになっている

インテントは、アンドロイドの基本的な機能の1つで、アンドロイドのシステムが持つ機能の呼び出しや、アプリ内部などで他のモジュールを呼び出すのにも使われています。こうした機能はどのオペレーティングシステムにもありそうですが、インテントには、実行時に依頼先を探して処理を依頼するという仕組みがあります。これにより、古いアプリでも最新のアプリに作業を依頼することができます。

たとえば、アンドロイドの過去のバージョンでは、「インターネット」と呼ばれるブラウザが標準でした。しかし、現在のアンドロイドは「クローム」が標準です。もし、過去に作られたアプリがURLを表示してもらうのに「インターネット」ブラウザを直接呼び出していたら、クロームが無駄になってしまいます。また、ある時期までは、クロームとインターネットを両方インストールすることができますが、現在では、クロームが標準となっていて「インターネット」ブラウザは入っていない場合があります。だとすると、過去のアプリケーションは動かなくなってしまいます。

同様にアンドロイド自身も機能が追加され強化されていきます。アプリが古い機能をいつまでも呼び出していたら、せっかくの最新のアンドロイドも無駄になってしまいます。

こうした問題を解決するため、インテントには、「相手を特定しない」で処理を依頼する機能があるのです。ただし、インテントというアンドロイドの機能では、相手を明示的に指定して処理を依頼することもできます。

インテントは、多くのアプリケーションが持つ「シェア」機能でも使われています。シェア機能は、アプリケーション間でデータを受け渡す機能で、多くの場合、シェアアイコン(3つの点を結んだアイコン)やメニューから起動できます。シェア機能の動作は選択した相手により決まります。たとえば、メールアプリを選べば添付ファイルに、SNS系アプリなら投稿になり、Bluetoothならば、ファイル転送などになります。

このとき、「ACTION_SEND」というアクションが選択されていて、このアクションに応答できるアプリが、表示されるようになります。ただし、元のアプリが扱っているデータにより、リストに表示されるアプリには違いがあります。

また、インテントは、アンドロイドのシステムが、実行中のアプリに対して、さまざまな通知(ブロードキャスト)を行うためにも利用しています。たとえば、ユーザーが時計の設定やタイムゾーンを変更したとき、時間に関する処理を行っているアプリ(たとえば時計アプリ)は、その変化を即座に知る必要があります。しかし、常に時計の状態を見張っているわけにもいきません。このような場合にアプリは、時刻変更に関するブロードキャストを受け取るように設定しておきます。

インテントを観察する

アプリケーションは、以下のような条件(パラメーター)を使ってインテントを行います。

  • アクション(何をしてほしいか)
  • データ(渡すだけでなく貰うこともある)
  • データ形式(テキスト、画像など)
  • カテゴリ(相手アプリのタイプ)

アクションには、(表01)のようなものがありますが、多くは「ACTION_VIEW」(データの表示)や「ACTION_SEND」(共有)です。また、アプリは独自のアクションを定義することもできます。これは、同じ開発者のアプリやアプリに含まれる複数のモジュール間などで機能の呼び出しなどに使われます。他のアプリでも開発者が情報を公開していれば、呼び出すことは不可能ではありませんが……。

■表1
アクション 動作
ACTION_MAIN 対象アプリの主となるアクション
ACTION_VIEW 表示する
ACTION_ATTACH_DATA 添付データ
ACTION_EDIT 編集する
ACTION_PICK データからアイテムを選択して戻す
ACTION_CHOOSER 選択画面を表示してユーザーに処理先を選択してもらう
ACTION_GET_CONTENT ユーザーにデータを選択してもらう
ACTION_DIAL 指定されたデータでダイヤルする
ACTION_CALL 指定されたデータで相手を呼び出す
ACTION_SEND 共有(データの受け渡し)
ACTION_SENDTO 相手を指定してメッセージを送る
ACTION_ANSWER 電話の着信を受ける
ACTION_INSERT コンテナ(データの入れ物)に空のアイテムを挿入
ACTION_DELETE コンテナからデータを削除
ACTION_RUN 起動する
ACTION_SYNC 同期を行う
ACTION_PICK_ACTIVITY アクティビティ(アプリ)を選択する
ACTION_SEARCH 検索を実行する
ACTION_WEB_SEARCH インターネット検索を行う
ACTION_FACTORY_TEST 工場時検査を実行する

インテントではデータを渡す(たとえば他のアプリに表示してもらう)、貰う(画像を取得する)などがあります。また、データの形式(テキストや画像ファイル形式など)も同時に指定します。

また、相手を特定しない場合、カテゴリを使って、おおまかな相手アプリのタイプを指定することもあります。このほか、「フラグ」や「エクストラ」と呼ばれる附加情報が使われることもあります。これらは、動作を指定したり、データの受け渡し方法などを指定しますが、必ずしも指定されるとは限りません。

インテントからの呼び出しに応じるアプリは、すべて開発時に、対応できるアクションやデータ形式を「マニフェスト」と呼ばれる情報に登録します。アプリケーションがインストールされるとき、アンドロイドは、この情報を記録して、他のアプリからの呼び出しが行われたときに、条件を満たすアプリを「検索」します。

実際にインテントが行われている様子ですが、開発用に作られたアプリを使うことで、どのようなインテントが行われたのかを知ることができます。ここでは、「Intent Intercept」というアプリを使って見ます。たとえば、「フォト」アプリで、写真を選択して共有を行ってみましょう。このとき共有先に「Intent Intercept」を指定すると、どのようなインテント呼び出しが行われたのかがわかります(写真02)。

写真02: フォトアプリで写真を「共有」したとき。アクションがSENDになっていて、データ形式(TYPE)はJPEGファイルになっている

アクションは「共有」なので「SEND」、データのタイプは「image/jpeg」(いわゆるJPEGファイル)です。

他のアプリ、たとえば、青空文庫をアクセスして作品一覧を表示する「青空プロバイダ」で作品を選び、「テキストをダウンロードして閲覧」と「XHTMLをダウンロードして閲覧」の2つを行ってみます。前者と後者では、データのタイプが違っていて、テキストの場合には「text/plain」(写真03)、後者は「text/html」(写真04)になります。これに伴い、対応するアプリが変わります。

写真03: 青空プロバイダで「テキストをダウンロードして閲覧」を実行したとき。データ形式がtext/plainでアクションはVIEW

写真04: 同「XHTMLをダウンロードして閲覧」の場合、データ形式がtext/htmlとなり、テキストの場合とは違うアプリがリストアップされている

本稿は、2015年4月3日にAndorid情報のWeb専門誌「AndroWire」に掲載した記事を再構成したものです。