• 一应用的启动方式
  • 二应用的启动过程
  • 三冷启动过程中碰到的白屏黑屏以及优化启动时间
  • 冷启动时间优化

本文转自逊志的博客

一、应用的启动方式

  • 通常来说,启动方式分为两种:冷启动和热启动。

      1、冷启动:当启动应用时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用,这个启动方式就是冷启动。

      2、热启动:当启动应用时,后台已有该应用的进程(例:按back键、home键,应用虽然会退出,但是该应用的进程是依然会保留在后台,可进入任务列表查看),所以在已有进程的情况下,这种启动会从已有的进程中来启动应用,这个方式叫热启动。

  • 特点

      1、冷启动:冷启动因为系统会重新创建一个新的进程分配给它,所以会先创建和初始化Application类,再创建和初始化MainActivity类(包括一系列的测量、布局、绘制),最后显示在界面上。

      2、热启动:热启动因为会从已有的进程中来启动,所以热启动就不会走Application这步了,而是直接走MainActivity(包括一系列的测量、布局、绘制),所以热启动的过程只需要创建和初始化一个MainActivity就行了,而不必创建和初始化Application,

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

二、应用的启动过程

  冷启动启动流程:当点击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、点击桌面图标,Launcher会启动程序默认的Acticity,之后再按照程序的逻辑启动各种Activity

  2、启动Activity都需要借助应用程序框架层的ActivityManagerService服务进程(Service也是由ActivityManagerService进程来启动的);在Android应用程序框架层中,ActivityManagerService是一个非常重要的接口,

  它不但负责启动Activity和Service,还负责管理Activity和Service。

    Step 1. 无论是通过Launcher来启动Activity,还是通过Activity内部调用startActivity接口来启动新的Activity,都通过Binder进程间通信进入到ActivityManagerService进程中,并且调用ActivityManagerService.startActivity接口;

    Step 2. ActivityManagerService调用ActivityStack.startActivityMayWait来做准备要启动的Activity的相关信息;

    Step 3. ActivityStack通知ApplicationThread要进行Activity启动调度了,这里的ApplicationThread代表的是调用ActivityManagerService.startActivity接口的进程,对于通过点击应用程序图标的情景来说,这个进程就是Launcher了,

    而对于通过在Activity内部调用startActivity的情景来说,这个进程就是这个Activity所在的进程了;

    Step 4. ApplicationThread不执行真正的启动操作,它通过调用ActivityManagerService.activityPaused接口进入到ActivityManagerService进程中,看看是否需要创建新的进程来启动Activity;

    Step 5. 对于通过点击应用程序图标来启动Activity的情景来说,ActivityManagerService在这一步中,会调用startProcessLocked来创建一个新的进程,而对于通过在Activity内部调用startActivity来启动新的Activity来说,这一步是不需要执行的,

    因为新的Activity就在原来的Activity所在的进程中进行启动;

    Step 6. ActivityManagerServic调用ApplicationThread.scheduleLaunchActivity接口,通知相应的进程执行启动Activity的操作;

    Step 7. ApplicationThread把这个启动Activity的操作转发给ActivityThread,ActivityThread通过ClassLoader导入相应的Activity类,然后把它启动起来。

三、冷启动过程中碰到的白屏黑屏以及优化启动时间

1、白屏问题 :

  android studio升级 2.0之后 加上Instant Run,Instant Run为了能够让我们快速部署代码,背后其实是有一套非常复杂的逻辑的,比如要在APK中建立服务器与Android Studio进行通信,以及代码差异比对和替换等,在研发过程中可能出现白屏问题。
  Install Run的运行原理如图:

  一般release版的程序是不会出现这种现象的;

  如果接下来还会出现白屏问题,可以修改style文件

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowNoTitle">true</item>
</style>

加入了两个属性,windowIsTranslucent和windowNoTitle,将这两个属性都设置成true,就可以让程序在初始化的时候窗口是透明的,初始化结束后程序主界面才会显示出来,从而也就完全看不到白屏界面了

