首頁  >  文章  >  php教程  >  啟動頁進入時有短暫黑屏或白屏現象的終極解決方案

啟動頁進入時有短暫黑屏或白屏現象的終極解決方案

坏嘻嘻
坏嘻嘻原創
2018-09-14 15:13:155036瀏覽

irontec 推出了一個開源專案 PHP for Android (PFA),把php帶到Android平台上。現在我們來介紹一下。

問題描述

在安卓專案開發中,我們在啟動app的時候,螢幕會出現一段時間的白屏或黑屏,不同設備時間長短不同。很影響用戶體驗,所以我們很有必要對其進行優化。

黑白螢幕問題出現的原因

當我們啟動一個APP時,如果該app所屬的Application還沒有在後台運行的話,系統會先建立一個新的進程去運行這個APP,但進程的創建與初始化都是需要時間的,在這個動作完成之前,如果初始化的時間過長,屏幕上可能沒有任何動靜,用戶會以為沒有點到APP而再次去點擊應用程式圖標,這極大的降低了用戶體驗,因此Android需要及時做出反饋去響應用戶的點擊啟動動作,這就有了StartingWindow(也稱之為PreviewWindow的預覽視窗)的出現,這樣看起來就像App已經啟動起來了,只是資料內容還沒初始化好。

StartingWindow一般出現在應用程式程序創建並初始化成功前,目的是告訴用戶,系統已經接受到操作,正在響應,在程式初始化完成後繪製好啟動頁UI,會同時移除這個窗口,所以他只是一個臨時的窗口。

一般情況下我們會對Application和Activity設定Theme,系統會依照設定的Theme初始化StartingWindow。 Window佈局的頂層是DecorView,StartingWindow顯示一個空DecorView,但是會給這個DecorView應用這個Activity指定的Theme中設定的背景色,如果這個Activity沒有指定Theme就用Application的Theme(Application系統要求必須設定Theme),我們在Style中的設定就決定了顯示的是白屏還是黑屏,如下:

<application        // ....
        android:theme="@style/AppTheme">

如果我們的AppTheme像如下定義的一樣使用了Light主題,那麼顯示就是白屏,反之如果使用Black主題,那麼顯示就是黑屏:

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">

解決方案

#1、首先在res/drawable下新建一個layer-list,名字隨便取,例如splash.xml :
layer-list的寫作參考:https://www.jb51.net/article/130850.htm

<?xml version="1.0" encoding="utf-8"?><layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 背景颜色 -->
    <item android:drawable="@color/white" />

    <item>
        <!-- 图片 -->
        <bitmap            android:gravity="center"
            android:src="@drawable/wel_page" />
    </item></layer-list>

layer-list大家都會寫吧,上面是背景顏色,下面是一張圖,這張圖可以是全螢幕的圖,可以是一張小圖。如果是全螢幕的圖,那上面的顏色也可以不用設置,如果是小圖,就要指定下顏色了,並且可以指定圖片所在位置。

2、為主題設定Window背景:可以用我們上面的layer-list當背景,當然也可以設定全螢幕的圖片。

<style name="SplashTheme" parent="AppBaseTheme">
    <!-- 欢迎页背景引用刚才写好的 -->
    <item name="android:windowBackground">@drawable/splash</item>
    <item name="android:windowFullscreen">true</item>
    <!-- <item name="android:windowIsTranslucent">true</item> --> <!-- 透明背景不要了 --></style>

3、在AndroidManifest.xml中定義SplashActivity的theme為SplashTheme:這裡註意application使用的theme是AppTheme,而SplashActivity使用的主題是SplashTheme。這樣做的效果是只要SplashActivity使用StartAppTheme主題,其他Activity都是用AppTheme主題哦。

<activity android:name=".SplashActivity"
    android:theme="@style/SplashTheme">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter></activity>

4、SplashActivity的實現,在onCreate()中直接啟動你的MainActivity即可,沒有setContentView():

public class SplashActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        // setContentView(R.layout.activity_load_sir);
        new Handler().postDelayed(new Runnable() {            @Override
            public void run() {
                Intent intent = new Intent(SplashActivity.this,MainActivity.class);
                startActivity(intent);
                finish();
            }
        }, 3000);
    }
}

擴展

#在上面第二步中提到可以不使用layer-list,直接設定背景為圖片,但是不建議使用直接使用.png圖片作為背景的方式,因為螢幕尺寸太多,圖片顯示會變形,如果可以我們也可以使用.9. png的背景圖來實現,但是使用圖片的方式存在一個缺陷就是splash圖片是寫在theme中的,圖片的內存釋放不掉,而使用layer-list比較節省內存。

相關建議:

PHP for Android專案

#Android Animation_html/css_WEB-ITnose

######################### ######### ###

以上是啟動頁進入時有短暫黑屏或白屏現象的終極解決方案的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn