アンドロイドを使っていると、ときどき、アプリが画像や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)。
アクションは「共有」なので「SEND」、データのタイプは「image/jpeg」(いわゆるJPEGファイル)です。
他のアプリ、たとえば、青空文庫をアクセスして作品一覧を表示する「青空プロバイダ」で作品を選び、「テキストをダウンロードして閲覧」と「XHTMLをダウンロードして閲覧」の2つを行ってみます。前者と後者では、データのタイプが違っていて、テキストの場合には「text/plain」(写真03)、後者は「text/html」(写真04)になります。これに伴い、対応するアプリが変わります。
写真03: 青空プロバイダで「テキストをダウンロードして閲覧」を実行したとき。データ形式がtext/plainでアクションはVIEW |
写真04: 同「XHTMLをダウンロードして閲覧」の場合、データ形式がtext/htmlとなり、テキストの場合とは違うアプリがリストアップされている |