当前位置: 首页 > news >正文

Android中性能优化——白屏避免

在 Android 应用启动过程中,避免白屏/黑屏的关键在于正确处理 启动主题(Launch Theme) 的绘制时机。

1. 白屏的产生原因

  • 当用户点击应用图标时,系统会创建进程并初始化应用组件(如 Application 和 MainActivity)。

  • 在 Activity 完成布局绘制前,系统会先绘制 Activity 的默认背景(由主题的 android:windowBackground 定义)。

  • 如果主题的 windowBackground 是白色(或黑色),且初始化耗时较长,用户会看到短暂的白屏/黑屏。

2. 避免白屏的核心方法

通过自定义启动主题的 windowBackground,在 Activity 绘制前显示一个预设界面(如 Logo、背景图),而非空白。

3. 实现步骤

(1) 定义启动主题(Splash Theme)
<!-- styles.xml -->
<style name="Theme.Splash" parent="Theme.AppCompat.Light.NoActionBar"><!-- 关键属性:设置自定义背景 --><item name="android:windowBackground">@drawable/splash_background</item><item name="android:windowFullscreen">true</item>
</style>
(2) 创建背景 Drawable
<!-- res/drawable/splash_background.xml -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"><item android:drawable="@color/brand_color"/> <!-- 背景色 --><item><bitmapandroid:gravity="center"android:src="@drawable/app_logo"/> <!-- 居中 Logo --></item>
</layer-list>
(3) 在 Manifest 中应用主题
<activityandroid:name=".MainActivity"android:theme="@style/Theme.Splash"> <!-- 启动时使用此主题 --><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter>
</activity>
(4) 在 Activity 中切换回主主题
public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 切换到应用正常主题(避免后续界面使用启动主题)setTheme(R.style.Theme_MyApp);setContentView(R.layout.activity_main);}
}

4. 关键时机说明

  • 绘制发生在哪里?
    白屏的替代画面是由系统在 Activity 创建后、布局渲染前 自动绘制的,依赖主题的 windowBackground 属性。

  • 与 Application 的关系?
    虽然 Application 的 onCreate() 是最早执行的初始化代码,但白屏控制主要依赖 Activity 主题,而非 Application 中的逻辑。

5. 优化建议

  • 减少初始化耗时:在 Application.onCreate() 中避免耗时操作(如网络请求、IO),使用后台线程或延迟加载。

  • Android 12+ 适配:从 Android 12 开始,使用 SplashScreen API 替代自定义主题,提供标准化启动画面。

  • 避免复杂布局:启动背景尽量简单(纯色 + Logo),以加速绘制。

总结

白屏的避免是通过 自定义启动主题的 android:windowBackground 实现的,系统在 Activity 创建后立即绘制该背景,因此用户感知到的第一个画面是预设的启动图而非白屏。此过程发生在 Application 初始化之后、Activity 布局渲染之前,属于系统级行为,无需手动绘制代码。

http://www.dtcms.com/a/316756.html

相关文章:

  • Makefile基础
  • C/C++ 宏中 `do { ... } while (0)` 的“零次循环”技巧
  • Windows 远程管理 (WinRM)问题详解包括c#与python例子
  • vue - - - - 18n高级使用(插入变量)
  • Pycharm 2025.2 免登陆试用
  • Centos-Stream 10 安装教程(2025版图文教程)
  • [激光原理与应用-152]:光学器件 - 光栅,一种由周期性排列的等宽等间距结构组成的光学元件,通过衍射和干涉实现光的分光、调制或测量功能的光学元件
  • 详细讲述优雅草蜻蜓I即时通讯私有化中xmpp服务中的tigase的角色与作用深度分析-卓伊凡|bigniu
  • 【Istio系列--Istio基础理论和部署】
  • leetcode 104.二叉树的最大深度
  • 数据结构3-双向链表、循环链表
  • 14.Home-新鲜好物和人气推荐实现
  • 大模型|极简说清“数据并行”
  • 06-队列
  • Crawl4AI:开源的AI友好型网页爬虫与数据抓取工具
  • 电子秤利用Websocket做为Client向MES系统推送数据
  • 软件测试——接口自动化
  • STM32内部读写FLASH
  • 90、【OS】【Nuttx】【启动】栈溢出保护:配置项解析
  • Swift 实战:用队列巧解 LeetCode 346 数据流中的移动平均数
  • 服务器端口连通性的测试工具和方法
  • XXL-JOB调度中心、执行器、Job之间的关系
  • MQTT:消息详解
  • 备忘录记事本 任务清单 html
  • 基于铁头山羊STM32的平衡车电机转速开环闭环matlab仿真
  • 线性规划最优解
  • 饿了么招java开发咯
  • tarjan找SCC,缩点建DAG,找唯一源头节点
  • 强光干扰下误报率↓82%!陌讯多模态融合算法在火焰识别的落地优化
  • 不可变集合