Android開發筆記之:Splash的實現詳解

來源:互聯網
上載者:User

什麼是Splash
Splash也就是應用程式啟動之前先啟動一個畫面,上面簡單的介紹應用程式的廠商,廠商的LOGO,名稱和版本等資訊,多為一張圖片,顯示幾秒鐘後會自動訊息,然後顯示出應用程式的主體頁面。在PC上,很常見各種平台的應用程式都會有,多半是一張圖片顯示在螢幕中央,如Microsoft Office系列,或者GIMP等。在各種遊戲中Splash是最常見的,幾乎所有的遊戲開始都會有一張全屏的圖片,上面通常都顯示廠商的LOGO,遊戲的名稱等。在手機平板等行動裝置上,類似PC的Splash很少,起碼對於Android和iOS來講原生的應用程式都沒有這種Splash,但是不知從何時起,這種Splash開始在第三方應用中流行起來,幾乎所有的第三方應用程式都有啟動Splash。這些Splash的特點是佔滿整個螢幕,上面LOGO,廠商的名字,應用的名字版本等,大約3到5秒後,Splash自動消失,應用首頁面顯示出來。很多應用在Splash頁面也顯示載入過程。
下面談談在Android中如何?Splash以及它的優缺點:
使用Activity作為Splash
這可能也是最常用的方式,方法就是用一個Activity,給它設定一個背景,或者要顯示的資訊(廠商,LOGO,名字和版本),讓它顯示幾秒種,然後finish()掉,並啟動應用主體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的優勢在於:
容易控制KEY事件
因為在顯示Splash的時候,是不應該響應事件的,比如觸摸事件,或者BACK或者MENU,因為這是一個單獨的Activity,所以你可以很容易禁掉這些使用者事件,而不必擔憂影響其他邏輯,或者擔心未及時把它們重新啟用。
容易定製
因為它是一個單獨的Activity,所以你可以把它設定成全屏的,或者沒有TitleBar的,或者其他什麼樣式與風格。在實際使用中,幾乎所有的Splash都設定成了全屏。因為它是單獨的Activity,所以即使你的應用不是全屏的,也沒有關係,因為只把SplashActivity設定成了全屏不會對其他Activity產生影響。
邏輯與主體邏輯分開,容易維護
如前面二點,因為它是一個單獨的Activity,所有的Splash相關的邏輯都在其中,而與應用主體的Activity是分開的,所以Splash中的邏輯不會影響到其他的Activity,這也更容易修改和維護,因為不會絞在一起相互影響。
使用Activity的唯一缺點就是它無法利用Splash顯示的時間裡做資料載入。因為它是一個單獨的Activity,無法控制其他的Activity,並且這時其他Activity還未建立。
使用ViewSwitcher作為Splash
這個也可以用作Splash。ViewSwitcher是一個ViewGroup,它有二個子View,每次只能顯示其中一個。主要做法就是,Activity的RootView設定為ViewSwitcher,把一個布局(如ImageView)作為Splash作為ViewSwitcher的第一個子View;再把Activity的主體布局作為第二個子View;當Activity啟動時,先顯示作為Splash的ImageView,過幾秒後再顯示主體布局。事實上ViewSwitcher通常用在Activity需要載入資料,先顯示一個進度條,當有資料時再顯示真正的布局。
使用ViewSwitcher的優勢
使用ViewSwitcher的優勢就在於,你可以利用Splash的時間來進行資料的載入,這樣使用者就不必在等待了Splash之後,再等待資料載入。複製代碼 代碼如下:<?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的缺點
要注意事件
必須在顯示Splash的時候禁止BACK,MENU等事件,然後再在Splash結束後把它們重新啟用。
沒辦法全屏
除非主體Activity是全屏的,否則沒辦法讓View全屏,然後再設定回。
邏輯絞在一起,難維護
就如上面的禁止和啟用事件一樣,這些東西都是在Activity中,所有的邏輯都在一個Activity中,自然難維護和修改,並且易出錯。
推薦做法
推薦的做法是不使用Splash的,或者最多在應用程式安裝後第一次使用,從使用者角度來講,它毫無意義,所以你看Android或iOS的原生應用中都沒有Splash之類的東西。應該讓應用直接進入正題,讓使用者立刻進到他最關心的頁面。同樣,應用使用提示也是無用的東西,真正的優秀的應該是簡潔且操作,不用學就會的,而不是搞出一大堆教程或者提示。與其花時間精力搞Splash或使用提示,還不如想想如何簡化操作。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.