Activity — ユーザーインターフェースを備えた単一の画面を表す、Androidアプリケーションの基本コンポーネントです。システムは厳格なライフサイクル(コールバック:onCreate、onResume、onDestroy)を通じて画面を管理します。各ActivityはAndroidManifest.xmlで宣言され、Intentを介して起動されます。Androidの歴史について詳しくは、Google公式ドキュメントをご覧ください。
重要なポイント
Activity — ユーザーとの対話のためのウィンドウを提供する、Androidアプリケーションの主要コンポーネントです。各Activityは個別の画面(タスク一覧、ログインフォーム、写真ビューアなど)を管理します。Androidシステムは要求に応じてActivityを作成し、他のアプリケーションがメモリを必要とするときに破棄します。
ActivityはAndroid 1.0(2008)で初めて登場し、現在もインターフェースの主要な構成要素であり続けています。Google(2026)によると、Google Playのアプリの98%が少なくとも1つのActivityを含んでいます。最新のアーキテクチャでは、Googleは1つのActivityと複数のFragmentを推奨していますが、従来のマルチ画面アプリケーションも一般的な手法として残っています。
Activity stack(バックスタック) — ナビゲーション履歴を保持するタスクスタックです。ユーザーが「戻る」を押すと、現在のActivityが破棄され、前のActivityが復元されます。システムはスタックを自動的に管理しますが、開発者はlaunchModeとIntentフラグを通じて動作を制御できます。
Activityのライフサイクルは、画面が作成から破棄までに経由する一連の状態とコールバックです。Lifecycleを理解することは非常に重要です:状態の誤った処理はメモリリーク、データ損失、アプリケーションのクラッシュにつながります。
Androidシステムは厳密な順序でコールバックを呼び出します。開発者はリソースの初期化、データ保存、メモリ解放のために必要なメソッドをオーバーライドします。各コールバックには対応するペアがあります:onCreate ↔ onDestroy、onStart ↔ onStop、onResume ↔ onPause。
| コールバック | 目的 | 開発者のアクション |
|---|---|---|
| onCreate | Activity作成時に呼び出される | UIの初期化、ViewModelへの購読 |
| onStart | Activityが表示される | アニメーション、カメラ、GPSの開始 |
| onResume | Activityが入力フォーカスを取得 | 動画、タイマーの再開 |
| onPause | Activityがフォーカスを失う | 下書きの保存、アニメーションの停止 |
| onStop | Activityが別の画面で隠れる | 重いリソースの解放 |
| onDestroy | Activityが破棄される | 購読のクリーンアップ、Closeable |
Activityには4つの状態があります:Running(onResumeがアクティブ)、Paused(表示されているがフォーカスなし)、Stopped(非表示)、Destroyed(破棄)。システムはメモリ不足時にStopped状態のActivityを強制終了することがあります — データはonSaveInstanceStateで保存する必要があります。
Kotlinの例を用いて、Activityライフサイクルの3つの主要メソッドを見てみましょう。onCreate — エントリポイントで、一度だけ呼び出されます。ここでsetContentViewによるレイアウトのバインディング、RecyclerViewの初期化、LiveDataへの購読が行われます。onStart — Activityがユーザーに表示されます。onResume — Activityがフォーカスを取得し、操作可能な状態になります。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val recyclerView = findViewById<RecyclerView>(R.id.rv_items)
recyclerView.layoutManager = LinearLayoutManager(this)
loadItems()
}
override fun onStart() {
super.onStart()
startLocationUpdates()
}
override fun onResume() {
super.onResume()
resumeVideoPlayer()
}
}この例では、onCreateがRecyclerViewを初期化してデータを読み込みます。onStartは位置情報の更新を開始します — これは画面が表示されているときのみ動作すべきリソースです。onResumeはonPauseで停止された動画を再開します。この分割により、バックグラウンドでの不要な処理を防ぎます。
各ActivityはAndroidManifest.xmlファイルで宣言する必要があります。登録がない場合、システムは画面を見つけられず、ActivityNotFoundExceptionをスローします。マニフェストでは、クラス名、テーマ、画面の向き、launchMode、Intentフィルターが指定されます。
<application
android:allowBackup="true"
android:label="@string/app_name"
android:theme="@style/Theme.MyApp">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".DetailActivity"
android:parentActivityName=".MainActivity" />
</application>exportedフラグは、他のアプリケーションがActivityを起動できるかどうかを決定します。メイン画面の場合はexported=true、内部画面の場合はfalseです。parentActivityName属性は標準の「上へ」ナビゲーション(Up Navigation)を有効にします。
Intent — 実行するアクションを記述するオブジェクトです。Activityのコンテキストでは、Intentはデータを受け渡しながら別の画面を起動するために使用されます。Intentには明示的(特定のクラスを指定)と暗黙的(アクションを指定し、システムが適切なコンポーネントを選択)があります。
// 明示的Intent — データを伴うDetailActivityの起動
val intent = Intent(this, DetailActivity::class.java).apply {
putExtra("item_id", itemId)
putExtra("item_name", itemName)
}
startActivity(intent)
// DetailActivityでのデータ取得
val itemId = intent.getLongExtra("item_id", 0L)
val itemName = intent.getStringExtra("item_name") ?: ""起動したActivityから結果を取得するには、Activity Result APIを使用します。これは非推奨のstartActivityForResultを置き換えるものです。新しいAPIは型安全で宣言的であり、Jetpack Composeとも連携します。
private val getResult = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()
) { result ->
if (result.resultCode == Activity.RESULT_OK) {
val data = result.data?.getStringExtra("result_key")
}
}
fun openPicker() {
val intent = Intent(this, PickerActivity::class.java)
getResult.launch(intent)
}画面の回転や設定変更時に、AndroidはActivityを再作成します — onDestroyとonCreateを順番に呼び出します。状態保存がない場合、ユーザーは入力データ、スクロール位置、選択項目を失います。Androidはこの問題を解決するために2つのメカニズムを提供しています:onSaveInstanceStateとViewModelです。
onSaveInstanceStateはonDestroyが呼ばれる前にBundleに単純なデータを保存します。JetpackのViewModelはActivityの再作成に耐え、メモリ内にデータを保持するため、複雑なオブジェクトやネットワークリクエストに対してより効率的です。
class MainActivity : AppCompatActivity() {
private val viewModel: MainViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// ViewModelが自動的にデータを保存
viewModel.items.observe(this) { items ->
updateAdapter(items)
}
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putInt("scroll_position", recyclerView.computeVerticalScrollOffset())
}
}Googleの最新アプローチは、1つのActivityと複数のFragmentを使用するSingle Activityアーキテクチャです。アプリは1つのMainActivityを使用し、すべてのナビゲーションはNavigation ComponentがNavHostFragmentを通じて処理します。利点:ナビゲーションの集中管理、画面ごとの共有ViewModel、Deep Linksの正しい処理。
Jetpack Navigation Componentはバックスタック管理、遷移アニメーション、引数の受け渡しを自動化します。NavHostFragmentはActivityのレイアウトに配置され、ナビゲーショングラフ(NavGraph)がすべての画面とそれらの間の接続を記述します。このアプローチはGoogleが新しいプロジェクトに推奨しており、Material Designの原則に従っています。
class MainActivity : AppCompatActivity() {
private val navController by lazy {
findViewById<NavHostFragment>(R.id.nav_host_fragment)
.navController
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// AppBar用のNavigationUIの設定
setupActionBarWithNavController(navController)
}
override fun onSupportNavigateUp() =
navController.navigateUp() || super.onSupportNavigateUp()
}よくある質問
Activity — 独自のライフサイクルを持つ完全なアプリケーション画面です。Fragment — Activity内のUIの一部で、Activityの再作成に耐え、そのLifecycleに依存します。Activityは必須、Fragmentはオプションです。
制限はありません。各画面は通常、個別のActivityで表されます。シンプルなアプリなら1つで十分で、マルチ画面アプリの場合は5〜20個です。Googleは1つのActivityと複数のFragmentを推奨しています。
launchModeは、タスクスタック内でActivityがどのように作成されるかを決定します。4つのモードがあります:standard(新しいインスタンスが作成される)、singleTop、singleTask(タスクごとに1つのインスタンス)、singleInstance(独立したタスク)。モードはAndroidManifest.xmlで設定します。
Intentを介します — プリミティブ、文字列、Parcelable、Serializableを含められるextras(putExtra)を持つオブジェクトです。返信のやり取りにはActivity Result APIを使用します — これはstartActivityForResultに代わる最新の型安全な方法です。
Configuration Change — 設定変更(画面の回転、言語変更、キーボード)時のActivityの再作成です。システムはonDestroy → onCreateを呼び出します。データを保存するには、onSaveInstanceStateまたはJetpackのViewModelを使用します。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。