Android性能优化系列1--冷启动优化

本文借鉴了以下文章,对文章作者表示感谢:

  1.  https://www.jianshu.com/p/e69d22ec0582
  2. http://blog.csdn.net/guolin_blog/article/details/51019856
  3. http://wuxiaolong.me/2017/03/13/appStart/
  4. https://www.jianshu.com/p/f5514b1a826c
  5. http://blog.csdn.net/luoshengyang/article/details/6689748

一、伸手党

按以下方法对工程进行优化后,冷启动速度将提升一大轱辘!
1、主题切换法
这个方法就相当于在系统自带的splash这里动手动脚(其实是系统启动app时activity还没有展示出来而加载的你在清单文件中的主题)。
首先先在styles文件中定义一个贼目(一般有两种,一种是这个东西就像个splash有一个短暂的图片展示,另一种直接让这里透明):
你一定会想先说图片的,no这里先上透明的:
 
当然图片的也不会放过:
好了,以上随便选一个适合你的!
接下来清单文件中的干法是:

 
    
        
        
    

然后再在主界面恢复你想使用的骚主题吧:

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、启动分为以下几种
  • 冷启动:
 冷启动指的是应用程序从头开始:系统的进程没有,直到此开始,创建了应用程序的进程。 在应用程序自设备启动以来第一次启动或系统杀死应用程序等情况下会发生冷启动。 这种类型的启动在最小化启动时间方面是最大的挑战,因为系统和应用程序比其他启动状态具有更多的工作。一般我们做优化是指此种情况之下。
  • 热启动:
 与冷启动相比,热启动应用程序要简单得多,开销更低。在热启动,系统会把你活动放到前台,如果所有应用程序的活动仍驻留在内存中,那么应用程序可以避免重复对象初始化,UI的布局和渲染。热启动显示与冷启动场景相同的屏幕行为:系统进程显示空白屏幕,直到应用程序完成呈现活动。
  • 温启动:
 用户退出您的应用,但随后重新启动。该过程可能已继续运行,但应用程序必须通过调用onCreate()从头开始重新创建活动。系统从内存中驱逐您的应用程序,然后用户重新启动它。进程和Activity需要重新启动,但任务可以从保存的实例状态包传递到onCreate()中。
2、冷启动的时候android都干么子了?

  • 普通话版
     1、加载启动app;
     2、App启动之后立即展示出一个空白的window,这里就是前面我的说的主题切换法做手脚的地方。
     3、创建app
     4、启动mainThread
     5、加载View

     6、布置屏幕
     7、进行第一次绘制,一旦完成了第一次绘制,系统进程就会用MainActivity替换已经展示的Background Window,就可以交互了。

  • 源码版 整个应用程序的启动过程要执行很多步骤,但是整体来看,主要分为以下五个阶段:
     1、Launcher通过Binder进程间通信机制通知ActivityManagerService,它要启动一个Activity;
     2、ActivityManagerService通过Binder进程间通信机制通知Launcher进入Paused状态;
     3、Launcher通过Binder进程间通信机制通知ActivityManagerService,它已经准备就绪进入Paused状态,于是ActivityManagerService就创建一个新的进程,用来启动一个ActivityThread实例,而Application即在ActivityThread.main()中被回调了其初始化的代码即将要启动的Activity就是在这个ActivityThread实例中运行;
     4ActivityThread通过Binder进程间通信机制将一个ApplicationThread类型的Binder对象传递给ActivityManagerService,以便以后ActivityManagerService能够通过这个Binder对象和它进行通信;
     5ActivityManagerService通过Binder进程间通信机制通知ActivityThread,现在一切准备就绪,它可以真正执行Activity的启动操作了。



你可能感兴趣的:(安卓性能优化系列)