Android開發(fā)筆記之:Splash的實(shí)現(xiàn)詳解
Splash也就是應(yīng)用程序啟動(dòng)之前先啟動(dòng)一個(gè)畫面,上面簡單的介紹應(yīng)用程序的廠商,廠商的LOGO,名稱和版本等信息,多為一張圖片,顯示幾秒鐘后會(huì)自動(dòng)消息,然后顯示出應(yīng)用程序的主體頁面。在PC上,很常見各種平臺(tái)的應(yīng)用程序都會(huì)有,多半是一張圖片顯示在屏幕中央,如Microsoft Office系列,或者GIMP等。在各種游戲中Splash是最常見的,幾乎所有的游戲開始都會(huì)有一張全屏的圖片,上面通常都顯示廠商的LOGO,游戲的名稱等。在手機(jī)平板等移動(dòng)設(shè)備上,類似PC的Splash很少,起碼對(duì)于Android和iOS來講原生的應(yīng)用程序都沒有這種Splash,但是不知從何時(shí)起,這種Splash開始在第三方應(yīng)用中流行起來,幾乎所有的第三方應(yīng)用程序都有啟動(dòng)Splash。這些Splash的特點(diǎn)是占滿整個(gè)屏幕,上面LOGO,廠商的名字,應(yīng)用的名字版本等,大約3到5秒后,Splash自動(dòng)消失,應(yīng)用主頁面顯示出來。很多應(yīng)用在Splash頁面也顯示加載過程。
下面談?wù)勗贏ndroid中如何實(shí)現(xiàn)Splash以及它的優(yōu)缺點(diǎn):
使用Activity作為Splash
這可能也是最常用的方式,方法就是用一個(gè)Activity,給它設(shè)置一個(gè)背景,或者要顯示的信息(廠商,LOGO,名字和版本),讓它顯示幾秒種,然后finish()掉,并啟動(dòng)應(yīng)用主體Activity。
<activity android:name=".SplashActivity"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
android:noHistory="true"
android:configChanges="orientation|keyboardHidden"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
public class SplashActivity extends Activity {
private Handler mMainHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setClass(getApplication(), NotTomorrowActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
// overridePendingTransition must be called AFTER finish() or startActivity, or it won't work.
overridePendingTransition(R.anim.activity_in, R.anim.splash_out);
}
};
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
getWindow().setBackgroundDrawableResource(R.drawable.kg);
mMainHandler.sendEmptyMessageDelayed(0, 5000);
}
// much easier to handle key events
@Override
public void onBackPressed() {
}
}

使用Activity的優(yōu)勢在于:
容易控制KEY事件
因?yàn)樵陲@示Splash的時(shí)候,是不應(yīng)該響應(yīng)事件的,比如觸摸事件,或者BACK或者M(jìn)ENU,因?yàn)檫@是一個(gè)單獨(dú)的Activity,所以你可以很容易禁掉這些用戶事件,而不必?fù)?dān)憂影響其他邏輯,或者擔(dān)心未及時(shí)把它們重新啟用。
容易定制
因?yàn)樗且粋€(gè)單獨(dú)的Activity,所以你可以把它設(shè)置成全屏的,或者沒有TitleBar的,或者其他什么樣式與風(fēng)格。在實(shí)際使用中,幾乎所有的Splash都設(shè)置成了全屏。因?yàn)樗菃为?dú)的Activity,所以即使你的應(yīng)用不是全屏的,也沒有關(guān)系,因?yàn)橹话裇plashActivity設(shè)置成了全屏不會(huì)對(duì)其他Activity產(chǎn)生影響。
邏輯與主體邏輯分開,容易維護(hù)
如前面二點(diǎn),因?yàn)樗且粋€(gè)單獨(dú)的Activity,所有的Splash相關(guān)的邏輯都在其中,而與應(yīng)用主體的Activity是分開的,所以Splash中的邏輯不會(huì)影響到其他的Activity,這也更容易修改和維護(hù),因?yàn)椴粫?huì)絞在一起相互影響。
使用Activity的唯一缺點(diǎn)就是它無法利用Splash顯示的時(shí)間里做數(shù)據(jù)加載。因?yàn)樗且粋€(gè)單獨(dú)的Activity,無法控制其他的Activity,并且這時(shí)其他Activity還未創(chuàng)建。
使用ViewSwitcher作為Splash
這個(gè)也可以用作Splash。ViewSwitcher是一個(gè)ViewGroup,它有二個(gè)子View,每次只能顯示其中一個(gè)。主要做法就是,Activity的RootView設(shè)置為ViewSwitcher,把一個(gè)布局(如ImageView)作為Splash作為ViewSwitcher的第一個(gè)子View;再把Activity的主體布局作為第二個(gè)子View;當(dāng)Activity啟動(dòng)時(shí),先顯示作為Splash的ImageView,過幾秒后再顯示主體布局。事實(shí)上ViewSwitcher通常用在Activity需要加載數(shù)據(jù),先顯示一個(gè)進(jìn)度條,當(dāng)有數(shù)據(jù)時(shí)再顯示真正的布局。
使用ViewSwitcher的優(yōu)勢
使用ViewSwitcher的優(yōu)勢就在于,你可以利用Splash的時(shí)間來進(jìn)行數(shù)據(jù)的加載,這樣用戶就不必在等待了Splash之后,再等待數(shù)據(jù)加載。
<?xml version="1.0" encoding="utf-8"?>
<ViewSwitcher xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/view_container"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:inAnimation="@anim/activity_in"
android:outAnimation="@anim/splash_out">
<ImageView android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:src="@drawable/kg"
android:scaleType="fitXY"/>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<TextView android:id="@+id/header"
style="@style/header_text" />
<TextView android:id="@+id/header_tip"
style="@style/task_text" />
<ListView android:id="@+id/task_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:footerDividersEnabled="true"
android:background="@color/white"/>
</LinearLayout>
</ViewSwitcher>
public class NotTomorrowActivity extends Activity {
protected static final String TAG = "NoTomorrowActivity";
protected static final int MSG_SHOW_LAYOUT = 10;
private static final int MENU_ADD_TASK = 0;
private Handler mMainHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_SHOW_LAYOUT:
final ViewSwitcher container = (ViewSwitcher) findViewById(R.id.view_container);
container.showNext();
ImageView view = (ImageView) container.getChildAt(0);
view.setImageResource(0);
container.removeViewAt(0);
mSplashing = false;
break;
default:
break;
}
}
};
private boolean mSplashing;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mSplashing = true;
setContentView(R.layout.not_tomorrow_activity);
mMainHandler.sendEmptyMessageDelayed(MSG_SHOW_LAYOUT, 5000);
}
@Override
public void onBackPressed() {
if (!mSplashing) {
super.onBackPressed();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
if (mSplashing) {
return false;
}
menu.add(0, MENU_ADD_TASK, 0, R.string.add_hint);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
if (mSplashing) {
return false;
}
return super.onPrepareOptionsMenu(menu);
}
}

