最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談android性能優(yōu)化之啟動過程(冷啟動和熱啟動)

 更新時間:2017年08月24日 17:09:40   作者:遜志  
本篇文章主要介紹了淺談android性能優(yōu)化之啟動過程(冷啟動和熱啟動) ,具有一定的參考價值,感興趣的小伙伴們可以參考一下。

本文介紹了淺談android性能優(yōu)化之啟動過程(冷啟動和熱啟動) ,分享給大家,具體如下:

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

通常來說,啟動方式分為兩種:冷啟動和熱啟動。

1、冷啟動:當(dāng)啟動應(yīng)用時,后臺沒有該應(yīng)用的進(jìn)程,這時系統(tǒng)會重新創(chuàng)建一個新的進(jìn)程分配給該應(yīng)用,這個啟動方式就是冷啟動。

2、熱啟動:當(dāng)啟動應(yīng)用時,后臺已有該應(yīng)用的進(jìn)程(例:按back鍵、home鍵,應(yīng)用雖然會退出,但是該應(yīng)用的進(jìn)程是依然會保留在后臺,可進(jìn)入任務(wù)列表查看),所以在已有進(jìn)程的情況下,這種啟動會從已有的進(jìn)程中來啟動應(yīng)用,這個方式叫熱啟動。

特點

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

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

因為一個應(yīng)用從新進(jìn)程的創(chuàng)建到進(jìn)程的銷毀,Application只會初始化一次。

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

冷啟動啟動流程:當(dāng)點擊app的啟動圖標(biāo)時,安卓系統(tǒng)會從Zygote進(jìn)程中fork創(chuàng)建出一個新的進(jìn)程分配給該應(yīng)用,之后會依次創(chuàng)建和初始化Application類、創(chuàng)建MainActivity類、加載主題樣式Theme中的              

windowBackground等屬性設(shè)置給MainActivity以及配置Activity層級上的一些屬性、再inflate布局、當(dāng)onCreate/onStart/onResume方法都走完了后最后才進(jìn)行contentView的measure/layout/draw顯示在界面上,所以直到這里,

應(yīng)用的第一次啟動才算完成,這時候我們看到的界面也就是所說的第一幀。所以,總結(jié)一下,應(yīng)用的啟動流程如下:

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

大致流程如下:

1、點擊桌面圖標(biāo),Launcher會啟動程序默認(rèn)的Acticity,之后再按照程序的邏輯啟動各種Activity

2、啟動Activity都需要借助應(yīng)用程序框架層的ActivityManagerService服務(wù)進(jìn)程(Service也是由ActivityManagerService進(jìn)程來啟動的);在Android應(yīng)用程序框架層中,ActivityManagerService是一個非常重要的接口,

它不但負(fù)責(zé)啟動Activity和Service,還負(fù)責(zé)管理Activity和Service。

Step 1. 無論是通過Launcher來啟動Activity,還是通過Activity內(nèi)部調(diào)用startActivity接口來啟動新的Activity,都通過Binder進(jìn)程間通信進(jìn)入到ActivityManagerService進(jìn)程中,并且調(diào)用ActivityManagerService.startActivity接口;

Step 2. ActivityManagerService調(diào)用ActivityStack.startActivityMayWait來做準(zhǔn)備要啟動的Activity的相關(guān)信息;

Step 3. ActivityStack通知ApplicationThread要進(jìn)行Activity啟動調(diào)度了,這里的ApplicationThread代表的是調(diào)用ActivityManagerService.startActivity接口的進(jìn)程,對于通過點擊應(yīng)用程序圖標(biāo)的情景來說,這個進(jìn)程就是Launcher了,

而對于通過在Activity內(nèi)部調(diào)用startActivity的情景來說,這個進(jìn)程就是這個Activity所在的進(jìn)程了;

Step 4. ApplicationThread不執(zhí)行真正的啟動操作,它通過調(diào)用ActivityManagerService.activityPaused接口進(jìn)入到ActivityManagerService進(jìn)程中,看看是否需要創(chuàng)建新的進(jìn)程來啟動Activity;

Step 5. 對于通過點擊應(yīng)用程序圖標(biāo)來啟動Activity的情景來說,ActivityManagerService在這一步中,會調(diào)用startProcessLocked來創(chuàng)建一個新的進(jìn)程,而對于通過在Activity內(nèi)部調(diào)用startActivity來啟動新的Activity來說,這一步是不需要執(zhí)行的,

因為新的Activity就在原來的Activity所在的進(jìn)程中進(jìn)行啟動;

Step 6. ActivityManagerServic調(diào)用ApplicationThread.scheduleLaunchActivity接口,通知相應(yīng)的進(jìn)程執(zhí)行啟動Activity的操作;

Step 7. ApplicationThread把這個啟動Activity的操作轉(zhuǎn)發(fā)給ActivityThread,ActivityThread通過ClassLoader導(dǎo)入相應(yīng)的Activity類,然后把它啟動起來。

