APP启动优化之黑白屏问题

很多APP启动时会出现白屏或黑屏现象,原因是启动时执行了耗时操作。为避免此情况,有伪优化和真优化两种方式。伪优化是用背景图片作启动图;真优化则是优化程序,可通过adb命令查看启动时间、Trace工具分析代码执行时间,并采用开线程、懒加载等优化方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

很多APP启动时,会出现一会白屏或者黑屏的现象:

1、白屏 <style name="AppTheme" parent="Theme.AppCompat.Light"> 2、黑屏 <style name="AppTheme">(在以前的老版本上有效,现在的版本默认使用透明处理了) 

产生的原因是app启动时执行了耗时的操作,用户体验很不好,为了避免这种情况的发生,有两种方式可以使用:

伪优化

即用一张背景图片以广告等形式作为APP启动时的图片

找到父类name="Platform.AppCompat.Light"定义<item name="android:windowBackground">用来控制黑白屏 

解决办法:

1.在自己的<style name="AppTheme" parent="Theme.AppCompat.Light">中加入windowsbackground

2.设置windowbackground为透明的

<item name="android:windowIsTranslucent">true</item> 

但这2种方法会有个问题,所有的activity启动都会显示

3.单独做成一个主题

<style name="AppTheme.Launcher"> <item name="android:windowBackground">@drawable/bg</item> </style> <style name="AppTheme.Launcher1"> <item name="android:windowBackground">@drawable/bg</item> </style> <style name="AppTheme.Launcher2"> <item name="android:windowBackground">@drawable/bg</item> </style> 

 

再在功能清单中的单独activity下设置

<activity android:theme="@style/AppTheme.Launcher" 

然后在程序中使用setTheme(R.style.AppTheme);

让APP中所有的activity还是使用以前的样式,这样做就只有启动时才使用自己的样式

QQ中的用法 :

<item name="android:windowDisablePreview">true</item> <item name="android:windowBackground">@null</item> 

真优化

即优化程序,真正减少APP启动耗时的时间

1、adb命令查看启动时间

(1)4.4以前 adb shell am start -W com.lqr.wechat/com.lqr.wechat.activity.SplashActivity

ThisTime:最后一个启动的Activity的启动耗时;

TotalTime:自己的所有Activity的启动耗时;

WaitTime: ActivityManagerService启动App的Activity时的总时间(包括当前Activity的onPause()和自己Activity的启动)。

这些时间的打印在Am.java这个类中可以找到,Am.java的路径如下:

E:\tools\android-src\android-6.0.1_r1\frameworks\base\cmds\am\src\com\android\commands\Am.java 

Am.java 946行开始打印启动时间信息,其中一个result对象,在871行初始化 result = mAm.startActivityAndWait(。。。)

在这个初始化时就已经进行了时间的计算:

在android-src\android-6.0.1_r1\frameworks\base\services\core\java\com\android\server\am\ActivityRecord.java文件中计算 void windowsDrawnLocked() --->reportLaunchTimeLocked(SystemClock.uptimeMillis())中完成时间的统计; 

(2)4.4版本以后Logcat 输入Display筛选系统日志 不过滤信息No Filters

2、Trace工具分析代码执行时间

Debug.startMethodTracing(filePath); 中间为需要统计执行时间的代码 Debug.stopMethodTracing(); 

adb pull /storage/emulated/0/app1.trace把文件拉出来分析

把pull到电脑上的文件拖到AS中就可以分析了

3、优化方案:

(1)开线程 线程里面不能创建handler,不能操作UI ,对异步要求不高。

(2)懒加载 用到的时候再初始化,如网络,数据库操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值