很多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)懒加载 用到的时候再初始化,如网络,数据库操作。