Android启动窗口SplashScreen

首先介绍下什么是启动窗口,对于大部分应用冷启动时的场景都会有启动窗口,为了让效果更明显,在如下代码中(只是一个基本的可以运行的应用即可)添加了sleep5s的代码,在按recent键移除应用后,再点击桌面图标,即可看到启动窗口效果,即使点击后界面内容显示出来前的白色界面

image-20200627223615053.png

1596117549969.gif

启动窗口有什么用途呢,从逻辑及效果看,其应该主要是用于一个过渡,比如上述添加了5s延时的场景中,如果没有启动窗口,那么点击了桌面的应用图标后,会有5s多的时间用户看不到什么反应,会让用户觉得是不是应用没启动啊,我们可以试验下,可在style中添加
<item name="android:windowDisablePreview">true</item>
项,即可禁用启动窗口,如


image-20200627224321594.png

对用户和应用来说一个白色界面作为启动窗口可能不是很美观,也可以做一些自定义行为

1、一般需要较长时间加载的应用启动窗口的作用更明显,所以可以实现个简单的Activity作为欢迎界面,待准备工作加载完成后,即可跳转到正式界面

2、启动窗口界面内容本身有配置的方法,可通过配置
<item name="android:windowSplashscreenContent"> </item>
项来设置启动窗口的内容界面,显然这里可设置一个drawable,在添加启动窗口界面时,会将该drawable添加到启动窗口的内容视图中,如

image-20200627224150879.png

1596117876257.gif

另外可通过设置<item name="windowAnimationStyle"> </item>来设置相关动画,这里就不举例了

添加启动窗口代码逻辑(使用android-10.0.0_r39分支代码查看)

(添加时机,一般是前台task切换时可能会触发,比较特别地是一般新启动一个应用,或杀掉一个应用进程后启动该应用时,这种情况下一般都会有启动窗口,如设置、电话等应用新启动时,会先显示一个空白的界面,然后显示设置界面内容,那个空白的界面即其启动窗口)

ActivityRecord.java-showStartingWindow

image-20200627224821300.png

在这里会调用其addStartingWindow方法(ActivityRecord)

image-20200627225544058.png

显然,这里主要是调用了AppWindowToken的addStartingWindow方法,查看AppWindowToken的addStartingWindow方法,这里逻辑稍多,介绍下其主要部分

1、该方法中会调用getStartingWindowType方法根据场景获取需要启动窗口类型

image-20200627225858187.png

其中AppWindowToken的getStartingWindowType方法逻辑如下

image-20200627230030337.png

从上述代码可知getStartingWindowType方法可能返回三种值 STARTING_WINDOW_TYPE_NONE,STARTING_WINDOW_TYPE_SPLASH_SCREEN ,STARTING_WINDOW_TYPE_SNAPSHOT

返回类型为STARTING_WINDOW_TYPE_NONE时看其逻辑应该是无启动窗口的

返回类型为STARTING_WINDOW_TYPE_SPLASH_SCREEN时即可能会有场景中的启动窗口,比如在杀掉设置进程后(点击recent导航键,移除设置),点击设置图标后马上dumpsys window信息可看到有如下窗口,这就是启动窗口的窗口,也是这里主要介绍的逻辑(如下是设置的启动窗口)

image-20200627230345034.png

返回类型为STARTING_WINDOW_TYPE_SNAPSHOT时,会调用createSnapshot方法,这里也会临时添加一个特殊的窗口,比如进入设置后,回到桌面,点击recent导航键,然后点击,这里就不细将了

image-20200627230604007.png

2、如果theme中设置了windowIsTranslucent为true,或者设置了windowIsFloating为true,或者设置了windowDisablePreview为true,则不会添加启动窗口

image-20200627230838390.png

3、AppWindowToken的addStartingWindow方法的主要逻辑会创建一个SplashScreenStartingData对象,然后调用scheduleAddStartingWindow方法

image-20200627231001578.png

AppWindowToken的addStartingWindow方法就到这里了,继续跟踪其主要逻辑

scheduleAddStartingWindow方法主要是将一个mAddStartingWindow任务放到一个handler队首去执行

image-20200627231135203.png

再看下mAddStartingWindow的逻辑:

image-20200627231354809.png

这里mStartingData即是前面addStartingWindow中创建的SplashScreenStartingData对象(只针对这里STARTING_WINDOW_TYPE_SPLASH_SCREEN的情况),这里主要逻辑即调用SplashScreenStartingData的createStartingSurface方法

image-20200627231547302.png

显然,SplashScreenStartingData的createStartingSurface方法中调用了PhoneWindowManager的addSplashScreen方法而PhoneWindowManager的addSplashScreen方法也即是添加启动窗口的地方

image-20200627231806108.png
image-20200627231853737.png
image-20200627231958425.png
image-20200627232221316.png

如上即是PhoneWindowManager的addSplashScreen方法的代码,其主要部分就是创建一个PhoneWindow对象,然后设置些属性和视图(基本上应该是全屏,内容应该是根据theme相关只有框架的界面,具体内容一般为空白,有的有图标和标题),然后调用WindowManager服务的addView方法添加窗口

这里也有几个可设置相关属性的地方

1、windowAnimationStyle

image-20200627232535987.png

应该可以通过设置windowAnimationStyle设置相关动画

2、windowSplashscreenContent

image-20200627232650202.png

根据启动窗口调用的addSplashscreenContent方法,应该可以通过设置windowSplashscreenContent属性来设置启动窗口的内容图片

在添加启动窗口呼,待合适的时机,如应用界面绘制完成则会触发AppWindowToken的removeStartingWindow方法调用,然后移除启动窗口,这里就不细述了

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350