Android 12 スプラッシュ画面ページの適応について(1)

背景

決まり文句のコンテンツ、スタートアップページの適応。
Android 12 以降、アプリを起動すると、システムは慎重に「システムレベル」の起動ページを表示します。多くのアプリの元のスプラッシュ スクリーン ページ イベントのほとんどをカバーしています。その結果、多くのアプリのカスタマイズされたスプラッシュ スクリーン ページの表示時間が短縮され、表示できなくなることもあるため、適応が必要です。

環境

環境とは関係ありません。プロジェクトは実行および
コンパイルできます。コンパイル SDK は 12 以降である必要があります。

アイデア

公式の提案によると、解決策は以下の通りです。
(1) 古いビジネスをすべて新しい適応スタートアップ ページに移行する
(2) 古いスタートアップ ページを使用する (効果はあまり良くありません)
この記事では (2) の方法を使用して、妥協点を見つけます。

実装のアイデア

(1) オールラウンド適応のためのスプラッシュスクリーンの導入
build.gradleに実装
「androidx.core:core-splashscreen:1.0.0」を導入
起動ページで、setContentView() メソッドの前に、メソッド
installSplashScreen()を呼び出します
次に、SplashScreen オブジェクトを設定し
ます


setKeepOnScreenCondition は、Android 12 システムの起動ページを保持するスイッチです。コードは次のとおりです。

mSplashScreen.setKeepOnScreenCondition(object : 
			SplashScreen.KeepOnScreenCondition {
                override fun shouldKeepOnScreen(): Boolean {
                    Log.d("Splash", "Splash shouldKeepOnScreen")
                    return false
                }
            })

return falseは保持しないことを意味し、return trueは保持することを意味します。通常の状況では、false が返されると、メソッド
setOnExitAnimationListener() がトリガーされます。特殊なケースでは、一部のシステム rom がこの部分を去勢しており、そのようなコールバックはありません。このロジックも適応範囲に含める必要があります。
次に、起動ページとして使用するテーマを定義します。

    <style name="Theme.Splash" parent="Theme.AppCompat.Light.NoActionBar">
        <!--启动画面背景颜色-->
        <item name="android:windowSplashScreenBackground">@color/purple_200</item>
        <!-- 启动画面icon图标:这里可以是图片、帧动画等-->
        <item name="android:windowSplashScreenAnimatedIcon">@color/purple_200</item>
        <!--        <item name="windowSplashScreenIconBackgroundColor">@null</item>-->
        <!-- icon动画在关闭之前显示的时长:最长时间为1000毫秒-->
        <item name="android:windowSplashScreenAnimationDuration">1000</item>
        <!-- Splash退出后的主题-->
        <item name="postSplashScreenTheme">@style/Theme.AndroidJiaguChannel</item>
    </style>

コアコードは次のとおりです。

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // 初始化操作(必须放在setContentView()之前)
        val needToShow = isNeedShowSplash()
        val mSplashScreen: SplashScreen? = if (needToShow) installSplashScreen() else null
        setContentView(R.layout.activity_splash)
        if (needToShow && mSplashScreen != null) {
            // Splash展示完毕的监听方法
            mSplashScreen.setOnExitAnimationListener(object : SplashScreen.OnExitAnimationListener {
                override fun onSplashScreenExit(splashScreenViewProvider: SplashScreenViewProvider) {
                    Log.d("Splash", "Splash onSplashScreenExit")
                    mHadExitAnim = true
                    splashScreenViewProvider.remove()
                    toMainActivity()
                }
            })
            mSplashScreen.setKeepOnScreenCondition(object : SplashScreen.KeepOnScreenCondition {
                override fun shouldKeepOnScreen(): Boolean {
                    Log.d("Splash", "Splash shouldKeepOnScreen")
                    return false
                }
            })

            MainScope().launch {
                delay(200)
                if (mHadExitAnim) {
                    return@launch
                }
                //没有,按普通逻辑执行
                mHadExitAnim = true
                toMainActivity()
            }
        } else {
            toMainActivity()
        }
    }

    private fun toMainActivity() {
        Handler(Looper.getMainLooper()).postDelayed(Runnable {
            startActivity(Intent(this@SplashActivity, MainActivity::class.java))
        }, 3000)
    }

    /**
     * 是否需要启动闪屏页
     * */
    fun isNeedShowSplash(): Boolean {
        return (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S)
    }

ここにはMainScopeの遅延(200)があり、国内の一部のシステムでROM去勢によりsetOnExitAnimationListenerがコールバックを持たない状況に適応するために使用されており、これが必須であり、そうでないと次のページに入れない機種もある。

(2) ネイティブ アダプテーションを使用する
ネイティブ アダプテーションの考え方は (1) とほぼ同じです。違いは、適応のためにサードパーティの依存関係が導入されていないことです。システムの起動ページは、ページの描画が開始された瞬間にのみ終了します。コアコードは次のとおりです。

    private var mHadExitAnim = false

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_splash2)

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
            Log.d("Splash", "Splash 2 安卓12以上")
            splashScreen.setOnExitAnimationListener {
                Log.d("Splash", "Splash 2 setOnExitAnimationListener")
                it.remove()
                mHadExitAnim = true
                toMainActivity()
            }

            MainScope().launch {
                delay(200)
                if (mHadExitAnim) {
                    return@launch
                }
                //没有,按普通逻辑执行
                mHadExitAnim = true
                toMainActivity()
            }
        } else {
            Log.d("Splash", "Splash 2 安卓12以下")
            toMainActivity()
        }


    }

    private fun toMainActivity() {
        Handler(Looper.getMainLooper()).postDelayed(Runnable {
            startActivity(Intent(this@SplashActivityOnly, MainActivity::class.java))
        }, 3000)
    }

要約する

これらは現在、より一般的な方法です。方法 (1) の場合、高度にカスタマイズ可能ですが、システムのスプラッシュ スクリーン ページの使用が強制されます。(2) の場合、システムのスプラッシュ画面ページの表示時間が短縮されるだけです。
上記は、スタートアップ ページを調整するためのいくつかのアイデアです。最後に、公式リンクが添付されています:
https://developer.android.google.cn/guide/topics/ui/splash-screen/maigrate?hl=zh-cn

それだけです - - - - - - - - - - - - - - - - - - - - - - - - -------------------------------------------

おすすめ

転載: blog.csdn.net/motosheep/article/details/132908312