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など) |
| Category | Intentの性質・分類 |
| 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についてでした。
最後までお読みいただき、ありがとうございました。










