上一篇文章中我們介紹加單說明了一下android的編碼規范,這里我是強烈建議大家在團隊合作中約定編碼規范的,哪怕是一個并不是十分規范的規范總比沒有規范好得多,尤其是團隊產品的研發,對產品的持續迭代過程中你會越發的意識到編碼規范對產品迭代的好處,當然了,這里并不是要求大家一定按照文中給出的編碼規范作為團隊中使用的編碼規范,而是希望大家在團隊合作中能夠約定出自身的編碼規范,哪怕其并不是十分的規范。具體的編碼規范可參考:[Android產品研發(一)–>實用開發規范。](http://blog.csdn.net/qq_23547831/article/details/51534013)
而這片文章中我們主要介紹一下啟動頁的優化,關于啟動頁的優化是UE方面的內容了,一個很慢的啟動頁很容易讓用戶覺得受不了,進而“逃離”App的,所以若想產品有更好的用戶體驗,做一些啟動頁的優化是一個不錯的選擇。這里我們簡單介紹一下我在實踐中對啟動頁是如何優化的。
公司產品使用的數據統計產品是友盟,最近產品經理在看友盟數據的時候,發現App在啟動頁跳出率很高,啟動頁的平均啟動時間為2.8s,如下圖:

納尼,2.8s才啟動App,這是雜么回事啊,優化吧...
沒辦法,2.8s啟動啟動頁時間確實有點長,而且用戶在首頁的跳出率也確實有點高(這里普及一下跳出率的概念:用戶從當前頁面離開應用的情況,說白了就是啟動頁的啟動時間過長,不少用戶都等不了了,直接從啟動頁離開App了)。
那么在優化啟動也的時候我們應該逐步的分析啟動頁的邏輯,熟悉了啟動頁的執行邏輯才能更好的優化啟動頁的加載速度。
**啟動頁面網絡請求優化**
(1)我們在啟動頁做了什么? 我們的啟動頁面主要用于展示啟動頁面,加載網絡配置信息; 具體而言:
* 加載App中h5頁面的url地址
* 加載請求用戶信息
* 加載首頁地圖頁面需要展示的圖標
* 延時三秒鐘跳轉首頁面,這時候無論是否加載到前面的網絡請求信息,都會跳轉到首頁面
(2)那些可以優化的地方? 這樣看來由于我們在啟動頁面有網絡請求,所以主動的延時3秒鐘跳轉首頁,所以造成了我們的啟動頁面加載過慢,所以我們首要的優化地方就是在網絡請求與延時跳轉這方面。
(3)如何優化? 現在的邏輯是無論配置信息是否拉取成功都需要在3秒鐘的時候跳轉主頁面,可以這樣考慮,若這三個配置信息拉取的時間小于3秒鐘其實不必要等到3秒鐘在跳轉主界面;思路已經出來了,剩下的就是具體實現了。。
(4)啟動頁面網絡請求優化的具體實踐
~~~
timer = new Timer();
timerTask = new TimerTask() {
@Override
public void run() {
if (isGoToComplete) {
L.i("等待2s完成,取消timer任務...");
cancelTimer();
return;
}
if (isLoadStartQueryComplete && isLoadUserInfoComplete) {
// 已經顯示過引導圖
L.i("StartActivity中網絡請求完成,執行跳轉邏輯.....");
handler.sendEmptyMessage(eventWhat);
L.i("StartActivity中網絡請求完成,取消timer任務...");
cancelTimer();
}
}
};
timer.schedule(timerTask, 0, 100);
~~~
在這里我們創建一個timer任務,每隔100ms執行一次,判斷這兩個拉取網絡配置信息的異步消息是否已經完成,若已經完成的話則發送handler消息跳轉主界面,若2秒鐘之內都沒有完成拉取任務,則直接跳轉同時取消timer任務。
簡單來說就是啟動頁面最長的等待時間為2秒鐘,若兩秒鐘之內啟動頁面的網絡請求信息還沒有完成也不在等待直接跳轉主頁面,而若在2秒鐘之內啟動頁面的網絡請求執行完畢,則直接跳轉不必等到2秒鐘之后再跳轉,這樣我們啟動頁面就根據網絡請求的情況大大縮短了加載時間。
**啟動頁面特效優化**
現如今幾乎所有的安卓app在啟動的時候都會有一個類似于開機畫面的東西,往往是一個開機界面,上面寫著這個應用程序的提示文字,動畫等等,并且這個開解界面往往實現了漸變,loading等效果,這樣啟動頁面的耗時比較長的話,用戶也不會覺得時間很長,難以忍受,當然了這種方式只是在視覺效果上造成“啟動頁面加載速度很快”的效果的。
這里我們簡單的實現啟動頁面的動畫效果的實現:
~~~
//漸變展示啟動屏
AlphaAnimation alphaAnimation = new AlphaAnimation(0.3f,1.0f);
alphaAnimation.setDuration(2000);
contentView.startAnimation(alphaAnimation);
alphaAnimation.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationEnd(Animation arg0) {
L.i("啟動頁面動畫執行完畢...");
}
@Override
public void onAnimationRepeat(Animation animation) {
L.i("啟動頁面動畫重復執行...");
}
@Override
public void onAnimationStart(Animation animation) {
L.i("啟動頁面動畫開始執行...")
}
});
~~~
而這里的contentView就是我們啟動頁Activity的主View,所以這里的執行效果就是我們的啟動頁Activity的界面的透明度逐漸增加,這樣在用戶看來由于有了一層loading效果,加載速度顯得很快。
**啟動頁面無黑屏**
這里同時也介紹一下android app啟動頁面黑屏的問題,android開發app啟動時若沒有做特殊處理的話,會出現一瞬間的黑屏現象,網上針對這種情況一般有兩種解決方式:
(1)App啟動頁面為圖片或者是drawable文件
~~~
<item name="android:windowBackground">@drawable/start_background</item>
~~~
設置設置整個App的style文件,設置android:windowBackground屬性為圖片或者是drawable文件,這樣App在啟動過程中就是顯示的是啟動頁面的圖片或者是是drawable文件;
(2)App啟動頁面為Layout文件
這時候無法為App的style設置background,退而求其次主流的方式是設置白色背景
~~~
<item name="android:windowBackground">@color/c10</item>
~~~
而這里的@color/c10就是我們定義的白色色值,這樣經過處理之后App啟動時就不會出現黑屏的效果了。
**Application啟動速度優化 **
由于我們的應用啟動過程首先會執行Application的創建于執行其生命周期方法(onCreate方法),具體可參見我的android應用進程啟動流程: [android源碼解析之(十一)-->應用進程啟動流程](http://blog.csdn.net/qq_23547831/article/details/51119333)
所以提高app的啟動速度,加快Application的執行時間也是一個很重要的方面,這里我暫時總結了幾條原則:
* 盡量不將一些業務邏輯放于Application中;
* Application盡量不以靜態變量的方式保存應用數據;
* 若App的大小不是特別大無需使用dex分包方案;
* 在Application中關于文件,數據庫的操作盡量
**啟動頁面屏蔽返回按鍵**
一般的我們的App中都會在啟動頁面執行一些網絡操作,初始化配置等,所以這時候我們是不希望用戶通過按下返回按鍵退出App,因而我們需要在啟動頁中屏蔽返回按鍵,這里簡單的介紹一下具體的實現:
~~~
/**
* startActivity屏蔽物理返回按鈕
*
* @param keyCode
* @param event
* @return
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
return true;
}
return super.onKeyDown(keyCode, event);
}
~~~
這里我們重寫啟動頁面Activity的onKeyDown方法,首先判斷用戶按下的是否是返回按鍵,若是的話則直接返回true,屏蔽返回按鍵的后續執行邏輯。關于返回按鍵的執行流程,可參考我的android系統返回按鍵執行流程: [android源碼解析(二十九)-->應用程序返回按鍵執行流程](http://blog.csdn.net/qq_23547831/article/details/51513771)
以上就是個人總結的啟動頁中一些要點或者是需要注意的地方,個人能力不足有不對的地方歡迎指正。
另外對產品研發技術,技巧,實踐方面感興趣的同學可以參考我的:
[android產品研發(一)-->實用開發規范 ](http://blog.csdn.net/qq_23547831/article/details/51534013)
[android產品研發(二)-->啟動頁優化](http://blog.csdn.net/qq_23547831/article/details/51541277)
- 前言
- (一)–>實用開發規范
- (二)-->啟動頁優化
- (三)-->基類Activity
- (四)-->減小Apk大小
- (五)-->多渠道打包
- (六)-->Apk混淆
- (七)-->Apk熱修復
- (八)-->App數據統計
- (九)-->App網絡數據解析
- (十)-->盡量不使用靜態變量保存數據
- (十一)-->應用內跳轉Scheme協議
- (十二)-->App長連接實現
- (十三)-->App輪詢操作
- (十四)-->App升級與更新
- (十五)-->內存對象序列化
- (十六)-->開發者選項
- (十七)-->Hybrid開發
- (十八)-->webview問題集錦
- (十九)-->Android studio中的單元測試
- (二十)-->代碼Review
- (二十一)-->Android中的UI優化
- (二十二)-->Android實用調試技巧
- (二十三)-->Android中保存靜態秘鑰實踐
- (二十四)-->內存泄露場景與檢測
- (二十五)-->MVC/MVVM/MVP簡單理解