AndroidのAppアプリケーション起動分析と最適化

9618 ワード

前言:
昨夜の新バージョンがついに発表されましたが、テストフィードバックappが起動してから長い間appのホームページに入っていなかったことを覚えています.だから、今日はクラスを追加してApp起動のことをまとめるつもりです.
appの起動方法:
 1.)コールドスタート
アプリケーションを起動すると、バックグラウンドにアプリケーションのプロセスがありません.この場合、システムは新しいプロセスを再作成してアプリケーションに割り当てます.この起動方法はコールド起動です.コールドスタートは、システムが新しいプロセスを再作成して割り当てるため、アプリケーションクラスを作成および初期化してから、一連の測定、レイアウト、描画を含むMainActivityクラスを作成および初期化し、最後にインタフェースに表示します.
 2.)ホットスタート
アプリケーションを起動すると、バックグラウンドにアプリケーションのプロセス(例:backキー、homeキーを押すと、アプリケーションは終了しますが、アプリケーションのプロセスはバックグラウンドに残っていて、タスクリストに入って表示できます)があるので、既存のプロセスの場合、この起動は既存のプロセスからアプリケーションを起動します.この方法はホット起動と呼ばれます.ホット・スタートは、既存のプロセスから開始されるため、ホット・スタートはアプリケーションを実行するのではなく、一連の測定、レイアウト、描画を含むMainActivityを直接実行するため、ホット・スタートのプロセスは、新しいプロセスの作成からプロセスの破棄までアプリケーションが1回だけ初期化されるため、アプリケーションを作成および初期化する必要はありません.
appの起動プロセス:
上記の2つの起動方法から、app起動プロセスは以下の通りであることがわかります.
Applicationのコンストラクタメソッド-->attachBaseContext()->onCreate()->Activityのコンストラクタメソッド->onCreate()->トピック内の背景などのプロパティの構成->onStart()->onResume()->レイアウトペイントの測定をインタフェースに表示
appの起動最適化:
上記の起動プロセスに基づいて、できるだけ以下の点を行います.
  • Applicationの作成中にできるだけ少ない時間を費やす操作
  • を行う.
  • SharePreferenceを使用する場合、
  • はできるだけ非同期スレッドで動作.
  • レイアウトの階層を低減し、ライフサイクルコールバックの方法で消費時間を最小限に抑える
  • app起動黒画面または白画面の問題に遭遇
      1.)発生原因
    実は黒いスクリーンあるいは白いスクリーンを表示するのは本当に正常で、これはまだレイアウトファイルにロードしていないため、すでにwindowウィンドウの背景を表示して、黒いスクリーンの白いスクリーンはwindowウィンドウの背景です.
    例:
      
     2.)解決策
    設定によるスタイルの設定
    (1)背景図Themeの設定
    背景図を設定します.プログラムが起動すると、まずこの背景図を表示し、黒い画面が表示されないようにします.
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
            <item name="android:screenOrientation">portrait</item>
            <item name="android:windowBackground">>@mipmap/splash</item>
            <item name="android:windowIsTranslucent">true</item>
            <item name="android:windowNoTitle">true</item>
    </style>

     
     
    (2)透明度の設定
    スタイルを透明に設定することで、プログラムが起動すると黒い画面ではなく透明になり、インタフェースが初期化されてから一度に表示されます.
        <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
            <item name="android:windowNoTitle">true</item>
            <item name="android:windowBackground">@android:color/transparent</item>
            <item name="android:windowIsTranslucent">true</item>
            <item name="android:screenOrientation">portrait</item>
        </style>

    両者の比較:
  • Theme 1プログラムの起動が速く、インタフェースに背景図が表示されてから、他のインタフェースコントロールがリフレッシュされます.非同期感をリフレッシュします.
  • Theme 2はプログラムの起動が遅い感じがして、インタフェースが一度にブラシされて、同期をリフレッシュします.

  • (3)AndroidManifestを修正する.xml
     <application
            android:name=".App"
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:supportsRtl="true">
            <activity android:name=".MainActivity"
             android:theme="@style/AppTheme">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
    
        //......
    
    </application>

    解決後の例:
    3.)一般的なThemeテーマ
    android:theme="@android:style/Theme.Dialog" //Activity        
    
    android:theme="@android:style/Theme.NoTitleBar" //          
    
    android:theme="@android:style/Theme.NoTitleBar.Fullscreen" //          ,   
    
    android:theme="Theme.Light " //     
    
    android:theme="Theme.Light.NoTitleBar" //         
    
    android:theme="Theme.Light.NoTitleBar.Fullscreen" //    ,    ,  
    
    android:theme="Theme.Black" //    
    
    android:theme="Theme.Black.NoTitleBar" //         
    
    android:theme="Theme.Black.NoTitleBar.Fullscreen" //    ,    ,  
    
    android:theme="Theme.Wallpaper" //            
    
    android:theme="Theme.Wallpaper.NoTitleBar" //            ,     
    
    android:theme="Theme.Wallpaper.NoTitleBar.Fullscreen" //            ,    ,  
    
    android:theme="Theme.Translucent" //    
    
    android:theme="Theme.Translucent.NoTitleBar" //        
    
    android:theme="Theme.Translucent.NoTitleBar.Fullscreen" //        ,  
    
    android:theme="Theme.Panel " //      
    
    android:theme="Theme.Light.Panel" //