背景
決まり文句のコンテンツ、スタートアップページの適応。
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
それだけです - - - - - - - - - - - - - - - - - - - - - - - - -------------------------------------------