三、冷啟動過程中碰到的白屏黑屏以及優(yōu)化啟動時間

1、白屏問題 :

android studio升級 2.0之后 加上Instant Run,Instant Run為了能夠讓我們快速部署代碼,背后其實是有一套非常復(fù)雜的邏輯的,比如要在APK中建立服務(wù)器與Android Studio進(jìn)行通信,以及代碼差異比對和替換等,在研發(fā)過程中可能出現(xiàn)白屏問題,

一般release版的程序是不會出現(xiàn)這種現(xiàn)象的;

如果接下來還會出現(xiàn)白屏問題,可以查看style文件

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
......
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowNoTitle">true</item>
</style> 

加入了兩個屬性,windowIsTranslucent和windowNoTitle,將這兩個屬性都設(shè)置成true,就可以讓程序在初始化的時候窗口是透明的,初始化結(jié)束后程序主界面才會顯示出來,從而也就完全看不到白屏界面了

2、啟動時間的優(yōu)化

先測量activity的啟動時間-------Activity的reportFullyDrawn()方法

你就需要調(diào)用Activity的reportFullyDrawn()。它將在log里報告從apk初始化(和前面Displayed的時間是一樣的)到reportFullyDrawn() 方法被調(diào)用用了多長時間。

reportFullyDrawn()方法顯示的log也是類似這樣:

ActivityManager: Displayed com.Android.myexample/.StartupTiming: +768ms

