android 启动页_App启动优化一顿操作猛如虎
前言
一個(gè)應(yīng)用App的啟動(dòng)速度能夠影響用戶的首次體驗(yàn),用戶希望應(yīng)用能夠及時(shí)響應(yīng)并快速加載。啟動(dòng)時(shí)間過長(zhǎng)的應(yīng)用不能滿足這個(gè)期望,并且可能會(huì)令用戶失望。這種糟糕的體驗(yàn)可能會(huì)導(dǎo)致用戶在應(yīng)用商店針對(duì)您的應(yīng)用給出很低的評(píng)分,甚至完全棄用您的應(yīng)用。
本次主要內(nèi)容包括:
針對(duì)App啟動(dòng)優(yōu)化我們做了哪些工作?
1、App啟動(dòng)優(yōu)化方向:視覺體驗(yàn)優(yōu)化
2、App啟動(dòng)優(yōu)化方向:代碼邏輯優(yōu)化
一、App啟動(dòng)優(yōu)化方向:視覺體驗(yàn)優(yōu)化
App啟動(dòng)時(shí)白屏問題
App啟動(dòng)階段 :
加載并啟動(dòng)應(yīng)用程序。
啟動(dòng)后立即顯示應(yīng)用程序空白的啟動(dòng)窗口。
創(chuàng)建應(yīng)用程序進(jìn)程。
啟動(dòng)白屏的問題就是在1~2階段,因?yàn)锳pp應(yīng)用啟動(dòng)都會(huì)先進(jìn)入一個(gè)閃屏頁(yè)(SplashActivity) 來展示應(yīng)用信息。我們可以通過設(shè)置啟動(dòng)窗口的主題來優(yōu)化視覺上出現(xiàn)的啟動(dòng)白屏的問題。
1、默認(rèn)主題
默認(rèn)情況對(duì)App不做處理既設(shè)置了默認(rèn)主題,App啟動(dòng)初始化時(shí)會(huì)出現(xiàn)如下啟動(dòng)時(shí)顯示白屏的情況,如下圖:
2、透明主題
為了解決啟動(dòng)窗口白屏問題,通過設(shè)置啟動(dòng)頁(yè)為透明主題來解,,雖然白屏沒了,但是我們的App似乎是變遲鈍了,仔細(xì)觀察一下,點(diǎn)擊App啟動(dòng)圖標(biāo)后,App似乎是頓了一下,然后加載了我們的歡迎頁(yè)面,有點(diǎn)像ANR,只不過很短暫,所以用戶體驗(yàn)還是不佳,現(xiàn)象如下圖:
3、設(shè)置閃屏圖片主題
welcome_layler_drawable.xml源碼:
<?xml version="1.0" encoding="utf-8"?><layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<itemandroid:id="@+id/welcome_background"android:drawable="@drawable/icon_splash_bg" />
<itemandroid:bottom="@dimen/dp_16"android:gravity="center">
<bitmapandroid:gravity="center_horizontal"android:src="@drawable/icon_splash_word" />
item>
<itemandroid:bottom="@dimen/dp_41"android:gravity="bottom">
<bitmapandroid:gravity="center_horizontal|bottom"android:src="@drawable/icon_splash" />
item>
layer-list>
二、App啟動(dòng)優(yōu)化方向:代碼邏輯優(yōu)化
1、Application優(yōu)化:
Application作為應(yīng)用程序的整個(gè)初始化配置入口,有很多第三方組件(包括App應(yīng)用本身)都在 Application 中做初始化操作,在Application中完成各種初始化操作和復(fù)雜的邏輯就會(huì)影響到應(yīng)用的啟動(dòng)性能
過多的初始化任務(wù),考慮以下優(yōu)化方案:
考慮異步初始化三方組件,不阻塞主線程;
延遲部分三方組件的初始化;
優(yōu)化方案如下:
組件放到子線程中初始化:
new Thread(new Runnable() {@Override
public void run() {
setThreadPriority(THREAD_PRIORITY_BACKGROUND);
initARouter();
CacheManager.getInstance().initialize(getInstance());
ConnectionManager.getInstance().initialize();
initImageFactory();
initBJY();
initGrowingIO();
initUmeng();
initBugly();
initOkHttp();
initSobot();
setRxJavaErrorHandler();
}
}).start();
將需要在主線程中初始化但是可以不用立使用的控件功能延遲加載:
handler.postDelayed(new Runnable() {@Override
public void run() {
//延遲初始化組件
}
}, 3000);
注意:?并不是每一個(gè)組件的初始化以及操作都可以異步或延遲;是否可以取決組件的調(diào)用關(guān)系以及自己項(xiàng)目具體業(yè)務(wù)的需要。保證一個(gè)準(zhǔn)則:可以異步的都異步,不可以異步的盡量延遲。讓應(yīng)用先啟動(dòng),再操作。
//子線程初始化第三方組件//建議延遲初始化,可以發(fā)現(xiàn)是否影響其它功能,或者是崩潰!
Thread.sleep(5000);
2、閃屏Activity優(yōu)化:
Activity的UI層級(jí)優(yōu)化:
優(yōu)化前UI布局:
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@mipmap/icon_splash_bg">
<ImageViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@mipmap/icon_splash_word"android:layout_centerVertical="true"android:layout_centerHorizontal="true"android:paddingBottom="160dp"
/>
<ImageViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerHorizontal="true"android:src="@mipmap/icon_splash"android:layout_alignParentBottom="true"android:layout_marginBottom="@dimen/dp_41"
/>
<com.pxwx.student.modulecore.widget.TouchRelativeLayoutandroid:id="@+id/rl_adsRl"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center_horizontal|top"android:orientation="vertical" >
<ImageViewandroid:id="@+id/iv_SplashAd"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@null"android:contentDescription="@null"android:scaleType="fitXY"android:visibility="gone" />
com.pxwx.student.modulecore.widget.TouchRelativeLayout>
<TextViewandroid:id="@+id/tv_adjump"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@drawable/ad_jump_selector"android:gravity="center_vertical|center_horizontal"android:layout_alignParentRight="true"android:layout_marginRight="@dimen/dp_18"android:layout_marginTop="@dimen/dp_30"android:paddingBottom="@dimen/dp_5"android:paddingLeft="@dimen/dp_11"android:paddingRight="@dimen/dp_11"android:paddingTop="@dimen/dp_5"android:text="跳過 3"android:textColor="@color/white"android:textSize="@dimen/font_15"android:visibility="gone"
/>
RelativeLayout>
簡(jiǎn)化后:
<?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@drawable/welcome_layler_drawable">
<ViewStubandroid:id="@+id/vs"android:layout_width="match_parent"android:layout_height="match_parent"android:layout="@layout/layout_stub_avd" />
FrameLayout>
ViewStub 初始化延遲
針對(duì)項(xiàng)目中的啟屏廣告業(yè)務(wù),通過ViewStub延后他們的初始化,在需要顯示的時(shí)候通過ViewStub的inflate顯示真正的view,優(yōu)化如下
android:id="@+id/vs"android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout="@layout/layout_stub_avd" />
開屏廣告業(yè)務(wù)布局抽取
layout_stub_avd.xml
<?xml version="1.0" encoding="utf-8"?><com.pxwx.student.modulecore.widget.TouchRelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/rl_adsRl"android:layout_width="match_parent"android:layout_height="match_parent">
<ImageViewandroid:id="@+id/iv_SplashAd"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@null"android:contentDescription="@null"android:scaleType="fitXY" />
<TextViewandroid:id="@+id/tv_adjump"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:layout_marginTop="@dimen/dp_30"android:layout_marginRight="@dimen/dp_18"android:background="@drawable/ad_jump_selector"android:gravity="center"android:paddingLeft="@dimen/dp_11"android:paddingTop="@dimen/dp_5"android:paddingRight="@dimen/dp_11"android:paddingBottom="@dimen/dp_5"android:text="跳過 3"android:textColor="@color/white"android:textSize="@dimen/font_15" />
com.pxwx.student.modulecore.widget.TouchRelativeLayout>
然后在代碼中需要顯示webview時(shí)進(jìn)行inflate:
/*** 懶加載廣告視圖
*/
private void showAvd() {
viewStub = findViewById(R.id.vs);
if (viewStub != null) {
viewStub.inflate();
mAdRl = findViewById(R.id.rl_adsRl);
mAdImage = findViewById(R.id.iv_SplashAd);
mAdJump = findViewById(R.id.tv_adjump);
}
}
優(yōu)化點(diǎn):
廢棄之前的啟屏頁(yè)UI布局,直接使用先前自定義好的welcome_layler_drawable作為啟屏頁(yè)背景
將開屏廣告Ui抽取分離
懶加載廣告視圖
onCreate業(yè)務(wù)邏輯優(yōu)化:
減少?gòu)V告等業(yè)務(wù)邏輯時(shí)間這里屬于業(yè)務(wù)邏輯的優(yōu)化。
onCreate中針對(duì)廣告業(yè)務(wù)的初始化業(yè)務(wù)優(yōu)化,異步下載圖片,等下次啟動(dòng)控制展示
總結(jié)
通用應(yīng)用啟動(dòng)加速套路
利用主題快速顯示界面;
異步初始化組件;
梳理業(yè)務(wù)邏輯,延遲初始化組件、操作;
正確使用線程;
去掉無用代碼、重復(fù)邏輯等。
問題:
1、啟動(dòng)速度的衡量指標(biāo)啟動(dòng)時(shí)間如何計(jì)算?
2、為什么啟動(dòng)會(huì)有白屏?
3、為什么這樣優(yōu)化是有效的?
總結(jié)
以上是生活随笔為你收集整理的android 启动页_App启动优化一顿操作猛如虎的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: rhel 8.2不识别unicode_基
- 下一篇: 内存压力测试软件_日常游戏,毫无压力,荣