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