zoukankan      html  css  js  c++  java
  • android性能优化学习笔记(加快应用程序启动速度:)

    一:安卓中应用程序的启动方式有两种:

    冷启动:后台没有该应用进程,系统会重新创建一个进程分配给该应用(所以会先创建和初始化Application类,再创建和初始化MainActivity,包括测量,布局,绘制等)

    热启动:该应用的进程会保留在后台,在任务列表可以查看(back,home键按下后)(直接创建和初始化MainActivity,包括测量,布局,绘制等)

    一个应用从新进程的创建到进程的销毁,只会初始化一次Application.

    应用的启动时间:从点击图标到看到界面的第一帧。

    二:

    可以通过adb shell命令测量:adb shell am start -W [packageName]/[packageName.MainActivity]

    这样可以得到三个时间:

    this time:类totaltime,除非启动时开了一个透明的activity预先处理一些事再显示出主activity

    total time:创建进程,application初始化,activity初始化到显示界面。

    wait time:包括系统影响的耗时

    三:

    总的来说,冷启动过程如下:

    点击app的启动图标时,安卓系统会从Zygote进程中fork创建出一个新的进程分配给该应用,之后会依次创建和初始化Application类、创建MainActivity类、加载主题样式Theme中的windowBackground等属性设置给MainActivity以及配置Activity层级上的一些属性、再inflate布局、当onCreate/onStart/onResume方法都走完了后最后才进行contentView的measure/layout/draw显示在界面上,所以直到这里,应用的第一次启动才算完成,这时候我们看到的界面也就是所说的第一帧。

    Application的构造器方法——>attachBaseContext()——>onCreate()——>Activity的构造方法——>onCreate()——>配置主题中背景等属性——>onStart()——>onResume()——>测量布局绘制显示在界面上

    四:

    减少冷启动时的耗时:

    1:在Application的构造器方法、attachBaseContext()、onCreate()中不要进行耗时的初始化,一些数据的预取放在异步线程中,可采取Callable实现;

    2:sp的初始化  放在异步线程中处理;

    3:对于mainActivity,因为在获取道第一帧前,需要对contentView测量,布局,绘制;因此,尽量减少布局的层次,在生命周期的几个函数里避免做耗时操作。

    总的来说,原则就是:避免一些耗时的操作在主线程中。

  • 相关阅读:
    HDU 1240 Asteroids!【BFS】
    POJ 2251 Dungeon Master【BFS】
    HDU 1548 A strange lift【BFS】
    HDU 1171 Big Event in HDU【01背包】
    HDU 1505 City Game【DP】
    POJ 2386 Lake Counting【BFS】
    POJ 3278 Catch That Cow【BFS】
    HDU 1506 Largest Rectangle in a Histogram【DP】
    随想而已
    HDU 1285 确定比赛名次【拓扑排序】
  • 原文地址:https://www.cnblogs.com/newcoder/p/6070289.html
Copyright © 2011-2022 走看看