欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android優(yōu)化應(yīng)用啟動(dòng)速度

 更新時(shí)間:2016年01月15日 09:15:45   作者:Sunzxyong  
這篇文章主要介紹了Android優(yōu)化應(yīng)用啟動(dòng)速度,針對(duì)Android性能優(yōu)化中的加快應(yīng)用啟動(dòng)速度進(jìn)行學(xué)習(xí),感興趣的小伙伴們可以參考一下

一、應(yīng)用的啟動(dòng)

啟動(dòng)方式

通常來(lái)說(shuō),在安卓中應(yīng)用的啟動(dòng)方式分為兩種:冷啟動(dòng)和熱啟動(dòng)。

  • 1、冷啟動(dòng):當(dāng)啟動(dòng)應(yīng)用時(shí),后臺(tái)沒(méi)有該應(yīng)用的進(jìn)程,這時(shí)系統(tǒng)會(huì)重新創(chuàng)建一個(gè)新的進(jìn)程分配給該應(yīng)用,這個(gè)啟動(dòng)方式就是冷啟動(dòng)。
  • 2、熱啟動(dòng):當(dāng)啟動(dòng)應(yīng)用時(shí),后臺(tái)已有該應(yīng)用的進(jìn)程(例:按back鍵、home鍵,應(yīng)用雖然會(huì)退出,但是該應(yīng)用的進(jìn)程是依然會(huì)保留在后臺(tái),可進(jìn)入任務(wù)列表查看),所以在已有進(jìn)程的情況下,這種啟動(dòng)會(huì)從已有的進(jìn)程中來(lái)啟動(dòng)應(yīng)用,這個(gè)方式叫熱啟動(dòng)。

特點(diǎn)

1、冷啟動(dòng):冷啟動(dòng)因?yàn)橄到y(tǒng)會(huì)重新創(chuàng)建一個(gè)新的進(jìn)程分配給它,所以會(huì)先創(chuàng)建和初始化Application類,再創(chuàng)建和初始化MainActivity類(包括一系列的測(cè)量、布局、繪制),最后顯示在界面上。

2、熱啟動(dòng):熱啟動(dòng)因?yàn)闀?huì)從已有的進(jìn)程中來(lái)啟動(dòng),所以熱啟動(dòng)就不會(huì)走Application這步了,而是直接走M(jìn)ainActivity(包括一系列的測(cè)量、布局、繪制),所以熱啟動(dòng)的過(guò)程只需要?jiǎng)?chuàng)建和初始化一個(gè)MainActivity就行了,而不必創(chuàng)建和初始化Application,因?yàn)橐粋€(gè)應(yīng)用從新進(jìn)程的創(chuàng)建到進(jìn)程的銷毀,Application只會(huì)初始化一次。

上面說(shuō)的啟動(dòng)是點(diǎn)擊app的啟動(dòng)圖標(biāo)來(lái)啟動(dòng)的,而另外一種方式是進(jìn)入最近使用的列表界面來(lái)啟動(dòng)應(yīng)用,這種不應(yīng)該叫啟動(dòng),應(yīng)該叫恢復(fù)。

二、應(yīng)用啟動(dòng)的流程

在安卓系統(tǒng)上,應(yīng)用在沒(méi)有進(jìn)程的情況下,應(yīng)用的啟動(dòng)都是這樣一個(gè)流程:當(dāng)點(diǎn)擊app的啟動(dòng)圖標(biāo)時(shí),安卓系統(tǒng)會(huì)從Zygote進(jìn)程中fork創(chuàng)建出一個(gè)新的進(jìn)程分配給該應(yīng)用,之后會(huì)依次創(chuàng)建和初始化Application類、創(chuàng)建MainActivity類、加載主題樣式Theme中的windowBackground等屬性設(shè)置給MainActivity以及配置Activity層級(jí)上的一些屬性、再inflate布局、當(dāng)onCreate/onStart/onResume方法都走完了后最后才進(jìn)行contentView的measure/layout/draw顯示在界面上,所以直到這里,應(yīng)用的第一次啟動(dòng)才算完成,這時(shí)候我們看到的界面也就是所說(shuō)的第一幀。

所以,總結(jié)一下,應(yīng)用的啟動(dòng)流程如下:

Application的構(gòu)造器方法——>attachBaseContext()——>onCreate()——>Activity的構(gòu)造方法——>onCreate()——>配置主題中背景等屬性——>onStart()——>onResume()——>測(cè)量布局繪制顯示在界面上。

三、測(cè)量應(yīng)用啟動(dòng)的時(shí)間

