首页 > 其他分享 >Android启动窗口SplashScreen

Android启动窗口SplashScreen

时间:2024-06-02 14:32:56浏览次数:24  
标签:界面 启动 添加 设置 窗口 Android 方法 SplashScreen

Android启动窗口SplashScreen

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


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

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

1、一般需要较长时间加载的应用启动窗口的作用更明显,所以可以实现个简单的Activity作为欢迎界面,待准备工作加载完成后,即可跳转到正式界面,这里使用Activity可能较慢,也可以自己实现窗口,如在application中启动时使用windowmanager的addView接口添加一个自己实现的窗口,在加载完成后将其移除即可

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

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

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

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

ActivityRecord.java-showStartingWindow

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

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

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

其中AppWindowToken的getStartingWindowType方法逻辑如下

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信息可看到有如下窗口,这就是启动窗口的窗口,也是这里主要介绍的逻辑(如下是设置的启动窗口)

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

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

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

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

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

再看下mAddStartingWindow的逻辑:

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

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

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

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

1、windowAnimationStyle

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

2、windowSplashscreenContent

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

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

标签:界面,启动,添加,设置,窗口,Android,方法,SplashScreen
From: https://www.cnblogs.com/luoliang13/p/18226982

相关文章

  • 基于Android的XX校园交流APP
    摘要这个App的设计主要包括前台页面的设计和方便用户互动的后端数据库,而前端软件的开发则需要良好的数据处理能力、友好的界面和易用的功能。数据要被工作人员通过界面操作传输至数据库中。通过研究采用MVP结构设计,使用Java开发语言开发,采用ssm架构以及MySQL数据库进行设......
  • springboot基于Android的记录生活APP
    摘要本文拟采用Android平台进行开发,使用java技术和Springboot搭建系统框架,后台使用MySQL数据库进行信息管理,设计开发的记录生活APP。通过调研和分析,系统拥有管理员和用户两个角色,主要具备登录注册,个人信息修改,用户管理,运动项目管理,食物类型管理,新闻资讯管理,食品分析管理,套......
  • 基于Android的跳蚤市场
    摘要伴随着我国社会的发展,人民生活质量日益提高。互联网逐步进入千家万户,改变传统的管理方式,以互联网为基础,利用java技术,结合SpringBoot框架和MySQL数据库开发设计一套跳蚤市场,提高工作效率的同时,减轻管理者工作方面的压力,使他们能够将更多精力投入到市场上,更好的完成用户......
  • Android基础-数据库
    在Android系统中,数据库扮演着至关重要的角色,它负责存储、管理和检索应用程序所需的数据。随着移动应用的日益复杂和功能的不断增加,对数据库的需求也日益提高。在Android中,有多种数据库管理系统和工具可供选择,其中最为常见和广泛使用的是SQLite数据库。下面将详细介绍Android系......
  • Qt for Android 轻松解决编译器无法被识别问题!!
        相信很多小伙伴,也碰到过这种问题。明明下载Qt时,勾选了安卓组件,JDK,NDK、SDK都配置成功,但还是没有安卓编译器,或者是编译器前面有黄色感叹号,无法使用编译器。下面有解决办法。    解决方法:        1、Qt缓存导致(解决大部分问题):        ......
  • Android配置Framework开发环境
    联系作者:私信或者个人主页1.解决的问题Android开发中,有很大一部分是Framwrok定制开发,即需要阅读、修改frameworks仓库下的java代码,本文解决如何配置一个好用的framework跳转环境问题。本文介绍的是使用aidegen+androidstudio配置。首先简单介绍一下aidegen是什......
  • Android/iOS 应用内评价功能
    应用内评价,即应用中就能拉起对应商店的对应App的评价窗口,而无需用户到商店App内评价目前整理到有应用内评价功能的平台:Android-GooglePlayiOS-AppleStoreAndroid-GooglePlay应用内评价publicinterfaceGooglePlayFlowListener{voidOnCompleteListener();......
  • AndroidStudio资料
    AndroidStudio导入jar包  Switch语句报错Constantexpressionrequired   AndroidStudio中怎样引用图片资源   新版本Logcat使用详解java反编译jar包并修改class重新打包   Jar包反编译后修改源码再编译java.lang.NoClassDefFoundError:Failedresolutionof:......
  • 50.Android网络编程的补充
    主要分为三点补充1.get和post方式请求访问网络记得一定要处理异常packagecom.example.four_content;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStream;importjava.io.InputStreamReader;importjava.io.OutputStream;importjav......
  • dotnet C# 创建 X11 应用时设置窗口背景颜色
    本文将告诉大家如何在X11里面创建一个窗口时,设置窗口的背景颜色在dotnetC#设置X11应用窗口背景透明的基础上,可以通过创建XColor结构体,将XColor赋值给到XSetWindowAttributes的background_pixel进行设置窗口的初始化背景颜色核心实现如下先创建XColor结构体,代......