起動画面のLaunchActivityを作る

起動画面の役目としては、こんな感じでしょうか。

  1. ブランドロゴをレイアウト読み込みよりも早く表示させる
  2. 表示時間を調整できる
  3. 履歴に残さない
  4. バックボタンで戻れないようにしておく

drawable/launch.xmlを作る

通常のレイアウトでImageViewを表示させると遅いので、まずは、ロゴ画像のdrawableを作ります。背景色は無指定の場合は黒になります。

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    <item android:drawable="@android:color/white" />

    <item>
        <bitmap
                android:gravity="center"
                android:src="@drawable/logo_launch" />
    </item>

</layer-list>

ロゴ画像を専用のテーマにセットする

ここでnoHistoryを設定して履歴に残らないようにします。テーマはピリオドで継承しても良いですし、独立したものでもお好きにどうぞ。

 <style name="AppTheme.Launch">
        <item name="android:windowBackground">@drawable/launch</item>
        <item name="android:noHistory">true</item>
 </style>

AndroidManifestにLaunchActivityを追加してテーマを適用する

<activity
            android:name=".LaunchActivity"
            android:theme="@style/AppTheme.Launch">

        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <action android:name="android.intent.action.VIEW" />

            <category android:name="android.intent.category.LAUNCHER" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
 </activity>

LaunchActivity

レイアウトは使わないのでsetContentViewなし。

/**
 *
 *  起動画面
 *
 *  起動ロゴを一定時間表示させてメイン画面への遷移を遅延させないと、アニメーションが省略される場合がある
 *  表示中にアプリを閉じると勝手に開かれてしまうのでキャンセル処理も必要になる
 *
 *  メイン画面への遷移をフェードアニメーションにしたい場合は startActivity の直後に overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out)
 *  メイン画面へ遷移後に finish して戻るボタンで戻れないようにしておく
 *
 */
class LaunchActivity: AppCompatActivity() {

    private val runnable = Runnable {
        val intent = Intent(this, MainActivity::class.java)
        startActivity(intent)
        finish()
    }

    // 表示時間はミリ秒
    private fun startLaunching(duration: Long = 200) {
        window.decorView.postDelayed(runnable, duration)
    }

    private fun cancelLaunching() {
        window.decorView.removeCallbacks(runnable)
    }

    override fun onStart() {
        super.onStart()
        startLaunching()
    }

    override fun onStop() {
        super.onStop()
        cancelLaunching()
    }
}

起動画面の存在意義

起動画面を作るのは手間がかかりますが、メイン画面の中に起動処理を書いてしまうと、画面構成を見直す時や、複数ヶ所での利用、レストア処理が必要になった時にとても困ります。起動画面からメイン画面へシームレスにアニメーションさせたい場合は専用のトランジションクラスも用意されていますので、起動画面は独立させておくのがオススメです。