Android Activity啟動優化 白屏/黑屏解決方法
新建一個HelloWorld項目,運行到手機上時,Activity打開之前會有一個動畫,而這個動畫是全白或者全黑的(取決於你的主題是亮還是暗),我們結束進程並點擊桌面上的APP圖標,同樣會出現這個現象。那么為什么會出現這個問題呢?
Activity啟動白/黑屏的原因?
我們所能看到的Activity內容,也就是onCreate()方法中調用setContentView()方法所傳入的自己繪制的layout文件。但是Android系統在啟動一個新的Activity時,首先運行的並不是ContentView,來看看Activity的UI結構:
可以看出,一個Activity中在ContentView的外圍還有PhoneWindow、DecorView、TitleView,當Activity進行繪制時會先繪制這三個控件,這時ContentView還沒加載進來,所以什么東西都看不見,系統會將屏幕填充主題默認的背景色,亮系主題填充白色,暗系主題填充黑色,就出現了Activity啟動之前的白/黑現象。
解決方案
上面說了,系統會為屏幕填充主題默認的背景色,那么要解決這個問題就要從屏幕背景下手。這里分兩種情況,一種起始頁是自定義繪制的layout;另一種起始頁是一張圖片,不用在setContentView()加載。
1、起始頁是自定義繪制的layout
將主題背景變成透明的,這樣在ContentView加載出來之前,會透過啟動的Activity看到桌面,就不會又白/黑屏的現象。再把標題欄去掉,把Activity設置成全屏,效果挺不錯。缺點是如果啟動一個有復雜耗時操作的Activity,那么會有一種延遲的感覺。
(1)在AndroidManifest.xml中給首頁activity(第一個頁面,一般是歡迎界面)設置自定義的theme
<activity android:name=".activity.SplashActivity"
android:theme="@style/SplashStyle">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
(2)在styles.xml文件中添加以下代碼
<style name="SplashStyle" parent="android:Theme.Light.NoTitleBar">
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowActionBar">false</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowFullscreen">true</item>
</style>
2、起始頁是一張圖片,不用在setContentView()加載
這種是用自定義的StartingWindow來優化。用戶點擊了圖標啟動應用,彈出應用自己定制的StartingWindow,等應用加載好第一幀之后,定制的StartingWindow消失,顯示應用主界面,由於StartingWindow是自己定制的,啟動的時候Decode Bitmap或者Inflate自己定義Layout會有一定的耗時,但是總的來說跟系統默認的差別不大,用戶體驗優。
(1)在AndroidManifest.xml中給首頁activity(第一個頁面,一般是歡迎界面)設置自定義的theme
<activity android:name=".MainActivity"
android:theme="@style/AppTheme.StartingWindowTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
(2)在styles.xml文件中添加以下代碼
<!-- 應用啟動頁(StartingWindow)的theme -->
<style name="AppTheme.StartingWindowTheme" parent="AppTheme">
<!-- 可以設置成純顏色(設置一個和Activity UI相似的背景) -->
<!--<item name="android:windowBackground">@color/startingwindow_bgcolor</item>-->
<!--也可以設置成一張圖片 -->
<item name="android:windowBackground">@drawable/eyeequip0</item>
</style>
(3)Activity里面回復原有的樣式
public class MainActivity extends AppCompatActivity {
private ListDataScreenView mListDataScreenView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTheme(R.style.AppTheme);//恢復原有的樣式
setContentView(R.layout.activity_main);
mListDataScreenView = findViewById(R.id.list_data_screen_view);
mListDataScreenView.setAdapter(new ListScreenMenuAdapter(this));
}
}
綜上就是今天的內容,歡迎指出不足!