2、启动时间的优化

  先测量activity的启动时间——-Activity的reportFullyDrawn()方法

 你就需要调用Activity的reportFullyDrawn()。它将在log里报告从apk初始化(和前面Displayed的时间是一样的)到reportFullyDrawn() 方法被调用用了多长时间。

  reportFullyDrawn()方法显示的log也是类似这样:ActivityManager: Displayed com.Android.myexample/.StartupTiming: +768ms在4.4上调用reportFullyDrawn()方法会崩溃(但是log还是能正常打印),提示需要UPDATE_DEVICE_STATS权限 ,但是这个权限只有系统app才能授权。解决的办法是这样调

  try{
reportFullyDrawn();
  }catch(SecurityException e){
  }
  还有一种测量启动时间的方法也值得一提,那就是screenrecord命令

  首先启动带—bugreport选项(它可以在frames 中添加时间戳-应该是L中的特性)的screenrecord 命令:
  adbshellscreenrecord–bugreport/sdcard/launch.mp4  然后点击app的图标,等待app显示,ctrl−Cscreenrecord,使用adbpull命令把文件导出到电脑。 adb shell screenrecord –bugreport /sdcard/launch.mp4 然后点击app的图标,等待app显示,ctrl-C screenrecord, 使用adb pull命令把文件导出到电脑。 adb pull /sdcard/launch.mp4

  现在你可以打开录制视频看看发生了什么。你需要一个能逐帧查看的视频播放器(mac上的Quicktime 就可以,不清楚其它os上什么播放器这个功能最好使)。现在逐帧播放,注意视频的上方有一个frame 时间戳。

  一直往前直到你发现app图标高亮了为止。这个时候系统已经处理了图标上的点击事件,开始启动app了,记录下这一帧的时间。继续播放帧直到你看到了app整个UI的第一帧为止。根据不同情况(是否有启动窗口,是否有启动画面等等),

  事件和窗口发生的实际顺序可能会有不同。对于一个简单的app来说,你会首先见到启动窗口,然后渐变出app真实的UI。在你看到UI上的任何内容之后,你应该记录下第一帧,这时app完成了布局和绘制,准备开始显示出来了。同时也记录下这一帧所发生的时间。

  现在把这两个时间相减 ((UI displayed) - (icon tapped)); 得到app从点击到绘制就绪的所有时间。虽然这个时间包含了进程启动之前的时间,但是至少它可以用于跟其他app比较。
  Android冷启动时间优化

 冷启动时间是指当用户点击你的app那一刻到系统调用Activity.onCreate()之间的时间段。在这个时间段内,WindowManager会先加载app主题样式中的windowBackground做为app的预览元素,然后再真正去加载activity的layout布局

冷启动时间优化

  知道了Android冷启动时间的原理之后,就可以通过一些小技巧来对冷启动时间进行优化,从而让你app加载变得”快“一些(视觉体验上的快)。我们可制作一个启动Activity的背景样式的.9图片,然后把这个.9图片做为windowBackground。
图片制作好之后,我们就可以用它做为app冷启动阶段的预览元素,如下设置:

  • 为启动的Activity自定义一个Theme

    <style name="AppTheme.Launcher">
    <item name="android:windowBackground">@drawable/window_background_statusbar_toolbar_tab</item>
    </style>
  • 将新的Theme应用到设置到AndroidManifest.xml中
<activity
    android:name=".MainActivity"android:theme="@style/AppTheme.Launcher"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter>
</activity>
  • 由于给MainActivity设置了一个新的Theme,这样做会覆盖原来的Theme,所以在MainActivity中需要设置回原来的Theme
public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {// Make sure this line comes before calling super.onCreate().setTheme(R.style.AppTheme);super.onCreate(savedInstanceState);}
}

