Android 启动页适配&启动优化

​ 随着全面屏的兴起,为了在各个机型上显示更美观,又出现了各种各样要适配的需求。首当其冲的是就是启动页的适配了,尽管只有一张单图,为了保持他不变形绞尽脑汁想了无数办法,最终找到一个简单的方案。先说下当前的分辨率。

主流屏 16:9

  • 1280*720 1.777
  • 1920*1080 1.777
  • 2560*1440 1.777

非主流屏(全面屏,比例完全不一样)

  • 2040*1080 1.8888

  • 2960*1440 2.05

  • 2160*1080. 2

  • 2436*1125 2.16

  • 2688*1242. 2.16

简单适配

  • 设计一张大图(长图),顶部和底部留出足够可裁剪的区域
  • 然后在xml里面设置android:scaleType="centerCrop"就行,这样图片会缩放后居中
  <ImageView
        android:id="@+id/img_center"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:scaleType="centerCrop"
        android:src="@drawable/bg" />

体验问题

​ 很多在app启动的时候做了很多初始化的操作,这样就带来了一个问题。用户点击启动icon之后,桌面会停顿几秒根据用户主题不同,也许是黑屏或者白屏,这几秒用户无法在桌面上进行任何操作,过后才显示闪屏页。

​ 发生这个现象,我们就要研究一下app的启动过程了如下:

  • 当用户点击了Icon之后,系统立即分配了window

  • 这个时候AMS还在和系统做app启动相关的交互

  • 等application创建之后继续做onCreate里面的初始化工作

  • activity的初始化到onResume的时候,终于可见

    然后再看看app启动具体需要多久,下面比较某一款app和微信的启动时间。

kangwcideiMacBook:~ kangwencai$ adb shell am start -S -W com.yqr.expressgold/.activity.SplashScreenActivity
Stopping: com.yqr.expressgold
Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.yqr.expressgold/.activity.SplashScreenActivity }
Status: ok
Activity: com.yqr.expressgold/.activity.SplashScreenActivity
ThisTime: 3334
TotalTime: 3334
WaitTime: 3354
// 对比测试一下微信的
adb shell am start -S -W com.tencent.mm/com.tencent.mm.ui.LauncherUI
Stopping: com.tencent.mm
Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.tencent.mm/.ui.LauncherUI }
Status: ok
Activity: com.tencent.mm/.app.WeChatSplashActivity
ThisTime: 349
TotalTime: 1481
WaitTime: 1509

问题说清楚了,然后说优化

优化启动方式

  1. 设置样式,配置window的背景,当用户点击icon之后就算activity还没执行到onResume这个时候window也会显示这个背景
  2. 在manifest里面为启动页指定这个样式
  3. 这样配置之后,在启动页就不要再设置图片了,避免过度绘制
   
    <style name="mcc_start_activity_theme" parent="Theme.AppCompat.Light.NoActionBar">
        "android:windowBackground">@mipmap/bg_splash
        "android:windowFullscreen">true
    style>
    

新问题

​ 在ImageView里面我们可以设置裁剪居中,在windowBackground这个样式上面却没有这个属性,按照默认的背景绘制方式fit_xy肯定变形。这个问题该怎么破呢?

我们用layer-list定义一个drawable,然后再再最上面的样式里去引用。

drawable/bg.xml


<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    
    
    <item>
        <bitmap
            android:gravity="center"
            android:src="@mipmap/bg_splash" />
    item>

layer-list>

styles.xml

  <style name="mcc_start_activity_theme" parent="Theme.AppCompat.Light.NoActionBar">
        
        
        "android:windowBackground">@drawable/bg
        "android:windowFullscreen">true
    style>

这是一张2800*1242的图做适配的效果(背景图过长,显示中间的部分)
Android 启动页适配&启动优化_第1张图片

这是一张1152*596适配的效果(背景图过小,用其他颜色填充)

Android 启动页适配&启动优化_第2张图片

因为做为window_backrgound的时候不能被拉伸,只能调整位置,所以这个图只能是尽可能的大,最好是采用最大分辨率的手机的图

参考

startActivity启动过程分析

启动Activity过程

Activity生命周期是如何实现的

你可能感兴趣的:(Android,优化)