Android優化筆記--啓動優化

   Android APP優化越來越被很多開發者重視,他們期望自己開發的應用,都能得到用戶的好評,關鍵就在於給用戶一個良好的體驗上。啓動優化的出現是因爲,很多APP在從桌面點開的時候,會出現白屏或黑屏,有的會出現點擊後,過很長時間纔出現應用的首頁。這些都會給應用帶來不好的體驗。    
    這方面的優化需要你對Android啓動有大致的瞭解。 
  系統啓動步驟
  1 當 Android手機打開電源時,Android系統首先引導芯片代碼加載引導程序 BootLoader 到 RAM 中去執行。
  2 然後 BootLoader 把操作系統拉起來。
  3 Linux 內核啓動開始系統設置,找到一個 init.rc 文件啓動初始化進程。
  4 init 進程初始化和啓動屬性服務,然後開啓 Zygote 孵化進程。
  5 Zygote 開始創建 JVM 並註冊 JNI 方法,開啓 SystemServer。啓動 Binder 線程池和 SystemServiceManager,並啓動各種系統服務。

  應用的啓動流程
   Application從構造方法開始--> attachBaseContext()-->onCreate()--->Activity構造方法-->
 onCreate()--->設置顯示界面佈局,設置主題,背景等屬性--->onStart()--->onResume()--->顯示裏面的View(測量,佈局,繪製,顯示到界面) 

  常見應用啓動方式:
    1)冷啓動:當直接從桌面上直接啓動,同時後臺沒有該進程的緩存,這個時候系統就需要
重新創建一個新的進程並且分配各種資源。(較慢)
    2) 熱啓動:該app後臺有該進程的緩存,這時候啓動的進程就屬於熱啓動。(較快)
    
     時間的消耗:在MainActivity顯示之前,主線程所做動作時間的消耗,比如第三方SDK初始化,大量IO,網絡請求等;簡而言之
Application的初始化+ MainActivity的界面繪製。     
    
   如何測量應用的啓動時間:
    使用命令行來啓動app,同時進行時間測量,如下:
    adb shell am start -W [PackageName]/[PackageName.MainActivity]
    
    通常情況下,由於MainActivity的業務和佈局複雜度非常高,該界面必須要有一些初始化的數據才能顯示這個時候MainActivity就可能半天都出不來,這就給用戶感覺app太卡了。    

    常見的優化方案如下:
    方案1:
    設置 windowbackgroud 爲透明的
    <item name="android:windowIsTranslucent">true</item> 
    或者 單獨做成一個 AppTheme.Launcher

    <style name="AppTheme.Launcher">
        <item name="android:windowFullscreen">true</item>
        <item name="android:windowBackground">@drawable/ic_launcher</item>
    </style>

  在清單文件中 啓動 Activity 加入該 主題
   

    <activity
            android:name="com.test.activity.LoginActivity"
            android:configChanges="keyboardHidden|orientation|screenSize"
            android:theme="@style/AppTheme.Launcher"
            android:windowSoftInputMode="adjustUnspecified|stateHidden">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        

 在啓動 Activity 頁面中加入

setTheme(R.style.AppTheme_Launcher);//在setContentView之前    

  3 懶加載
    將第三方SDK的初始化,數據庫操作,網絡等操作放到IntentService 的onHandleIntent ()裏面去操作,或者開啓一個單獨的線程池來初始化。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章