Android中的冷启动与热启动相关推荐

  1. Android 中的冷启动和热启动

    App的Activity退出之后,应用的进程并不会被杀死,而是保留在那里.当再次打开App的Activity时,会从已有的进程中创建Activity,是为"热启动".若打开Acti ...

  2. Android 查看App冷启动时间/热启动时间/页面打开时间

    Android 查看App冷启动时间/热启动时间/页面打开时间 冷启动时间 热启动时间 页面打开时间 通过adb查看 adb shell am start -W packageName/Activit ...

  3. Android冷启动与热启动概念

    Android冷启动与热启动概念 冷启动 什么是冷启动 Android中的冷启动,使用直白的话就是: 当手机 重启 ,点击桌面图标启动应用的过程就是冷启动 未启动手机,长时 未使用,应用被 kill ...

  4. Android之路 - 冷启动解决方案:实现秒开

    前言 关于 splash 页面相信每个Android开发者都是非常熟悉的,而且很多人也遇到过需要在splash加个广告图片,然后延迟3秒在进入主页面,splash 应该只是一个启动页面,不应该放广告, ...

  5. Android冷启动和热启动

    一.首先介绍一下启动的方式 启动方式分为两种:冷启动和热启动. 1.冷启动:当启动应用时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用,这个启动方式就是冷启动. 2.热启动:当启动 ...

  6. android开发冷启动和热启动的区别,android 冷启动和热启动

    一.什么是冷启动.热启动? 冷启动: 在启动应用时,系统中没有该应用的进程,这时系统会创建一个新的进程分配给该应用: 热启动: 在启动应用时,系统中已有该应用的进程(例:按back键.home键,应用 ...

  7. 冷启动和热启动的区别android,app冷启动和热启动的区别(详解两者定义及区别)...

    介绍一下 app 冷启动和热启动方式来实现 app 秒开的效果.那么,先来看看什么叫冷启动和热启动. 冷启动:指 app 被后台杀死后,在这个状态打开 app,这种启动方式叫做冷启动. 热启动:指 a ...

  8. Android冷启动和热启动以及冷启动优化方案

    1.什么是冷启动和热启动 冷启动: 当启动应用时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用,这个启动方式就是冷启动,也就是先实例化Application. 热启动: 当启动应用 ...

  9. android app 热启动,app冷启动和热启动的区别(详解两者定义及区别)

    介绍一下 app 冷启动和热启动方式来实现 app 秒开的效果.那么,先来看看什么叫冷启动和热启动. 冷启动:指 app 被后台杀死后,在这个状态打开 app,这种启动方式叫做冷启动. 热启动:指 a ...

最新文章

  1. 条款22: 尽量用“传引用”而不用“传值”
  2. linux dd安装系统,通过DD命令安装Windows,并介绍几款DD镜像包
  3. 高级数据结构---优先队列
  4. linux建模工具有哪些,linux uml 免费 建模工具
  5. Ubuntu 16.04粘贴板增强工具Diodon
  6. outlook 附件保存位置-附件无法打开
  7. asp.net先于iis安装导致iis不能解析aspx的问题(Failed to access IIS metabase,IISメタベースにアクセスできませんでした)...
  8. web安全详解(渗透测试基础)
  9. catia逆向建模步骤_catia与逆向工程
  10. WinCC V7.4 过程值归档概述及流程演示
  11. 矩阵的对称性,自反性和反对称性的判断
  12. 游戏介绍——《逆转裁判》
  13. 集成电路光刻机精密运动台控制方法
  14. 迅雷、QQ旋风-链接自动转换(Download link conversion)
  15. 浏览器无法渲染php,解决lighttpd运行后浏览器无法渲染html
  16. 神武2手游服务器等级限制影响,《神武2》手游开放新等级!不再为修炼等级操心...
  17. 用户权限影响瑞星安装
  18. 《生命科学50讲》课程笔记1--生命由什么构成
  19. 电力-故障分析理论及对称分量法
  20. 巴伦变压器电路图_巴伦的原理、设计、制作

热门文章

  1. wifidog浏览器弹窗认证 — 基于OpenWRT路由器
  2. Python开发-Django快速入门
  3. 11.Flink ProcessFunction介绍及KeyedProcessFunction实例
  4. Python爬虫爬取马蜂窝北京景点信息
  5. KMP模式匹配算法详解
  6. 男生掌握什么技能会吸引女生?
  7. UEFI启动U盘制作
  8. main和_main的区别
  9. docker 存出,载入镜像
  10. descriptor理解和例程