在4.4上調(diào)用reportFullyDrawn()方法會崩潰(但是log還是能正常打?。?,提示需要UPDATE_DEVICE_STATS權(quán)限 ,但是這個權(quán)限只有系統(tǒng)app才能授權(quán)。解決的辦法是這樣調(diào)

 try{

  reportFullyDrawn();

  }catch(SecurityException e){

  }

還有一種測量啟動時間的方法也值得一提,那就是screenrecord命令

首先啟動帶—bugreport選項(它可以在frames 中添加時間戳-應(yīng)該是L中的特性)的screenrecord 命令:

$ adb shell screenrecord --bugreport /sdcard/launch.mp4

然后點擊app的圖標(biāo),等待app顯示,ctrl-C screenrecord, 使用adb pull命令把文件導(dǎo)出到電腦。

$ adb pull /sdcard/launch.mp4

現(xiàn)在你可以打開錄制視頻看看發(fā)生了什么。你需要一個能逐幀查看的視頻播放器(mac上的Quicktime 就可以,不清楚其它os上什么播放器這個功能最好使)?,F(xiàn)在逐幀播放,注意視頻的上方有一個frame 時間戳。

一直往前直到你發(fā)現(xiàn)app圖標(biāo)高亮了為止。這個時候系統(tǒng)已經(jīng)處理了圖標(biāo)上的點擊事件,開始啟動app了,記錄下這一幀的時間。繼續(xù)播放幀直到你看到了app整個UI的第一幀為止。根據(jù)不同情況(是否有啟動窗口,是否有啟動畫面等等),

事件和窗口發(fā)生的實際順序可能會有不同。對于一個簡單的app來說,你會首先見到啟動窗口,然后漸變出app真實的UI。在你看到UI上的任何內(nèi)容之后,你應(yīng)該記錄下第一幀,這時app完成了布局和繪制,準(zhǔn)備開始顯示出來了。同時也記錄下這一幀所發(fā)生的時間。

現(xiàn)在把這兩個時間相減 ((UI displayed) - (icon tapped)); 得到app從點擊到繪制就緒的所有時間。雖然這個時間包含了進(jìn)程啟動之前的時間,但是至少它可以用于跟其他app比較。

Android冷啟動時間優(yōu)化

冷啟動時間是指當(dāng)用戶點擊你的app那一刻到系統(tǒng)調(diào)用Activity.onCreate()之間的時間段。在這個時間段內(nèi),WindowManager會先加載app主題樣式中的windowBackground做為app的預(yù)覽元素,然后再真正去加載activity的layout布局

冷啟動時間優(yōu)化

知道了Android冷啟動時間的原理之后,就可以通過一些小技巧來對冷啟動時間進(jìn)行優(yōu)化,從而讓你app加載變得”快“一些(視覺體驗上的快)。我們可制作一個啟動Activity的背景樣式的.9圖片,然后把這個.9圖片做為windowBackground。

圖片制作好之后,我們就可以用它做為app冷啟動階段的預(yù)覽元素,如下設(shè)置:

 為啟動的Activity自定義一個Theme

<style name="AppTheme.Launcher">

  <item name="android:windowBackground">@drawable/window_background_statusbar_toolbar_tab</item>

</style> 

將新的Theme應(yīng)用到設(shè)置到AndroidManifest.xml中

<activity

  android:name=".MainActivity"

  android:theme="@style/AppTheme.Launcher">

 

  <intent-filter>

    <action android:name="android.intent.action.MAIN" />

    <category android:name="android.intent.category.LAUNCHER" />

  </intent-filter>

</activity> 

由于給MainActivity設(shè)置了一個新的Theme,這樣做會覆蓋原來的Theme,所以在MainActivity中需要設(shè)置回原來的Theme

public class MainActivity extends AppCompatActivity {
 
  @Override
  protected void onCreate(Bundle savedInstanceState) {
 
    // Make sure this line comes before calling super.onCreate().
    setTheme(R.style.AppTheme);
 
    super.onCreate(savedInstanceState);
  }
}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android使用Kotlin和RxJava 2.×實現(xiàn)短信驗證碼倒計時效果

    Android使用Kotlin和RxJava 2.×實現(xiàn)短信驗證碼倒計時效果

    本篇文章主要介紹了Android使用Kotlin和RxJava 2.×實現(xiàn)短信驗證碼倒計時效果,非常具有實用價值,需要的朋友可以參考下
    2017-12-12
  • android實現(xiàn)節(jié)點進(jìn)度條效果

    android實現(xiàn)節(jié)點進(jìn)度條效果

    這篇文章主要為大家詳細(xì)介紹了android實現(xiàn)節(jié)點進(jìn)度條效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • Gradle學(xué)習(xí)教程之部署上傳項目詳解

    Gradle學(xué)習(xí)教程之部署上傳項目詳解

    這篇文章主要給大家介紹了關(guān)于Gradle學(xué)習(xí)教程之部署上傳項目的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-04-04
  • 詳解Android全局異常的捕獲處理

    詳解Android全局異常的捕獲處理

    這篇文章主要為大家介紹了Android全局異常的捕獲處理,為什么要進(jìn)行捕獲處理,如何進(jìn)行捕獲處理,想要了解的朋友可以參考一下
    2016-01-01
  • Android開發(fā)中Toast顯示消息的方法小結(jié)

    Android開發(fā)中Toast顯示消息的方法小結(jié)

    這篇文章主要介紹了Android開發(fā)中Toast顯示消息的方法,結(jié)合實例形式總結(jié)分析了Toast的功能、創(chuàng)建Toast對象及調(diào)用相關(guān)函數(shù)顯示消息提示框的操作技巧,需要的朋友可以參考下
    2016-10-10
  • Android形狀圖形與狀態(tài)列表圖形及九宮格圖片超詳細(xì)講解

    Android形狀圖形與狀態(tài)列表圖形及九宮格圖片超詳細(xì)講解

    這篇文章主要介紹了Android形狀圖形與狀態(tài)列表圖形及九宮格圖片的應(yīng)用方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-09-09
  • 解析Android開發(fā)優(yōu)化之:對界面UI的優(yōu)化詳解(一)

    解析Android開發(fā)優(yōu)化之:對界面UI的優(yōu)化詳解(一)

    在Android應(yīng)用開發(fā)過程中,屏幕上控件的布局代碼和程序的邏輯代碼通常是分開的。界面的布局代碼是放在一個獨立的xml文件中的,這個文件里面是樹型組織的,控制著頁面的布局
    2013-05-05
  • Android獲取手機信息的工具類

    Android獲取手機信息的工具類

    這篇文章主要為大家詳細(xì)介紹了Android獲取手機信息的工具類,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • Android Binder進(jìn)程間通信工具AIDL使用示例深入分析

    Android Binder進(jìn)程間通信工具AIDL使用示例深入分析

    Binder作為Android 眾多的IPC通訊手段之一,在Framework的數(shù)據(jù)傳輸中起到極為關(guān)鍵的作用。Binder機制可謂是Android 知識體系里的重中之重,作為偏底層的基礎(chǔ)組件,平時我們很少關(guān)注它,而它卻是無處不在,也是Android 面試易考察的點之一
    2022-11-11
  • Android使用文件進(jìn)行數(shù)據(jù)存儲的方法

    Android使用文件進(jìn)行數(shù)據(jù)存儲的方法

    這篇文章主要介紹了Android使用文件進(jìn)行數(shù)據(jù)存儲的方法,較為詳細(xì)的分析了Android基于文件實現(xiàn)數(shù)據(jù)存儲所涉及的相關(guān)概念與使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-09-09

最新評論

屏南县| 阳朔县| 灵宝市| 宁强县| 巩义市| 项城市| 商南县| 铜梁县| 靖安县| 睢宁县| 库伦旗| 安徽省| 东海县| 久治县| 布尔津县| 汤阴县| 台安县| 石楼县| 咸阳市| 平武县| 东台市| 蒙山县| 来凤县| 赤壁市| 饶河县| 汉寿县| 西宁市| 丰镇市| 栾川县| 新源县| 德保县| 怀仁县| 嵊州市| 重庆市| 满洲里市| 来宾市| 大荔县| 石景山区| 江华| 祥云县| 石泉县|