想要 Activity 在啟動時就不顯示(不會出現(xiàn)閃一下或黑屏的情形),只要在 AndroidManifest.xml 中設置 Activity 的 theme 即可:
<activity
android:theme="@android:style/Theme.NoDisplay"
……
activity/>
但在某些情況下,我們需要按照流程的判斷來動態(tài)設定 Activity 的 theme。
Activity 類提供了 public void setTheme(int resid) 方法,但實測下來,把 setTheme 放在 onCreate 方法的 super.onCreate 之前屏幕會變黑;放在 super.onCreate 之后則屏幕還是會閃一下;
查了一些資料后,最終的做法是重載 Activity 的 setTheme 方法,如下所示:
@Override
public void setTheme(int resid)
{
if (xxx) //滿足條件,設置指定的theme
{
super.setTheme(R.style.mytheme);
return;
}
super.setTheme(resid);
}
上述做法要結合
<activity
android:theme="@android:style/Theme.NoDisplay"
……
activity/>
一起使用才行!
引申出一個小試驗:
如果我把 AndroidManifest 中的 theme 設置成自己定義的樣式,在重載的 setTheme 方法中設置 R.style.Theme.NoDisplay 的話還會是相同效果嗎?
<activity
android:theme="@style/mytheme"
……
activity/>
@Override
public void setTheme(int resid)
{
if (yyy) //滿足條件,設置Theme.NoDisplay
{
super.setTheme(android.R.style.Theme_NoDisplay);
return;
}
super.setTheme(resid);
}
結果發(fā)現(xiàn),這樣的情況下啟動 Activity,屏幕還是會閃一下。
很奇怪,查了一下 setTheme 的源碼:
@Override
public void setTheme(int resid)
{
if (mThemeResource != resid)
{
mThemeResource = resid;
initializeTheme();
}
}
做一下簡單的猜測:在 AndroidManifest 中設置的 theme 在 Activity 啟動時會進行預加載,然后在 setTheme 方法中判斷傳入的 theme 的 id 是否與已加載的 theme 的 id 相同,如果不同,則重新進行加載,而重新加載是需要時間的,所以就出現(xiàn)了屏幕閃一下的情況。