どうもこんにちは。
- スプラッシュスクリーンガチアンチ
- 既存のスプラッシュスクリーンから移行できない(クロスプラットフォームなどで)
- 電話アプリ(特に着信)、QRコードに限らず決済アプリ、カメラアプリ などの応答性が必要なアプリ で、ユーザーに「スプラッシュスクリーンなんて見せなくていいから早く起動しろよ!」と思われてしまう可能性がある方
そんな方へ捧げる。
答え
!公式で文書化されているわけじゃないので気をつけてください!
AndroidManifest.xml
の<application>
タグのtheme
に指定しているテーマに、
<item name="android:windowIsTranslucent">true</item>
を追加して、半透明なActivityとして認識させます。
(実際に半透明にするためにはまだ手を加える必要があるので、これを追記したところで半透明にはならない)
以下例です。
src/main/res/values/themes.xml
既存のテーマ/ Activity に変更入れたくない or 既存のスプラッシュスクリーン用Activityがある場合は
新しくスプラッシュスクリーンを無効にしたテーマを書きます。
次にアプリを起動したときにMainActivity
の代わりに表示するActivity
を作成します。
もう既にスプラッシュスクリーン用Activityがある場合はそれを使ってもいいです。
このActivityを経由してMainActivity
を表示させます。
そしたら、AndroidManifest
をこうです
その他、なにもないスプラッシュスクリーンでごまかす編
前書いたのでそっち見てください: Hello Android 12。スプラッシュスクリーン編
なんで消せるの?
AOSP
追いかけます。Code Searchでもブランチandroid-12.0.0-r1
が選べるようになっているので読めます。
多分間違えてると思うんでこっから先読まなくていいと思います。
Window_windowSplashScreenAnimatedIcon
で検索をかけます。SplashscreenContentDrawer.java
が引っかかります。
このクラスのcreateContentView()
がスプラッシュスクリーンを返してそうですね。このメソッドを読んでる部分を探します。
↓
StartingSurfaceDrawer.java
のaddSplashScreenStartingWindow()
メソッドの中で呼んでますね。でも条件分岐とか見てもそれっぽい事書いてないですね。
というわけでこのメソッドを読んでる部分を探します。
↓
StartingWindowController.java
のaddStartingWindow()
の中で呼んでますね。
ここのisSplashScreenType()
ってのがもしかしたら...!って思いましたが、違うみたいです。それじゃどっから呼ばれてるか探します。
↓
多分ShellTaskOrganizer.java
のaddStartingWindow()
ですかね。
そしてこれは
↓
TaskOrganizer.java
のITaskOrganizer
のaddStartingWindow()
で呼んでます。間違ってるかもしれん。
そして
↓
TaskOrganizerController.java
のTaskOrganizerCallbacks
のaddStartingWindow()
で呼んでますね。ここにtheme
がなんとかって書いてありますが多分違います。
そてしてこれは
↓
TaskOrganizerController.java
のTaskOrganizerState
のaddStartingWindow()
で呼んでますね。
そして
↓
TaskOrganizerController.java
のTaskOrganizerController
のaddStartingWindow()
で呼んでますね。
それっぽいことは書いてないなあというわけで読んでる部分を探し
↓
StartingSurfaceController.java
のcreateSplashScreenStatingSurface()
で呼んでますね。
そーしーてー
↓
SplashScreenStartingData.java
のcreateStartingSurface()
で呼んでますね。
そろそろ終わりかな?
↓
ActivityRecord.java
のAddStartingWindow
のrun()
の中で呼んでますね。
それっぽい処理はないので読んでる部分を探します
↓
ActivityRecord.java
でAddStartingWindow
のインスタンスを作成してるみたいです。
↓
ActivityRecord.java
のscheduleAddStartingWindow()
でAddStartingWindow
にあるrun()
メソッドを呼んでるみたいです。
↓
ActivityRecord.java
のaddStartingWindow()
に、それっぽい記述がありますよ?
resolvedTheme
とtheme
が気になりますのでもう少し読み進めてみる。
↓
ActivityRecord.java
のshowStartingWindow()
で呼んでますね。
evaluateStartingWindowTheme()
を見る。
validateStartingWindowTheme()
が気になる
↓
見つけたぞ!!!
if (windowIsTranslucent || windowIsFloating)
← 多分ここが true がになってこの関数の返り値がfalseになる。