作者:李旺成
時間:2016年5月21日
這個 Hack 將介紹一個提升 Activity 啟動速度的小技巧眷蜈。
默認(rèn) Activity 的 View 樹
Android SDK 中提供了一個用于優(yōu)化布局的工具 Hierarchy Viewer斥难,我們來試一下用這個工具檢測一個默認(rèn) Activity 的 View 樹。
說明:默認(rèn)情況下是不能使用 Hierarchy Viewer 來查看真機(jī)上的應(yīng)用的性雄,如果想在真機(jī)上使用怀读,可以試試這個:ViewServer褐耳。
你會發(fā)現(xiàn)新建 Activity 的 ContentView 中指定的 Layout 文件下只有一個 RelativeLayout,該 RelativeLayout 中放了一個 TextView陪拘,但是使用 Hierarchy Viewer 一檢測發(fā)現(xiàn)了很多不可控的節(jié)點厂镇。
那么這個 Hack 的優(yōu)化技巧就是通過微調(diào)這些節(jié)點來提升 Activity 的啟動速度。
移除標(biāo)題欄
標(biāo)題欄左刽,這么“古老”的東西捺信,應(yīng)該很多人都沒用過吧!從 Android 2.2 左右走過來的開發(fā)者們應(yīng)該還是知道標(biāo)題欄的:
要去除標(biāo)題欄很簡單欠痴,有如下方式:
1迄靠、在代碼里實現(xiàn)
this.requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉標(biāo)題欄
2、在清單文件的 application 節(jié)點下配置
<application android:icon="@drawable/icon"
android:label="@string/app_name"
android:theme="@android:style/Theme.NoTitleBar">
3喇辽、使用自定義樣式
在 style.xml 里定義
<style name="Theme.NoTitle" parent="android:Theme">
<item name="android:windowNoTitle">true</item>
</style>
使用樣式:
<activity android:name=".AccelerateBootActivity"
android:theme="@style/Theme.NoTitle" />
這里可以在 application 節(jié)點下使用也可以在 activity 節(jié)點下使用掌挚。
從 ActionBar 到 Toolbar 標(biāo)題欄的身影基本是消失了,所以菩咨,關(guān)于移除標(biāo)題欄這個就不演示了吠式,有興趣的可以自行測試。
移除 ActionBar/Toolbar
在上面“新建Activity的View樹示例”一圖中可以看到使用紅色方框圈出來的部分是 ActionBar/Toolbar 部分抽米。
這里可以通過移除 ActionBar/Toolbar 來減少一些節(jié)點特占,達(dá)到優(yōu)化的目的。
定義樣式:
<style name="Theme.NoActionBar" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowNoTitle">true</item>
</style>
使用樣式:
<activity android:name=".AccelerateBootActivity"
android:theme="@style/Theme.NoActionBar" />
再使用 Hierarchy Viewer 來看看 View 樹:
可以看到代表 ActionBar/Toolbar 的部分節(jié)點都沒有了云茸。但是 PhoneWindow$DecorView 和 RelativeLayout 上面的 FrameLayout 又是什么東西是目?
移除背景
如果你研究過 Activity 的源碼,你會發(fā)現(xiàn) FrameLayout 是執(zhí)行 setContentView() 方法時創(chuàng)建的(這也是當(dāng)根布局為 FrameLayout 時可以使用 <merge/> 標(biāo)簽來優(yōu)化的原因)标捺。DecorView 是整個視圖樹的根節(jié)點懊纳,是系統(tǒng)創(chuàng)建的网持。
默認(rèn)情況下 Activity 是有背景色的(一般是白色),這個 DecorView 就是持有窗口背景圖片的視圖长踊。如果你的應(yīng)用需要使用自定義的背景色或者背景圖片,那么繪制這個默認(rèn)的背景色是沒有必要的萍倡,通過移除背景也可以達(dá)到優(yōu)化的目的身弊。
下面是默認(rèn) Activity 移除背景之后的效果:
提示:把 TextView 的字體顏色修改一下,不然看到的是一片漆黑...
當(dāng)然列敲,你為根布局設(shè)置好背景就沒什么問題了阱佛。
示例代碼:
<style name="Theme.NoBackground" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowNoTitle">true</item>
<item name="android:windowBackground">@null</item>
</style>
小結(jié)
上面介紹的移除背景的技巧,是在你確定你的 Activity 要使用自定義的背景時使用戴而。
項目地址
項目示例代碼:
AccelerateBootActivity.java
activity_accelerateboot.xml