kotlinのintentについて

採用はこちら

Androidアプリ開発において Intent(インテント) は、単なる画面遷移用の仕組みではありません。

Intentは アプリ内外のコンポーネント同士をつなぐ公式な通信メカニズムであり、Androidアーキテクチャの根幹を支える存在です。

本記事では、Kotlinでの記述例を交えつつ、「概念 → 種類 → 構成要素 → データ受け渡し → 実務上の注意点」という順序で、誤解されやすいポイントを避けながら丁寧に解説します。

目次

Intentとは何か

Intentとは、「この処理をしたい」「この画面を開きたい」 という 意図 をAndroid OS に伝えるためのメッセージオブジェクトです。

Androidでは、以下のコンポーネントがすべて Intentを通して起動・連携 されます。

  • Activity(画面)
  • Service(バックグラウンド処理)
  • BroadcastReceiver(イベント通知)

つまり、Intentは「Androidにおける共通通信プロトコル」と考えるのが最も本質的です。

Intentが使われる代表的なシーン

  • Activity → Activity の画面遷移
  • アプリからブラウザ・カメラ・地図アプリを起動
  • Serviceの開始
  • Broadcastの送信

この中で最も頻出するのが Activity遷移 ですが、それはIntentの一部の使い道にすぎません。

Intentの2種類

Intentは、指定方法によって 2種類 に分かれます。

明示的Intent(Explicit Intent)

起動したいコンポーネント(クラス)を直接指定するIntent です。

主な用途

  • アプリ内の画面遷移
  • 自分のアプリ内Serviceの起動

Kotlin例

val intent = Intent(this, DetailActivity::class.java)
startActivity(intent)

特徴

  • 起動先が明確
  • OSによる解決処理が不要
  • 安全で予測可能

アプリ内処理の大半は明示的Intent が使われます。

暗黙的Intent(Implicit Intent)

「何をしたいか」だけを指定し、「どのアプリが処理するか」はOSに任せるIntent です。

例:Webページを開く

val intent = Intent(Intent.ACTION_VIEW)
intent.data = Uri.parse("https://www.google.com")
startActivity(intent)

この場合、

  • ACTION_VIEW を処理できる
  • https URI を扱える

という条件を満たすアプリ(ブラウザなど)が候補になります。

特徴

  • 他アプリ連携に必須
  • OSが適切なアプリを選択
  • 実行前に「対応アプリが存在するか」の確認が重要

Intentの構成要素

Intentは複数の情報を組み合わせて意味を持ちます。

要素説明
Action何をしたいか(例:ACTION_VIEW)
Data対象データ(URIなど)
CategoryIntentの性質・分類
Extras追加データ(値の受け渡し)
Component起動先コンポーネント(明示的Intent)

Categoryについての重要な補足

  • startActivity() で起動される Activity は
    通常 CATEGORY_DEFAULT を持っている必要があります
  • ブラウザや外部リンク経由で起動される場合は
    CATEGORY_BROWSABLE が必要になるケースが多い

Categoryは軽視されがちですが、Intentが「解決されるかどうか」を左右する重要要素です。

Extras:画面間のデータ受け渡し

Intentは Extras(追加情報) を通してデータを運べます。

渡す側

val intent = Intent(this, DetailActivity::class.java)
intent.putExtra("USER_ID", 123)
intent.putExtra("USER_NAME", "Yamada")
startActivity(intent)

受け取る側

val userId = intent.getIntExtra("USER_ID", 0)
val userName = intent.getStringExtra("USER_NAME")

注意点

  • キーの文字列は定数化するのが実務の基本
  • nullチェックを怠るとクラッシュ原因になる

ParcelableとIntent

複数の値をまとめたデータクラスを渡す場合、Parcelable がAndroid公式に最適化された方式です。

@Parcelize
data class User(
    val id: Int,
    val name: String
) : Parcelable
intent.putExtra("USER", user)
val user = intent.getParcelableExtra<User>("USER")

Serializableとの違い(正確な言い方)

  • Serializable
    • 実装は簡単
    • 処理が重くなりやすい
  • Parcelable
    • 実装はやや手間
    • Android向けに高速・省メモリ

Intent / Bundle経由のデータ受け渡しでは Parcelable が推奨
Serializableが「禁止」ではないが、実務では避けられる傾向

ServiceとIntent

IntentはService起動にも使われます。

val intent = Intent(this, MyService::class.java)
startService(intent)

ただし重要な注意

  • Android 8.0(API 26)以降
    バックグラウンドからの startService() は制限あり
  • 状況によっては例外が発生する

実務的な判断基準

  • 長時間処理 → Foreground Service
  • 遅延・条件付き処理 → WorkManager

「IntentでServiceを起動できる」は正しい
「常に startService でOK」ではない

BroadcastとIntent

val intent = Intent("com.example.MY_ACTION")
sendBroadcast(intent)
  • IntentはBroadcastReceiverにも送信可能
  • ただし近年のAndroidでは
    • 暗黙的ブロードキャスト制限
    • セキュリティ設定
    • 登録方法の違い

など、設計上の注意点が多い領域です。

Intent Filter(Manifest)

暗黙的Intentを受け取るにはAndroidManifest.xml に intent-filter を定義します。

<intent-filter>
    <action android:name="android.intent.action.VIEW"/>
    <category android:name="android.intent.category.DEFAULT"/>
    <data android:scheme="https"/>
</intent-filter>
  • action / data / category の組み合わせで解決される
  • 定義次第で「どんなIntentを受け取れるか」が決まる

実務での使い分けまとめ

用途推奨
画面遷移明示的Intent
他アプリ起動暗黙的Intent
値の受け渡しExtras
複雑なデータParcelable
長時間処理Intent + Foreground / WorkManager

まとめ

Intentは「画面遷移のための仕組み」ではなく、Android全体をつなぐ通信設計そのものです。

  • 種類を理解する
  • 構成要素を正確に把握する
  • OS制約(特にService周り)を意識する

ここまで押さえて初めて、「動く」だけでなく「事故らない」Android設計 ができます。

以上、kotlinのintentについてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次