Activity — とは、Androidのアプリ画面とそのライフサイクル

著者: IT Sectr 公開日: 2026-02-22 読了時間: 7 分

Activity — ユーザーインターフェースを備えた単一の画面を表す、Androidアプリケーションの基本コンポーネントです。システムは厳格なライフサイクル(コールバック:onCreate、onResume、onDestroy)を通じて画面を管理します。各ActivityはAndroidManifest.xmlで宣言され、Intentを介して起動されます。Androidの歴史について詳しくは、Google公式ドキュメントをご覧ください。

重要なポイント

  • Activity — UIを備えた単一の画面を表すAndroidコンポーネント。Lifecycleを通じて管理
  • ライフサイクルには6つのコールバックが含まれる:onCreate、onStart、onResume、onPause、onStop、onDestroy
  • Intent — Activityを起動し、画面間でデータを受け渡す仕組み
  • Manifest — AndroidManifest.xmlへの各Activityの必須登録
  • ViewModel — Activity再作成時にデータを保持するためのJetpackコンポーネント

Activityとは?

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のライフサイクル

Activityのライフサイクルは、画面が作成から破棄までに経由する一連の状態とコールバックです。Lifecycleを理解することは非常に重要です:状態の誤った処理はメモリリーク、データ損失、アプリケーションのクラッシュにつながります。

Androidシステムは厳密な順序でコールバックを呼び出します。開発者はリソースの初期化、データ保存、メモリ解放のために必要なメソッドをオーバーライドします。各コールバックには対応するペアがあります:onCreate ↔ onDestroy、onStart ↔ onStop、onResume ↔ onPause。

コールバック目的開発者のアクション
onCreateActivity作成時に呼び出されるUIの初期化、ViewModelへの購読
onStartActivityが表示されるアニメーション、カメラ、GPSの開始
onResumeActivityが入力フォーカスを取得動画、タイマーの再開
onPauseActivityがフォーカスを失う下書きの保存、アニメーションの停止
onStopActivityが別の画面で隠れる重いリソースの解放
onDestroyActivityが破棄される購読のクリーンアップ、Closeable

Activityの状態

Activityには4つの状態があります:Running(onResumeがアクティブ)、Paused(表示されているがフォーカスなし)、Stopped(非表示)、Destroyed(破棄)。システムはメモリ不足時にStopped状態のActivityを強制終了することがあります — データはonSaveInstanceStateで保存する必要があります。

ライフサイクルメソッド:onCreate、onStart、onResume

Kotlinの例を用いて、Activityライフサイクルの3つの主要メソッドを見てみましょう。onCreate — エントリポイントで、一度だけ呼び出されます。ここでsetContentViewによるレイアウトのバインディング、RecyclerViewの初期化、LiveDataへの購読が行われます。onStart — Activityがユーザーに表示されます。onResume — Activityがフォーカスを取得し、操作可能な状態になります。

kotlin
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で停止された動画を再開します。この分割により、バックグラウンドでの不要な処理を防ぎます。

AndroidManifest.xmlでのActivity宣言

ActivityはAndroidManifest.xmlファイルで宣言する必要があります。登録がない場合、システムは画面を見つけられず、ActivityNotFoundExceptionをスローします。マニフェストでは、クラス名、テーマ、画面の向き、launchMode、Intentフィルターが指定されます。

xml
<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 — 実行するアクションを記述するオブジェクトです。Activityのコンテキストでは、Intentはデータを受け渡しながら別の画面を起動するために使用されます。Intentには明示的(特定のクラスを指定)と暗黙的(アクションを指定し、システムが適切なコンポーネントを選択)があります。

kotlin
// 明示的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とも連携します。

kotlin
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つのメカニズムを提供しています:onSaveInstanceStateViewModelです。

onSaveInstanceStateはonDestroyが呼ばれる前にBundleに単純なデータを保存します。JetpackのViewModelはActivityの再作成に耐え、メモリ内にデータを保持するため、複雑なオブジェクトやネットワークリクエストに対してより効率的です。

kotlin
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())
    }
}

Single ActivityアーキテクチャとJetpack

Googleの最新アプローチは、1つのActivityと複数のFragmentを使用するSingle Activityアーキテクチャです。アプリは1つのMainActivityを使用し、すべてのナビゲーションはNavigation ComponentがNavHostFragmentを通じて処理します。利点:ナビゲーションの集中管理、画面ごとの共有ViewModel、Deep Linksの正しい処理。

Jetpack Navigation Componentはバックスタック管理、遷移アニメーション、引数の受け渡しを自動化します。NavHostFragmentはActivityのレイアウトに配置され、ナビゲーショングラフ(NavGraph)がすべての画面とそれらの間の接続を記述します。このアプローチはGoogleが新しいプロジェクトに推奨しており、Material Designの原則に従っています。

kotlin
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 — 独自のライフサイクルを持つ完全なアプリケーション画面です。Fragment — Activity内のUIの一部で、Activityの再作成に耐え、そのLifecycleに依存します。Activityは必須、Fragmentはオプションです。

1つのアプリケーションにいくつのActivityを含められますか?

制限はありません。各画面は通常、個別のActivityで表されます。シンプルなアプリなら1つで十分で、マルチ画面アプリの場合は5〜20個です。Googleは1つのActivityと複数のFragmentを推奨しています。

ActivityのlaunchModeとは何ですか?

launchModeは、タスクスタック内でActivityがどのように作成されるかを決定します。4つのモードがあります:standard(新しいインスタンスが作成される)、singleTop、singleTask(タスクごとに1つのインスタンス)、singleInstance(独立したタスク)。モードはAndroidManifest.xmlで設定します。

Activity間でデータを受け渡すには?

Intentを介します — プリミティブ、文字列、Parcelable、Serializableを含められるextras(putExtra)を持つオブジェクトです。返信のやり取りにはActivity Result APIを使用します — これはstartActivityForResultに代わる最新の型安全な方法です。

AndroidのConfiguration Changeとは何ですか?

Configuration Change — 設定変更(画面の回転、言語変更、キーボード)時のActivityの再作成です。システムはonDestroy → onCreateを呼び出します。データを保存するには、onSaveInstanceStateまたはJetpackのViewModelを使用します。

まとめ

  • Activity — ライフサイクルを通じて管理されるユーザーインターフェースを備えた単一画面を表す基本Androidコンポーネント
  • ライフサイクルは6つのコールバックで構成:onCreate、onStart、onResume、onPause、onStop、onDestroy — それぞれに厳格な目的がある
  • Intentは明示的および暗黙的な呼び出しを通じてActivityの起動と画面間のデータ転送を提供する
  • AndroidManifest.xmlでは名前、テーマ、画面の向き、フィルターとともに各Activityの必須登録が必要
  • ViewModel(Jetpack)はActivity再作成時にデータを保持し、onSaveInstanceStateでの手動保存を代替する
  • Navigation Componentを使用したSingle Activityアーキテクチャが、GoogleがAndroidプロジェクトに推奨する最新標準
  • launchModeはタスクスタック内のActivityの動作を制御:標準から独立画面用のsingleInstanceまで

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください