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

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

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

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

啟動方式

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

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

特點

1、冷啟動:冷啟動因為系統(tǒng)會重新創(chuàng)建一個新的進程分配給它,所以會先創(chuàng)建和初始化Application類,再創(chuàng)建和初始化MainActivity類(包括一系列的測量、布局、繪制),最后顯示在界面上。

2、熱啟動:熱啟動因為會從已有的進程中來啟動,所以熱啟動就不會走Application這步了,而是直接走MainActivity(包括一系列的測量、布局、繪制),所以熱啟動的過程只需要創(chuàng)建和初始化一個MainActivity就行了,而不必創(chuàng)建和初始化Application,因為一個應(yīng)用從新進程的創(chuàng)建到進程的銷毀,Application只會初始化一次。

上面說的啟動是點擊app的啟動圖標來啟動的,而另外一種方式是進入最近使用的列表界面來啟動應(yīng)用,這種不應(yīng)該叫啟動,應(yīng)該叫恢復。

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

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

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

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

三、測量應(yīng)用啟動的時間

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

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

從點擊應(yīng)用的啟動圖標開始創(chuàng)建出一個新的進程直到我們看到了界面的第一幀,這段時間就是應(yīng)用的啟動時間。

我們要測量的也就是這段時間,測量這段時間可以通過adb shell命令的方式進行測量,這種方法測量的最為精確,命令為:

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

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

下面是測量一個應(yīng)用冷啟動和熱啟動的時間:
冷啟動:

熱啟動:

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

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

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

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

遵循上面三種策略可明顯提高app啟動速度。

優(yōu)化應(yīng)用啟動時的體驗

對于應(yīng)用的啟動時間,只能是盡量的避免一些耗時的、非必要的操作在主線程中,這樣相對可以縮減一部分啟動的耗時,另外一方面在等待第一幀顯示的時間里,可以加入一些配置以增加體驗,比如加入Activity的background,這個背景會在顯示第一幀前提前顯示在界面上。
1、先為主界面單獨寫一個主題style,設(shè)置一張待顯示的圖片,這里我設(shè)置了一個顏色,然后在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);
} 

這樣在啟動時會先顯示background,然后待界面繪制完成再顯示主界面:

以上就是本文的全部內(nèi)容,希望對大家學習Android軟件編程有所幫助。

相關(guān)文章

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

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

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

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

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

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

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

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

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

    Android實現(xiàn)左右擺動的球體動畫效果

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

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

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

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

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

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

    Android提供了 VideoView組件,它的作用與ImageView類似,只是ImageView用于顯示圖片,而VideoView用于播放視頻,下面這篇文章主要給大家介紹了關(guān)于利用VideoView出現(xià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)化實例

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

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

最新評論