亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android優化提升應用啟動速度及Splash頁面的設計方法

發布時間:2021-12-10 09:36:32 來源:億速云 閱讀:287 作者:iii 欄目:開發技術

這篇文章主要介紹“Android優化提升應用啟動速度及Splash頁面的設計方法”,在日常操作中,相信很多人在Android優化提升應用啟動速度及Splash頁面的設計方法問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Android優化提升應用啟動速度及Splash頁面的設計方法”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

1.啟動分為兩種方式

  • 1) 冷啟動:當直接從桌面上直接啟動,同時后臺沒有該進程的緩存,這個時候系統就需要重新創建一個新的進程并且分配各種資源。

  • 2) 熱啟動:app后臺有該進程的緩存,這時候啟動的進程就屬于熱啟動。

  • 熱啟動不需要重新分配進程,也不會Application了,直接走的就是app的入口Activity,這樣速度就很快

2.如何測量一個應用的啟動時間

使用命令行來啟動app,同時進行時間測量。單位:毫秒

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

例: adb shell am start -W com.haocai.app/.activity.GuideActivity

Android優化提升應用啟動速度及Splash頁面的設計方法

Android優化提升應用啟動速度及Splash頁面的設計方法

熱啟動耗時:

打印的結果為:

  • ThisTime activity啟動耗時

  • TotalTime 應用自身啟動耗時=ThisTime+應用application等資源啟動時間

  • WaitTime 系統啟動應用耗時=TotalTime+系統資源啟動時間

3.應用啟動的流程

Application從構造方法開始 ---> attachBaseContext() ---> onCreate()
Activity
構造方法 ---> onCreate() ---> 設置顯示界面布局,設置主題、背景等等屬性 ---> onStart()
---> onResume() ---> 顯示里面的View(測量、布局、繪制,顯示到界面上)

從構造方法我們知道,啟動耗時的主要花費在各個啟動流程中

4.減少應用的啟動時間的耗時

根據應用的啟動流程,我們從而得到以下減少應用啟動耗時操作的建議:

  • 不要在Application的構造方法、attachBaseContext()onCreate()里面進行初始化耗時操作。

  • MainActivity,由于用戶只關心最后顯示的這一幀,對我們的布局的層次要求減 自定義控件的測量、布局、繪制的時間。 同時 不要在onCreateonStartonResume當中的做耗時操作。

  • 對于SharedPreference的初始化

因為它初始化的時候是需要將數據全部讀取出來放到內存當中。

  • 優化1:可以盡可能減少sp文件數量(IO需要時間)

  • 優化2:像這樣的初始化最好放到線程里面

  • 優化3:大量的數據緩存到數據庫中

app啟動的耗時主要在:Application初始化 + MainActivity的界面加載繪制時間。

由于MainActvity的業務和布局復雜度非常高,甚至該界面必須要有一些初始化的數據才能顯示。
那么這個時候MainActivity就可能半天都出不來,這就給用戶感覺App太卡了。

常規方法:

1.我們要做的就是給用戶趕緊利落的體驗。點擊app就立馬彈出我們的界面。
于是乎想到使用SplashActivity--非常簡單的一個歡迎頁面上面都不干就只顯示一個圖片。
2.但是SplashActivity啟動之后,還是需要跳到MainActivityMainActivity還是需要從頭開始加載布局和數據。
想到SplashActivity里面可以去做一些MainActivity的數據的預加載。然后需要通過意圖傳到MainActivity

更好的優化:

耗時的問題:Application+Activity的啟動及資源加載時間;預加載的數據花的時間。

如果我們能讓這兩個時間重疊在一個時間段內并發地做這兩個事情就省時間了。

比如:SplashActivityMainActivity合為一個。

一進來還是顯示MainActivitySplashActivity可以變成一個SplashFragment,然后放一個FrameLayout作為根布局直接顯示SplashFragment界面。
SplashFragment里面非常之簡單,就是現實一個圖片,啟動非常快。

SplashFragment顯示完畢后再將它remove。同時在splash的2S的友好時間內進行網絡數據緩存。
這個時候我們才看到MainActivity,就不必再去等待網絡數據返回了。

新問題SplashViewContentView加載放到一起來做了 ,這可能會影響應用的啟動時間?

解決:可以使用ViewStub延遲加載MainActivity當中的View來達到減輕這個影響。
viewStub的設計就是為了防止MainActivity的啟動加載資源太耗時了。延遲進行加載,不影響啟動,用戶友好。
但是viewStub加載也需要時間。等到主界面出來以后。
viewStub.inflate(xxxx);

