本連載の書籍化について(2018年5月追記)
本連載は、加筆・再構成およびAndroid Studio 3対応を行い、書籍化しています。最新情報については、こちらもぜひ併せてご参照ください。
対象読者
- Androidアプリ開発未経験な方
- Java言語は一通り習得済みである方
サンプルプロジェクト作成
では、今回使用するサンプルアプリを作成していきましょう。以下がプロジェクト情報です。
- Application name:ImplicitIntentSample
- Company Domain:android.wings.websarva.com
- Package name:com.websarva.wings.android.servicesample
- Project location:C:\…任意のワークフォルダ…\ServiceSample
- Phone and Tablet Minimum SDK:API 15
- Add an activity:Empty Activity
- Activity Name:IntentStartActivity
- Layout Name:activity_intent_start
strings.xml、activity_intent_start.xmlはダウンロードサンプルのソースコードをコピーしてください。
この状態で、一度アプリを起動してみてください。以下のような画面になっているはずです。
前回までと同様に、ボタン処理は記述されていないので、タップするとアプリがエラーで終了します。
これからその処理を記述していきます。大まかな流れですが、今までのアプリとの大きな違いは外部のアプリと連携することです。AndroidではOS付属のアプリが存在します。今回のサンプルでは「地図検索」および、「地図表示」ボタンをタップすると、OS付属の地図アプリが起動するようにします。「地図検索」ボタンでは入力されたキーワードで地図上を検索し、その部分を表示します。「地図表示」ではGPSから取得した現在地を地図表示します。
なお、今回の機能は実機に依存するものですが、GPSに関してはAVDで疑似的に再現できます。その方法も解説します。
暗黙的インテント
さて、実際のコーディングに入る前に、今回のアプリ間連携のキモとなる暗黙的インテントについてあらかじめ解説しておきましょう。
これまでの連載中でいろいろなサンプルで使ってきたインテントですが、それらはすべてアプリ内の画面遷移で使われてきました(一部、サービスの起動でも使いましたが)。このようにアプリ内の画面遷移で使われるインテントのことを「明示的インテント」といいます。なぜ、明示的かというと、ソースコードを見れば一目瞭然です。Intentオブジェクトを作成するときに、
Intent intent = new Intent(CityListActivity.this, WeatherInfoActivity.class);
のように記述します。この第2引数はこれから起動するアクティビティを表しますが、クラスそのものを「明示的」に指定しています。
一方、暗黙的インテントは、このように起動するアクティビティを明示しません。代わりに、「どのようなアクティビティを起動してほしいか」をIntentオブジェクトに埋め込み、実際にどのアクティビティを起動するかはOSにゆだねます。下図を参照してください。
この図のように、起動するアクティビティをURIの形でIntentに埋め込み、それをOSに渡します。OSはURIから起動するアクティビティを探し出して起動します。特に、アプリから別のアプリを起動させる場合、通常は起動先アプリのActivityクラスが不明なので、この暗黙的インテントの方式をとります。
なお、例えばブラウザのように、起動先として指定したアプリに同じ種類が複数存在する場合は、下図のようにアプリチューザという選択メニューが表示されます。