1. 安卓的启动方式
1.1 冷启动
冷启动时app的进程没有被创建。系统冷启动一个app需要完成三个任务:1. 加载和启动app 2.在app刚启动时立即为app显示一个空白的开始窗口 3.创建app进程 当系统创建了app进程后,app进程负责处理接下来的任务: 1.创建app这个对象 2.启动主线程 3.创建main activity 4.加载相应的views 5.layout the screen 6.执行初始的绘制流程 当app进程完成初始画面的绘制之后,系统进程会将当前显示的空白后台窗口替换为main activity的画面。
1.2 热启动
热启动时,系统做的是将你的activity移到前台。如果该app的activity依然在内存中,那么就可以避免对象初始化,布局加载和渲染的时间。 热启动和冷启动的场景一样,都会在activity结束渲染该activity之前先显示一个空白的窗口。
1.3 微热启动
2. app启动时的一些常见问题
2.1 比较重的app初始化
一些不需要的初始化操作,application的onCreate中执行一些diskIO或者发生GC。诊断问题的方法包括method tracing或者inline tracing。 Method tracing可以诊断出Application.onCreate函数的执行是否花费了较多时间。 Inline tracing则可以发现一些全局单例对象、diskI/o,反序列化或者循环导致的问题。
解决这些问题的方法: 如果是非必要的初始化或者diskI/O导致的问题,那么可以通过懒加载的方式来解决,即只初始化那些拿上需要用的对象。例如,与其创建全局的静态对象,不如把它移到一个单例中,这样对象只会在首次需要的时候才初始化。或者采用类似Dagger之类的依赖注入框架,这种框架只会在需要的时候才加载该类并创建对象。
2.2 比较重的activity初始化
常见的activity导致启动较慢的问题有:
- 加载大的或者复杂的布局
- 在ui线程中进行磁盘或者网络io
- 加载和加码bitmap
- 初始化activity的其他子系统 诊断方式:通过method tracing或者inline tracing。
解决问题的方法:
1.减少布局的层级,并且不加载不需要显示的view,可以用viewstub来替代。
- 将所有的资源的初始化工作到另一个线程。
- 先显示部分view,然后再更新一些依赖bitmap或者资源的视觉特性
2.3 改变起始的启动窗口
如果你想提升app的视觉提升体验,给用户更快的启动速度体验。你可以将app显示首屏画面前的那个空白的背景窗口改成与app主题类似的主题或者直接禁止显示该空白窗口。
例如,你可以创建一个drawble文件,然后在style中创建一个theme并且引用你创建的drawble。 然后再在Androidmanifest文件中设置主题为你新建的那个样式。
Layout XML file:
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" android:opacity="opaque">
<!-- The background color, preferably the same as your normal theme -->
<item android:drawable="@android:color/white"/>
<!-- Your product logo - 144dp color version of your app icon -->
<item>
<bitmap
android:src="@drawable/product_logo_144dp"
android:gravity="center"/>
</item>
</layer-list>
Manifest file:
<activity ...
android:theme="@style/AppTheme.Launcher" />
然后在Activity的oncreate中在super.onCreate()函数前将主题设置回你需要的样子。
public class MyMainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// Make sure this is before calling super.onCreate
setTheme(R.style.Theme_MyApp);
super.onCreate(savedInstanceState);
// ...
}
}