はじめに
本記事ではAndroidアプリ開発における、Intentとはという点について概要から、実際のIntentの使い方例を交えて解説していきたいと思います。
Intentとは
インテントとは、「何かを行う意図」という意味で、幅広い役割として利用可能ですが、特定のアクションをリクエストする時に使用できる、メッセージングオブジェクトのことを意味しています。例えば別の画面を開きたい時に、AndroidではActivity単位で画面が作られますが、「開いている画面に対して別の画面を開いてください」とアプリにメッセージとして伝えることで、別の画面を開くことが可能になります。
今回は基本的な使い方として、「Activityを起動する」、「Serviceを起動する」、「ブロードキャストを配信する」の3点をIntentを使った例として紹介します。
Activityを起動する
まずActivityを起動する例について、Activityについて詳しく知りたい方は下記記事をご覧ください。
簡単にActivityについて説明しておくと、Activityはアプリにおいて1つの画面を表しています。Activityがあることでユーザーは画面を用いて、何かしらのボタンを押すことが出来たり、処理を行うことが出来るのです。
Intentを用いることで、別のActivityを開始することが出来ます。下記の例は、MainActvitiyからSampleActivityに遷移させる時のコード例です。
val intent:Intent = Intent(this,SampleActivity().javaClass)
startActivity(intent)
Intent(this,SampleActivity().javaclass))というのがIntentのメッセージの内容を示しており、thisはMainActivityの事なので、Intentには「MainActivityからSampleActivityを開く」という意味が込められていることになります。
そしてstartActivityという関数にintentを受け渡すことで、処理が行われます。
また、上記の例でSampleActivityから何かしらの結果を受け取りたい場合は、startActivityForResult()という関数を呼び出すことで、MainActivityでSampleActivityの結果を受け取ることができます。こちらについては最初に下記のようにAcitivtyを開始させます。
startActivityForResult(intent,1)
1というのはREQUEST_CODEなので、Int型であれば何でも大丈夫です。
その後、MainActivityに画面が戻った時に、onActivityResultというコールバック関数でデータなどを受け取ることが可能です。
Intentにデータを含める方法は後述します。
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
}
Serviceを起動する
続いて、Intentを使ったServiceについてですが、Serviceとは「ユーザーインターフェースを持たず、バックグラウンドで操作を実行するコンポーネント」を表しています。例えば音楽アプリの場合だと、音楽をバックグラウンドでも再生したいという際などに、Serivceを用いて可能にします。
Serivceを起動するにはIntentを利用する必要があり、SampleServiceというServiceを継承させたクラスの場合には、下記のように実行します。
val intent:Intent = Intent(this,SampleService().javaClass)
startService(intent)
使い方としては、Activityとほぼ同じになります。また、Android 5.0(APIレベル21)以降では、サービスを開始するためにJobSchedulerを利用することができます。JobSchedulerの場合には、通常Intentを使わないで利用されますので、こちらについては別記事で説明します。
ブロードキャストを配信する
最後にブロードキャスト配信についてです。ブロードキャストという言葉にはネットワークを学んだことがある方であれば馴染み深いと思いますが、「全員に送る」というような意味が込められています。すなわち、Androidアプリ開発におけるブロードキャストとは、全アプリに対して送ることが出来るメッセージを意味します。
下記がコード例ですが、Intentを用いてIntentに内容を詰め込み、sendBroadcastで送信することが出来ます。受け取るときはBroadcastReceiverというクラスを用いて、実際のデータを受け取ります。
Intent().also { intent ->
intent.setAction("com.example.intentapplication.broadcast.MY_NOTIFICATION")
intent.putExtra("data", "通知だよ!")
sendBroadcast(intent)
}
インテントタイプについて
インテントには2種類のタイプが存在します。インテントは何かしらのメッセージをリクエストするものというのは冒頭に説明しましたが、例えば「メールアプリを開く」という場合や、「マップアプリを開く」という動作を行いたい場合に、暗黙的インテントを利用することでユーザーに利用するアプリを選択させることが出来ます。
ここでは2種類のタイプの、「明示的インテント」と「暗黙的インテント」について説明します。
明示的インテント
明示的インテントとは、特定のアプリを指定した上で処理を実行させるパターンです。例えば「Activityを起動する」という項目がありましたが、こちらはMainActivity、すなわち自分自身のアプリのMainActivityに対して、自分自身のSampleActivityという画面を遷移させるコード例を見せましたが、これが明示的にアプリを指定して動作させているということになります。
暗黙的インテント
一方で暗黙的インテントでは、特定のアプリを指定するのではなく、OSに対して「地図を表示したい」というリクエストをインテントを通して伝えてあげることで、端末上で利用できるアプリを探し出し、選択できるようにすることができます。
下記の例では、いくつかのマップアプリをインストールした状態で、「地図を表示したい」という暗黙的インテントを発行した際に、表示されるものになります。OSがマップアプリと認識しているアプリに対して、ユーザーにどれを選ぶか選択させるような画面が表示されます。
インテントを使ってデータを渡す
最後にインテントを使って、何かしらのデータを送りたい時に、どんなデータが渡せることができ、どうやって渡すのかを説明したいと思います。
アクション
まず1つ目ですが、アクションというのは実行する「表示」や「選択」などのアクションを指定する文字列になります。これを利用することで、受け取る側はどんなアクションが来たかを判別できるようになります。
インテントに含める際には、下記のように記述します。
intent.setAction(Intent.ACTION_VIEW)
上記例ではACTION_VIEWというのを定義しており、ACTION_VIEWは「表示」という意味を表していて、マップアプリで住所を表示するときなどに利用されます。
またACTION_SENDというのは共有できるデータが有る場合になどに利用されます。例えばメールアプリを開くときなどに、相手のメアド情報のデータなどが該当します。
その他にもアクションはIntentクラス内で多数定義されていますので、確認してみてください。
データ
次にデータですが、こちらは何となく色んなデータを入れると思いがちですが、実際にはUriオブジェクトを代入します。例えばWebviewを使ってインターネットのサイトを開きたい場合、urlが必ず必要になりますので、このような場合にはインテントにurlを下記のように入れます。
intent.setData(Uri.parse("https://techgrowup.net"))
またUriとして画像データなどを送る際には、オーディオファイルなどとは区別しなければならないので、MIMEタイプを指定することになります。MIMEタイプはsetTypeで呼び出すことができ、下記のように指定します。
intent.setData(Uri.parse("file:///sdcard/sample.jpg"))
intent.setType("image/jpeg")
カテゴリ
続いてカテゴリですが、こちらはコンポーネントの種類に対する追加情報を含めるためのものです。よく使われるカテゴリだと、CATEGORY_BROWSABLEやCATEGORY_LAUNCHERなどがあります。例えば下記の例だと、遷移先のActivityは、ウェブブラウザから開始してリンクで参照されているデータを表示することが出来ます。
intent.addCategory(Intent.CATEGORY_BROWSABLE)
カテゴリもIntentクラス内に多数のカテゴリが定義されていますので、興味がある方は見てみてください。
エクストラ
続いてエクストラについてですが、こちらはキーバリュ型で様々データを含めることが可能です。例えば遷移先のActivtiyに5という数値を渡したい場合には、下記のように渡します。
intent.putExtra("NUMBER",5)
NUMBERというのはキーのことで、このキーを元に遷移先のActivityで受け取るときは下記のようにして受け取ることが出来ます。
getIntent().getIntExtra("NUMBER",0)
第2引数の0というのはデフォルト値のことで、NUMBERというキーが存在しなかった場合は0を返すという処理になります。
その他にも、文字列や浮動小数点、論理型など様々なデータを含めることが可能です。
フラグ
最後がフラグになります。フラグはインテントのメタデータとして機能させることが出来るもので、こちらもIntentクラス内に多数の定義があります。例えば下記の例だと、Activityを新しいタスクとして定義することができるメタデータになります。
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
まとめ
今回はAndroidアプリ開発におけるIntentの概要から、実際の使い方を説明しました。またデータを送る際のコードと、受け取る時のコードなどを解説しました。
Intentはアプリ開発では画面遷移時やServiceを使うときなどに必ず使うものですので、ぜひ覚えておきましょう。