本文借鉴了以下文章,对文章作者表示感谢:
- https://www.jianshu.com/p/e69d22ec0582
- http://blog.csdn.net/guolin_blog/article/details/51019856
- http://wuxiaolong.me/2017/03/13/appStart/
- https://www.jianshu.com/p/f5514b1a826c
- http://blog.csdn.net/luoshengyang/article/details/6689748
一、伸手党
按以下方法对工程进行优化后,冷启动速度将提升一大轱辘!
1、主题切换法
这个方法就相当于在系统自带的splash这里动手动脚(其实是系统启动app时activity还没有展示出来而加载的你在清单文件中的主题)。
首先先在styles文件中定义一个贼目(一般有两种,一种是这个东西就像个splash有一个短暂的图片展示,另一种直接让这里透明):
你一定会想先说图片的,no这里先上透明的:
<style name="AppTheme.Launcher" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowIsTranslucent">true</item>
</style>
当然图片的也不会放过:
<style name="AppTheme.Launcher" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowBackground">@drawable/appstart_background</item>
</style>
好了,以上随便选一个适合你的!
接下来清单文件中的干法是:
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme.Launcher">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
然后再在主界面恢复你想使用的骚主题吧:
public class MainActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTheme(R.style.SaoTheme);
setContentView(R.layout.activity_main);
}
}
做完这些就可以看看效果了,程序启动时不再时闪瞎眼的白屏或黑屏了,取而代之的是一张美丽的图片或一片迷人的透明。2、避免在application中做耗时的操作。若必须要做你就放在子线程吧!
3、让MainActivity干净一点,少一点嵌套啥的。
二、探索党
接下来来了解一下冷启动相关的小秘密吧!1、启动分为以下几种
- 冷启动:
- 热启动:
- 温启动:
2、冷启动的时候android都干么子了?
- 普通话版
2、App启动之后立即展示出一个空白的window,这里就是前面我的说的主题切换法做手脚的地方。
3、创建app
4、启动mainThread
5、加载View
6、布置屏幕
7、进行第一次绘制,一旦完成了第一次绘制,系统进程就会用MainActivity替换已经展示的Background Window,就可以交互了。
- 源码版 整个应用程序的启动过程要执行很多步骤,但是整体来看,主要分为以下五个阶段:
2、ActivityManagerService通过Binder进程间通信机制通知Launcher进入Paused状态;
3、Launcher通过Binder进程间通信机制通知ActivityManagerService,它已经准备就绪进入Paused状态,于是ActivityManagerService就创建一个新的进程,用来启动一个ActivityThread实例,而Application即在ActivityThread.main()中被回调了其初始化的代码即将要启动的Activity就是在这个ActivityThread实例中运行;
4、ActivityThread通过Binder进程间通信机制将一个ApplicationThread类型的Binder对象传递给ActivityManagerService,以便以后ActivityManagerService能够通过这个Binder对象和它进行通信;
5、ActivityManagerService通过Binder进程间通信机制通知ActivityThread,现在一切准备就绪,它可以真正执行Activity的启动操作了。