5.如何設計延遲加載DelayLoad

第一時間想到的就是在onCreate里面調用Handler.postDelayed()方法;
問題一:這個延時時間如何控制
不同的機器啟動速度不一樣,這個時間如何控制?
假設,先需要splash做一個2s動畫,然后在MainActivity中主界面加載完成之后,關閉splash頁面

如果這樣寫:

mHandler.postDelayed(new Runnable() {
            @Override
            public void run() {
                mProgressBar.setVisibility(View.GONE);
                iv.setVisibility(View.VISIBLE);
            }
        }, 2500);

是無法在準確監聽頁面加載完的

問題:什么時候應用已經啟動并加載完成,界面已經顯示出來了。
采用onResume執行完了之后才顯示完畢?不行。

建議采用getDecorView() 獲取上級view 然后添加視圖

綜合上訴方案,以下是關鍵代碼:

public class MainActivity extends AppCompatActivity {

    private Handler mHandler = new Handler();
    private SplashFragment splashFragment;
    private ViewStub viewStub;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        splashFragment = new SplashFragment();
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        transaction.replace(R.id.frame, splashFragment);
        transaction.commit();

        /**
         *這么寫不好判斷視圖有沒有加載完
         */
        //      mHandler.postDelayed(new Runnable() {
//          @Override
//          public void run() {
//              mProgressBar.setVisibility(View.GONE);
//              iv.setVisibility(View.VISIBLE);
//          }
//      }, 2500);

        viewStub = (ViewStub) findViewById(R.id.content_viewstub);

        //1.判斷當窗體加載完畢的時候,立馬再加載真正的布局進來
        getWindow().getDecorView().post(new Runnable() {

            @Override
            public void run() {
                // 開啟延遲加載
                mHandler.post(new Runnable() {

                    @Override
                    public void run() {
                        //將viewstub加載進來
                        viewStub.inflate();
                    }
                });
            }
        });

        //2.判斷當窗體加載完畢的時候執行,延遲一段時間做動畫。
        getWindow().getDecorView().post(new Runnable() {
            @Override
            public void run() {
                // 開啟延遲加載,也可以不用延遲可以立馬執行(我這里延遲是為了實現fragment里面的動畫效果的耗時)
                mHandler.postDelayed(new DelayRunnable(MainActivity.this, splashFragment), 2000);
            }
        });

    //3.同時進行異步加載數據
        //......
    }
    

    static class DelayRunnable implements Runnable {

        private WeakReference<Context> contextWeakReference;
        private WeakReference<SplashFragment> splashFragmentWeakReference;

        public DelayRunnable(Context context, SplashFragment f) {
            contextWeakReference = new WeakReference<Context>(context);
            splashFragmentWeakReference = new WeakReference<SplashFragment>(f);
        }

        @Override
        public void run() {
            //移除Fragment
            if (contextWeakReference != null) {
                SplashFragment splashFragment = splashFragmentWeakReference.get();
                if (splashFragment == null) {
                    return;
                }
                FragmentActivity activity = (FragmentActivity) contextWeakReference.get();
                FragmentTransaction transaction = activity.getSupportFragmentManager().beginTransaction();
                transaction.remove(splashFragment);
                transaction.commit();
            }

        }
    }
}

activity_main.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
   >

    <ViewStub 
        android:id="@+id/content_viewstub"
        android:layout="@layout/activity_main_viewstub"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

    <FrameLayout
        android:id="@+id/frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </FrameLayout>

</RelativeLayout>

Android優化提升應用啟動速度及Splash頁面的設計方法

ps:測試數據是在老款三星手機下所得耗時數據。
不過相較于SplashActivity+MainActivity啟動速度優化還是挺明顯的。大家可以在自己手機上試試。

到此,關于“Android優化提升應用啟動速度及Splash頁面的設計方法”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

西丰县| 页游| 高邑县| 新乡县| 沛县| 宁晋县| 宜都市| 阿勒泰市| 柘城县| 大姚县| 嘉定区| 蕉岭县| 五指山市| 清水河县| 荣成市| 荆州市| 英山县| 阳信县| 莒南县| 江永县| 嘉兴市| 安溪县| 河间市| 江孜县| 建始县| 宁晋县| 工布江达县| 广汉市| 弋阳县| 宣威市| 瑞安市| 通江县| 镇江市| 邵东县| 安国市| 利辛县| 彭阳县| 克什克腾旗| 吴忠市| 文水县| 平湖市|