Android 优化之app启动优化的实现

App 启动方式

冷启动

App 没有启动过或 App 进程被杀,系统中不存在该 App 进程,此时启动即为冷启动。需要创建 App 进程,加载相关资源,启动 Main Thread,初始化首屏 Activity 等。在这个过程中,屏幕会显示一个空白的窗口(颜色基于主题),直至首屏 Activity 完全启动。

热启动

热启动意味着 App 进程只是处于后台,系统只是将其从后台带到前台展示给用户。类同与冷启动,在这个过程中,屏幕会显示一个空白的窗口(颜色基于主题),直至 activity 渲染完毕。

温启动

介于冷启动和热启动之间,一般来说在以下两种情况下发生:

  • 用户返回退出了 App,然后又启动。进程可能还在运行,但是 activity 需要重建。
  • 用户退出 App 后,系统可能由于内存原因将 App 杀死,进程和 activity 都需要重启,但是可以在 onCreate 中将被动杀死锁保存的状态(saved instance state)恢复。

启动时间检测

adb

adb shell am start -W [应用报名]/[Activity的全路径名],得到三个时间值:

1、ThisTime

一般和 TotalTime 相同,如果应用启动开启了一个过渡用的全透明页面预处理一些事情,这样会比 TotalTime 小。

2、TotalTime

应用启动时间,包括创建进程、Application 初始化、Activity 初始化到显示。

3、WaitTime

一般比 TotalTime 大,包括系统的耗时。

代码打点

Application 的 attachBaseContext 在应用进程首先创建时调用,可做冷启动的开始打点。

优化

1、布局优化

2、逻辑优化

  • 必要且耗时的逻辑,考虑单独开线程执行
  • 必要不耗时,按优先级高低依次执行
  • 非必要的延迟初始化,等用到再初始化

3、针对冷启动的欺骗效果

使用 placeholder UI

Android 最新的 Material Design 建议使用一个 placeholder UI 来展示给用户直至 App 加载完毕,类似 iOS 的做法。

自定义主题,设置 windowBackground 属性,给 Window 加上背景。

<style name="SplashTheme" parent="AppTheme">
  <item name="android:windowBackground">@drawable/logo_splash</item>
</style>

先加载一个不渲染布局的 Activity 作为启动屏

写一个什么都不做的 LogoSplashActivity

public class LogoSplashActivity extends BaseActivity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // 这里并没有 setContentView,单纯只是用来跳转到相应的 Activity
    // 目的是减少首屏渲染
    if (AppPref.isFirstRunning(this)) {
      IntroduceActivity.launch(this);
    } else {
      MainActivity.launch(this);
    }
    finish();
  }
}

在 AndroidManifest.xml 中设置其为启动屏,并加上主题

<activity
  android:name=".ui.module.main.LogoSplashActivity"
  android:screenOrientation="portrait"
  android:theme="@style/SplashTheme">
  <intent-filter>
    <action android:name="android.intent.action.MAIN"/>
    <category android:name="android.intent.category.LAUNCHER"/>
  </intent-filter>
</activity>