使用ViewSwitcher的缺點(diǎn)
要注意事件
必須在顯示Splash的時(shí)候禁止BACK,MENU等事件,然后再在Splash結(jié)束后把它們重新啟用。
沒辦法全屏
除非主體Activity是全屏的,否則沒辦法讓View全屏,然后再設(shè)置回。
邏輯絞在一起,難維護(hù)
就如上面的禁止和啟用事件一樣,這些東西都是在Activity中,所有的邏輯都在一個(gè)Activity中,自然難維護(hù)和修改,并且易出錯(cuò)。
推薦做法
推薦的做法是不使用Splash的,或者最多在應(yīng)用程序安裝后第一次使用,從用戶角度來講,它毫無意義,所以你看Android或iOS的原生應(yīng)用中都沒有Splash之類的東西。應(yīng)該讓應(yīng)用直接進(jìn)入正題,讓用戶立刻進(jìn)到他最關(guān)心的頁面。同樣,應(yīng)用使用提示也是無用的東西,真正的優(yōu)秀的應(yīng)該是簡潔且操作,不用學(xué)就會(huì)的,而不是搞出一大堆教程或者提示。與其花時(shí)間精力搞Splash或使用提示,還不如想想如何簡化操作。
- Android中使用Theme來解決啟動(dòng)app時(shí)出現(xiàn)的空白屏問題
- Android app啟動(dòng)時(shí)黑屏或者白屏的原因及解決辦法
- Android Splash界面白屏、黑屏問題的解決方法
- Android編程中activity啟動(dòng)時(shí)出現(xiàn)白屏、黑屏問題的解決方法
- android實(shí)現(xiàn)Splash閃屏效果示例
- 詳解Android中App的啟動(dòng)界面Splash的編寫方法
- Android開發(fā)基礎(chǔ)之創(chuàng)建啟動(dòng)界面Splash Screen的方法
- Android筆記之:App應(yīng)用之啟動(dòng)界面SplashActivity的使用
- Android中Splash應(yīng)用啟動(dòng)白屏問題的解決方法
相關(guān)文章
Android SharedPreferences四種操作模式使用詳解
這篇文章主要介紹了Android SharedPreferences四種操作模式使用詳解的相關(guān)資料,這里介紹了獲取Android SharedPreferences的兩種方法及比較,和操作模式的介紹,需要的朋友可以參考下2017-07-07Python基礎(chǔ)教程學(xué)習(xí)筆記 第一章 基礎(chǔ)知識(shí)
這篇文章主要介紹了Python基礎(chǔ)教程學(xué)習(xí)筆記 第一章 基礎(chǔ)知識(shí) ,需要的朋友可以參考下2015-03-03Android中使用OkHttp包處理HTTP的get和post請(qǐng)求的方法
OkHttp包為安卓開發(fā)中的HTTP協(xié)議網(wǎng)絡(luò)編程帶來了很大的便利,這里我們就來看一下最基本的、Android中使用OkHttp包處理HTTP的get和post請(qǐng)求的方法:2016-07-07Android Studio中快捷鍵實(shí)現(xiàn)try catch等功能包含代碼塊的實(shí)現(xiàn)方法
這篇文章主要介紹了 Android Studio中快捷鍵實(shí)現(xiàn)try catch等功能包含代碼塊的實(shí)現(xiàn)方法的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下2017-09-09Android App將數(shù)據(jù)寫入內(nèi)部存儲(chǔ)和外部存儲(chǔ)的示例
這篇文章主要介紹了Android App將數(shù)據(jù)寫入內(nèi)部存儲(chǔ)和外部存儲(chǔ)的示例,使用外部存儲(chǔ)即訪問并寫入SD卡,需要的朋友可以參考下2016-03-03Android EditText限制輸入字?jǐn)?shù)的方法
這篇文章主要介紹了Android EditText限制輸入字?jǐn)?shù)的方法,涉及Android針對(duì)EditText文本與字符串操作相關(guān)技巧,需要的朋友可以參考下2016-01-01解析Android開發(fā)優(yōu)化之:對(duì)界面UI的優(yōu)化詳解(二)
在一個(gè)應(yīng)用程序中,一般都會(huì)存在多個(gè)Activity,每個(gè)Activity對(duì)應(yīng)著一個(gè)UI布局文件。一般來說,為了保持不同窗口之間的風(fēng)格統(tǒng)一,在這些UI布局文件中,幾乎肯定會(huì)用到很多相同的布局2013-05-05