每一個Android應用啓動以後都會出現一個Splash啓動界面,顯示產品的LOGO、公司的LOGO或者開發者信息。若是應用程序啓動時間比較長,那麼啓動界面就是一個很好的東西,可讓用戶耐心等待這段枯燥的時間。java
1.製做Splash界面
突出產品LOGO,產品名稱,產品主要特點;
註明產品的版本信息;
註明公司信息或者開發者信息;
背景圖片,亦能夠用背景顏色代替;android
2.處理後臺資源
大多數的Splash界面都是會等待必定時間,而後切換到下一個界面;
其實,在這段時間裏,能夠對系統情況進行檢測,好比網絡是否通,電源是否充足;
或者,預先加載相關數據;
爲了能讓啓動界面展示時間固定,須要計算執行以上預處理任務所花費的時間,那麼:啓動界面SLEEP的時間=固定時間-預處理任務時間;程序員
思路有兩個,一個是用兩個Activity來作,一個用來作啓動畫面,另外一個是主頁面;還能夠用一個Activity來作,程序啓動時顯現啓動畫面,當啓動完成後,它會被隱藏來。web
方法一:兩個Activity,經過線程延遲指定的時間再執行Activity的跳轉,咱們須要創建兩個Activity,一個是SplashActivity,用來作啓動畫面。另外一個是HelloWorldActivity。在這裏只是說明如何來作啓動畫面,因此就不詳細來完成Activity了。網絡
核心代碼:app
package com.demo.app; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.os.Handler; public class SplashActivity extends Activity { private final int SPLASH_DISPLAY_LENGHT = 6000; // 延遲六秒 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.splash); new Handler().postDelayed(new Runnable() { public void run() { Intent mainIntent = new Intent(SplashActivity.this, HelloWorldActivity.class); SplashActivity.this.startActivity(mainIntent); SplashActivity.this.finish(); } }, SPLASH_DISPLAY_LENGHT); } }
說明:ide
Handler().postDelayed 是延遲指定的時間再執行佈局
Handler類主要可使用以下3個方法來設置執行Runnable對象的時間:post
// 當即執行Runnable對象 public final boolean post(Runnable r); // 在指定的時間(uptimeMillis)執行Runnable對象 public final boolean postAtTime(Runnable r, long uptimeMillis); // 在指定的時間間隔(delayMillis)執行Runnable對象 public final boolean postDelayed(Runnable r, long delayMillis);
下面兩行代碼啓動一個新的Activity,同時關閉當前Activity。動畫
SplashActivity.this.startActivity(mainIntent); SplashActivity.this.finish();
下面再講一下Activity的生命週期,方便你們理解Activity的跳轉。
如上所示,Android 程序員能夠決定一個 Activity 的「生」,但不能決定它的「死」,也就時說程序員能夠啓動一個 Activity,可是卻不能手動的「結束」一個 Activity。
當你調用 Activity.finish()方法時,結果和用戶按下 BACK 鍵同樣:告訴 Activity Manager 該 Activity 實例完成了相應的工做,能夠被「回收」。
隨後 Activity Manager 激活處於棧第二層的 Activity 並從新入棧,同時原 Activity 被壓入到棧的第二層,從 Active 狀態轉到 Paused 狀態。
例如上面例子中:從 SplashActivity 中啓動了 HelloWorldActivity,則當前處於棧頂端的是 HelloWorldActivity,第二層是 SplashActivity 。
當咱們調用 SplashActivity.finish()方法時(咱們是在SplashActivity中經過SplashActivity.this.finish()調用的),SplashActivity 從 Active 狀態轉換 Stoped 狀態,並被系統從棧中移除,標誌能夠被「回收」。
Activity 的狀態與它在棧中的位置關係以下圖:
上圖的例子是
從 Activity1 中啓動了 Activity2,則當前處於棧頂端的是 Activity2,第二層是 Activity1,當咱們在 Activity2中調用 Activity2.finish()方法時,Activity Manager 從新激活 Activity1 併入棧,Activity2 從 Active 狀態轉換 Stoped 狀態,同時標註Activity2能夠被「回收」 。Activity1. onActivityResult(int requestCode, int resultCode, Intent data)方法被執行,Activity2 返回的數據經過 data參數返回給 Activity1。
還有一點要注意的是,不要忘了修改AndroidManifest.xml文件。以下:
<?xmlversion="1.0"encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.demo.app" android:versionCode="1" android:versionName="1.0" <applicationandroid:icon="@drawable/icon";android:label="@string/app_name"> <activityandroid:name=.SplashActivity" android:label="@string/app_name"> ; <intent-filter> <actionandroid:name="android.intent.action.MAIN"/> <categoryandroid:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> <activityandroid:name="Main"> </activity> </application> <uses-sdkandroid:minSdkVersion="3"/> </manifest>
方法二:一個 Activity來作。程序啓動時顯現啓動畫面,當啓動完成後,它會被隱藏來
佈局文件:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <LinearLayout android:id="@+id/splashscreen" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:id="@+id/info" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center" android:paddingTop="10px" android:text="This is a splash !" /> </LinearLayout> <TextView android:layout_width="fill_parent" android:paddingTop="10px" android:layout_height="wrap_content" android:text="This is a Context" /> </LinearLayout>
說明:
這裏有一個id爲splashscreen的LinearLayout,是程序啓動時顯現的部分。當啓動完成後,它會被隱藏。
核心代碼:
package com.demo.app; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.os.SystemClock; import android.view.View; import android.view.Window; import android.widget.LinearLayout; import android.widget.TextView; public class MainActivity extends Activity { private LinearLayout splash; private TextView tv; private static final int STOPSPLASH = 0; // time in milliseconds private static final long SPLASHTIME = 1000; private Handler splashHandler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case STOPSPLASH: SystemClock.sleep(4000); splash.setVisibility(View.GONE); break; } super.handleMessage(msg); } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().requestFeature(Window.FEATURE_PROGRESS); setContentView(R.layout.main); splash = (LinearLayout) findViewById(R.id.splashscreen); tv = (TextView) findViewById(R.id.info); tv.setText("正在創建數據鏈接"); Message msg = new Message(); msg.what = STOPSPLASH; splashHandler.sendMessageDelayed(msg, SPLASHTIME); } }
當在應用啓動後發送一個消息,把指定區域設置爲隱藏, splash.setVisibility(View.GONE); 就實現了啓動界面。
總結一下,我的以爲仍是第一個方法比較合適,當一個程序主Activity裏的東西比較多的時候,若是咱們還把啓動畫面也加進去,勢必會影響程序的效率,因此實際應用的話,第一個方法是首選。