这样启动屏显示 LogoSplashActivity,本身不渲染布局,显示主题设置的 placehold UI 背景。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android 优化之卡顿优化的实现

    Android 系统每隔 16ms 会发出 VSYNC 信号重绘界面(Activity).之所以是 16ms,是因为 Android 设定的刷新率是 60FPS(Frame Per Second),也就是每秒 60 帧的刷新率,约合 16ms 刷新一次. 这就意味着,我们需要在 16ms 内完成下一次要刷新的界面的相关运算,以便界面刷新更新. 假设我们更新屏幕的背景图片需要 24ms 来做这次运算,当系统在第一个 16ms 时刷新界面,由于运算还没有结束,无法绘出图片.当系统隔 16ms 再发一

  • Android实战APP启动速度优化

    APP启动速度非常重要,APP启动速度慢,可能会造成用户体验不良好,尤其是在最近用Android studio之后,如果长时间不打开app,启动速度就会特别的慢,下面我们一起探讨一下影响app启动速度的原因,以及解决方案. 检测启动时间 首先我们要知道app的启动时间,然后你也可以凭着感觉来,这里我教大家一个装逼的方法: adb shell am start -W [packageName]/[.MainActivity] 用adb命令可以检测启动时间,示例如下: ./adb shell am

  • 详解Android布局优化

    怎样才能写出优秀的Android App,是每一个程序员追求的目标.那么怎么才能写出一个优秀的App呢?相信很多初学者也会有这种迷茫.一句话来回答这个问题:细节很重要.今天我们就从最基础的XML布局来谈谈怎么提高Android性能问题吧! 也许你经常会遇到比较复杂的布局,这种情况下,最简单的方法就是多层嵌套实现效果,但是最简单的方法是否是最优的方法呢? 这里需要打一个大大的问号?????经验告诉我们,往往简单的方法,得到的结果不是最优解,那么我们通过一个例子来研究一下怎么去优化我们的XML布局吧

  • Android图片性能优化详解

    1. 图片的格式 目前移动端Android平台原生支持的图片格式主要有:JPEG.PNG.GIF.BMP.和WebP(自从Android 4.0开始支持),但是在Android应用开发中能够使用的编解码格式只有三种:JPEG.PNG.WebP,图片格式可以通过查看Bitmap类的CompressFormat枚举值来确定. public static enum CompressFormat { JPEG. PNG. WebP; private CompressFormat() { } } 如果要在

  • Android优化之电量优化的实现

    Android 5.0 后用 Battery Historian 工具分析电量. 耗电因素 移动网络请求 手机通过内置的射频模块和基站联系,从而链接上网的,而这个射频模块(radio)是非常耗电的,为了控制这个射频模块的耗电,硬件驱动及 Android RIL 层做了很多处理.例如可以单独关闭 radio(飞行模式),间歇性假休眠 radio(有数据发生时才上电,保持一个频率的与基站交互)等等.如今的 App 都是移动互联网 App,不可避免的会有大量的网络请求,会导致 radio 一直处于活跃

  • android 之listview 优化方法

    这个东西做android是必备的,我相信你一定也会,但是我写下来的目的就是记录一下. 这个东西面试也很多会问到的,那么我们怎么回答那? 首先我认为有这么几点: 1.listview在定义的时候宽和高最好固定一下,这样可以减少listview测量次数,避免每次加载的时候都要去进行测量. 2.分页加载,这也是优化之一,优化内存,还有体验感,有兴趣的可以试试大数据加载: 3.convertView 就是布局的复用: 4.ViewHolder的使用 目的减少findviewByID的次数: 下面代码验证

  • Android端TCP长连接的性能优化教程分享

    前言 大家应该都知道,在Android端实现TCP长连接场景其实不多,我们最熟悉的不过推送和HTTP协议的实现(OkHttp),本文讨论的是在实现推送长连接的情况下怎么来做性能优化,下文只是我的一点拙见,有不妥之处还望指出,下面话不多说了,来一起看看详细的介绍吧. 推送长连接 可以说大部分APP是离不开推送(push)这个功能的,不过平常我们都是接入第三方SDK(极光.个推等)居多,因为要做一个推送服务,不光客户端要编写相应的Socket通信代码,服务器端更是麻烦,要处理大规模的长连接服务,消息

  • Android 优化之app启动优化的实现

    App 启动方式 冷启动 App 没有启动过或 App 进程被杀,系统中不存在该 App 进程,此时启动即为冷启动.需要创建 App 进程,加载相关资源,启动 Main Thread,初始化首屏 Activity 等.在这个过程中,屏幕会显示一个空白的窗口(颜色基于主题),直至首屏 Activity 完全启动. 热启动 热启动意味着 App 进程只是处于后台,系统只是将其从后台带到前台展示给用户.类同与冷启动,在这个过程中,屏幕会显示一个空白的窗口(颜色基于主题),直至 activity 渲染完

  • Android仿荷包APP启动动画

    用荷包App的时候发现启动动画做的挺好玩的,于是便模仿实现了一下. gif效果图: animation.gif 实现思路: 仔细观察,可以看出动画的执行分为两个阶段: 第一阶段为硬币掉落. 第二阶段为钱包反弹. 布局xml文件如下: <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/an

  • Android APP启动方式、启动流程及启动优化分析

    本文章向大家介绍Android app应用启动的一些相关知识,包括app启动方式.app启动流程和app启动优化等知识!  app应用启动方式 1.冷启动 当启动应用时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用,这个启动方式就是冷启动.冷启动因为系统会重新创建一个新的进程分配给它,所以会先创建和初始化Application类,再创建和初始化MainActivity类(包括一系列的测量.布局.绘制),最后显示在界面上. 2.热启动 当启动应用时,后台已有该应用的进程(例:按

  • Android APP性能优化分析

    本文通过Android APP性能优化的四个方面做了详细分析,并对原理和重点做了详细解释,以下是全部内容: 说到 Android 系统手机,大部分人的印象是用了一段时间就变得有点卡顿,有些程序在运行期间莫名其妙的出现崩溃,打开系统文件夹一看,发现多了很多文件,然后用手机管家 APP 不断地进行清理优化 ,才感觉运行速度稍微提高了点,就算手机在各种性能跑分软件面前分数遥遥领先,还是感觉无论有多大的内存空间都远远不够用.相信每个使用 Android 系统的用户都有过以上类似经历,确实,Android

  • Android中方法数超限问题与启动优化详解

    前言 最近写了篇有关Eclipse工程转Android Studio工程的文章,而导致公司项目需要转 AS 的直接原因,就是今天要写的主题–方法数超限,相信大多数 Android 项目的都会碰到这个问题. 传统的 Eclipse 解决方法数超限的办法,就是在 project.properties 中加上 dex.force.jumbo=true ,然后清理工程重新编译.但是,当方法数越来越多,这个方法也会解决不了问题,这个时候,就要用到 Google 官方给出的方案 MultiDex了. Mul

  • 详解Android性能优化之启动优化

    1.为什么要进行启动优化 网上流行一种说法,就是8秒定律,意思是说,如果用户在打开一个页面,在8秒的时间内还没有打开,那么用户大概的会放弃掉,意味着一个用户的流失.从这里就可以看出,启动优化的重要性了. 2.启动的分类 2.1 冷启动 先来看看冷启动的流程图 从图中可以看出,APP启动的过程是:ActivityManagerProxy 通过IPC来调用AMS(ActivityManagerService),AMS通过IPC启动一个APP进程,ApplicationThread通过反射来创建App

  • Android APP启动时间优化介绍

    APP启动时间优化首先要知道入伙获取APP启动时间,可以看我的这篇文章:Android 获取APP启动时间 然后就是想办法降低启动时间 1.在Application的onCreate方法中将耗时信息生成一个文件 2.正常耗时文件需要申请读写权限 3.运行APP,可以找到生成的文件 3.将生成的文件直接拖到Android Studio中,可以显示分析的页面 4.分析找到耗时严重的方法 5.将耗时严重的方法放到线程池的线程里面异步执行 6.异步加载资源的时候要注意下面几点: 如果我们要加载的资源耗时

  • Android 模拟新闻APP显示界面滑动优化实例代码

    内容: 1.滑动优化(滑动时不加载图片,停止才加载) 2.第一次进入时手动加载 代码如下: 1.界面布局 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:

随机推荐