在上面這個(gè)啟動(dòng)流程中,任何一個(gè)地方有耗時(shí)操作都會(huì)拖慢我們應(yīng)用的啟動(dòng)速度,而應(yīng)用啟動(dòng)時(shí)間是用毫秒度量的,對(duì)于毫秒級(jí)別的快慢度量我們還是需要去精確的測(cè)量到到底應(yīng)用啟動(dòng)花了多少時(shí)間,而根據(jù)這個(gè)時(shí)間來(lái)做衡量。

什么才是應(yīng)用的啟動(dòng)時(shí)間

從點(diǎn)擊應(yīng)用的啟動(dòng)圖標(biāo)開(kāi)始創(chuàng)建出一個(gè)新的進(jìn)程直到我們看到了界面的第一幀,這段時(shí)間就是應(yīng)用的啟動(dòng)時(shí)間。

我們要測(cè)量的也就是這段時(shí)間,測(cè)量這段時(shí)間可以通過(guò)adb shell命令的方式進(jìn)行測(cè)量,這種方法測(cè)量的最為精確,命令為:

adb shell am start -W [packageName]/[packageName.MainActivity]

執(zhí)行成功后將返回三個(gè)測(cè)量到的時(shí)間:
1、ThisTime:一般和TotalTime時(shí)間一樣,除非在應(yīng)用啟動(dòng)時(shí)開(kāi)了一個(gè)透明的Activity預(yù)先處理一些事再顯示出主Activity,這樣將比TotalTime小。
2、TotalTime:應(yīng)用的啟動(dòng)時(shí)間,包括創(chuàng)建進(jìn)程+Application初始化+Activity初始化到界面顯示。
3、WaitTime:一般比TotalTime大點(diǎn),包括系統(tǒng)影響的耗時(shí)。

下面是測(cè)量一個(gè)應(yīng)用冷啟動(dòng)和熱啟動(dòng)的時(shí)間:
冷啟動(dòng):

熱啟動(dòng):

可以看到在進(jìn)程已經(jīng)存在的情況下,只需要重新初始化MainActivity,這樣的啟動(dòng)比較快,不過(guò)大多數(shù)情況下應(yīng)用的啟動(dòng)都是冷啟動(dòng),因?yàn)橛脩舳紩?huì)在任務(wù)列表中手動(dòng)關(guān)閉遺留的應(yīng)用進(jìn)程。

四、減少應(yīng)用啟動(dòng)時(shí)的耗時(shí)

針對(duì)冷啟動(dòng)時(shí)候的一些耗時(shí),如上測(cè)得這個(gè)應(yīng)用算是中型的app,在冷啟動(dòng)的時(shí)候耗時(shí)已經(jīng)快700ms了,如果項(xiàng)目再大點(diǎn)在Application中配置了更多的初始化操作,這樣將可能達(dá)到1s,這樣每次啟動(dòng)都明顯感覺(jué)延遲,所以在進(jìn)行應(yīng)用初始化的時(shí)候采取以下策略:

  • 1、在Application的構(gòu)造器方法、attachBaseContext()、onCreate()方法中不要進(jìn)行耗時(shí)操作的初始化,一些數(shù)據(jù)預(yù)取放在異步線程中,可以采取Callable實(shí)現(xiàn)。
  • 2、對(duì)于sp的初始化,因?yàn)閟p的特性在初始化時(shí)候會(huì)對(duì)數(shù)據(jù)全部讀出來(lái)存在內(nèi)存中,所以這個(gè)初始化放在主線程中不合適,反而會(huì)延遲應(yīng)用的啟動(dòng)速度,對(duì)于這個(gè)還是需要放在異步線程中處理。
  • 3、對(duì)于MainActivity,由于在獲取到第一幀前,需要對(duì)contentView進(jìn)行測(cè)量布局繪制操作,盡量減少布局的層次,考慮StubView的延遲加載策略,當(dāng)然在onCreate、onStart、onResume方法中避免做耗時(shí)操作。

遵循上面三種策略可明顯提高app啟動(dòng)速度。

優(yōu)化應(yīng)用啟動(dòng)時(shí)的體驗(yàn)

對(duì)于應(yīng)用的啟動(dòng)時(shí)間,只能是盡量的避免一些耗時(shí)的、非必要的操作在主線程中,這樣相對(duì)可以縮減一部分啟動(dòng)的耗時(shí),另外一方面在等待第一幀顯示的時(shí)間里,可以加入一些配置以增加體驗(yàn),比如加入Activity的background,這個(gè)背景會(huì)在顯示第一幀前提前顯示在界面上。
1、先為主界面單獨(dú)寫(xiě)一個(gè)主題style,設(shè)置一張待顯示的圖片,這里我設(shè)置了一個(gè)顏色,然后在manifest中設(shè)置給MainActivity:

