你的App的主题位于
res/values/styles
<style name = "AppTheme" parent = "Theme.AppCompat.Light">
我们点击Light
主题进去,会发现此主题位于
app/build/intermediates/exploded-oar/com.android.support/appcompat-v7/25.1.0/res/values/values.xml
<style name = "Theme.AppCompat.Light" parent = "Base.Theme.AppCompat.light">
点击此Light
又会跳到
<style name = "Base.Theme.AppCompat.Light" parent = "Base.v7.Theme.AppCompat.light">
我们点击后面这个Light
进去又会跳到
<style name = "Base.v7.Theme.AppCompat.Light" parent = "Platform.Theme.AppCompat.light">
在这里他定义了一个
<item name ="windowNoTitle"> false </item>
这里有一个非常重要的选项
在他的父类
<style name = "Platform.AppCompat.Light" parent = "android.Theme.light">
中有一个
<item name ="android.windowBackground">@color/background_material_light</item>
而这个color就是白色
在v7包中的color中定义此色
<color name = "background_material_light">@color/material_grey_50 </color>
所以我们可根据windowBackground
去优化App启动的视觉感官
1> 我们可以在原来的AppTheme
主题下去加一行
<item name = "android : windowIsTransluncent>true</item>
这样我们在启动App时回去加载一个透明的背景,当然在用户层面看到的就是Launcher
桌面,过一会应用才会加载出来,强行甩锅给手机系统。
我们在应用启动后需要还原主题,我们需要在系统主Activity中去加载最开始的主题。
可以在主Activity
的onCreat
方法中去
setTheme(R.style.AppTheme)
这样在应用加载出来时又恢复了正常,只是手机System
需要背锅了
2> 如果想要彻底的优化根治app的启动时间,我们需要更加深入的了解app的启动以及一些测量app启动的方法
我们如和获知一个APP的启动时间呢
1> 我们在用logcat
抓取手机app启动的日志中去搜索 “dispaly” 关键字可获取该app的启动时间
2>可以使用adb命令去启动主Activity
去获取该app的启动时间
adb shell am start -W 包名/+全类名
比如
adb shell am start -W com.lqr.wechat/com.lqr.wechat.activity.SplashActivity
在控制台打印出日志中的 ThisTime
就是启动时间
在Launcher
上点击某个app的图标会直接调用到am
的startActivity
方法,该方法会将app分为方法区
,堆区
,java栈
三个部分
ActivityThread
的attach
方法会开启app,Application
再开启activity
,在调用attach
后会调用attach Application
远端进程调用handleBindApplication
去创建App,调用Application
的onCreat
方法也就是ActivityThread
中的mInstrumenttation.callApplicationOnCreat(app)
去启动
通过检查trace的方法在主线程中找到最耗时的方法看能否放在子线程中,放在子线程中的方法要复合以下几个特征:
1、没有创建handler
2、没有绘制UI
3、异步要求不是很高
除此以外如果是单例模式的话可以尝试用懒汉模式创建,这样在使用该对象的时候再去创建,节省资源
如果是对启动页要求不是很大的情况下可以加入
<item name = "android : windowDisablePreview">true</item>
意思为设置禁止启动项