<style name="AppTheme.Launcher">
 <item name="android:windowBackground">@drawable/bule</item>
</style>
//...
  <activity
   android:name=".MainActivity"
   android:label="@string/app_name"
   android:theme="@style/AppTheme.Launcher">
   <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
   </intent-filter>
  </activity>

2、然后在MainActivity中加載布局前把AppTheme重新設(shè)置給MainActivity:

@Override
 protected void onCreate(Bundle savedInstanceState) {

  setTheme(R.style.AppTheme);
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
} 

這樣在啟動(dòng)時(shí)會(huì)先顯示background,然后待界面繪制完成再顯示主界面:

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家學(xué)習(xí)Android軟件編程有所幫助。

相關(guān)文章

  • android仿360加速球?qū)崿F(xiàn)內(nèi)存釋放

    android仿360加速球?qū)崿F(xiàn)內(nèi)存釋放

    本篇文章實(shí)現(xiàn)了Android仿360加速球?qū)崿F(xiàn)內(nèi)存釋放,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-10-10
  • android開(kāi)發(fā)中使用java觀察者模式

    android開(kāi)發(fā)中使用java觀察者模式

    遇到android程序中后入棧的一個(gè)Activity需要更新之前一個(gè)或者兩個(gè)以上Activity中的數(shù)據(jù)時(shí)使用,或者需要在adapter中修改Activity或者fragment的數(shù)據(jù)和ui等
    2014-02-02
  • Android使用控件ImageView加載圖片的方法

    Android使用控件ImageView加載圖片的方法

    這篇文章主要為大家詳細(xì)介紹了Android使用ImageView加載圖片的方法,Android ImageView如何加載網(wǎng)絡(luò)圖片資源,感興趣的小伙伴們可以參考一下
    2016-05-05
  • Android整理好的圖片壓縮工具類

    Android整理好的圖片壓縮工具類

    今天小編就為大家分享一篇關(guān)于Android整理好的圖片壓縮工具類,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-12-12
  • Android實(shí)現(xiàn)左右擺動(dòng)的球體動(dòng)畫(huà)效果

    Android實(shí)現(xiàn)左右擺動(dòng)的球體動(dòng)畫(huà)效果

    這篇文章主要介紹了Android實(shí)現(xiàn)左右擺動(dòng)的球體動(dòng)畫(huà)效果,本文介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-09-09
  • Android開(kāi)發(fā)自學(xué)筆記(一):Hello,world!

    Android開(kāi)發(fā)自學(xué)筆記(一):Hello,world!

    這篇文章主要介紹了Android開(kāi)發(fā)自學(xué)筆記(一):Hello,world!本文講解了創(chuàng)建HelloWorld工程、編寫(xiě)代碼、啟動(dòng)模擬器等步驟,需要的朋友可以參考下
    2015-04-04
  • Android Intent傳遞數(shù)據(jù)大小限制詳解

    Android Intent傳遞數(shù)據(jù)大小限制詳解

    這篇文章主要給大家介紹了關(guān)于Android Intent傳遞數(shù)據(jù)大小限制的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)各位Android開(kāi)發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Android使用VideoView出現(xiàn)無(wú)法播放此視頻問(wèn)題的解決方法

    Android使用VideoView出現(xiàn)無(wú)法播放此視頻問(wèn)題的解決方法

    Android提供了 VideoView組件,它的作用與ImageView類似,只是ImageView用于顯示圖片,而VideoView用于播放視頻,下面這篇文章主要給大家介紹了關(guān)于利用VideoView出現(xiàn)無(wú)法播放此視頻問(wèn)題的解決方法,需要的朋友可以參考下
    2018-07-07
  • Android?自定義view中根據(jù)狀態(tài)修改drawable圖片

    Android?自定義view中根據(jù)狀態(tài)修改drawable圖片

    這篇文章主要介紹了Android?自定義view中根據(jù)狀態(tài)修改drawable圖片的相關(guān)資料,需要的朋友可以參考下
    2023-07-07
  • Android Studio Kotlin代碼和java代碼相互轉(zhuǎn)化實(shí)例

    Android Studio Kotlin代碼和java代碼相互轉(zhuǎn)化實(shí)例

    這篇文章主要介紹了Android Studio Kotlin代碼和java代碼相互轉(zhuǎn)化實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-03-03

最新評(píng)論