1. 程式人生 > >android啟動介面(SplashActivity)

android啟動介面(SplashActivity)

當前比較成熟一點的應用基本上都會在進入應用之顯示一個啟動介面,既SplashActivity,用來當作進入應用的第一個過度介面,顯示一個logo資訊。

如下所示,個人寫demo展示的SplashActivity:
SplashActivity Demo

  • 但是,一定要注意:在應用中不要使用武器之類的圖示(ps:時間緊張,在本地找到一張先用著),應用的名字一定不要帶有“武器”等帶有暴力等敏感性的詞/字,遊戲好像是另外一回事兒
  • 啟動介面的本意是以友好使用者介面來掩飾後臺緩衝載入,讓使用者用平和等待的心情進入正常應用介面.
    但是因為啟動介面是放在開始,在這個特殊的點上,可以做更多的事情,如應用宣傳,顯示版權,展示廣告

    等等.
    所以,這個啟動介面的元素,可多可少,就看你的用意和需求.

  • 下面我把一些常見的元素羅列出來:

    • (1). 應用名稱
    • (2). 應用版本
    • (3). 應用圖示
    • (4). 版權
    • (5). 一句話描述
    • (6). 進度條
    • (7). 額外資訊,如市場專版,獨家首發等
  • SplashActivity的優點

    • (1). 友好的等待介面,這是最基本的
    • (2). 應用的基本說明,宣傳介紹
    • (3). 動態的廣告,全屏廣告
    • (4). 應用的屬性說明如版本,版權等資訊,知曉使用者當前應用的基本屬性

      從技術的角度細看,還有如下:

    • (5). 載入耗時資源
    • (6). 檢查新版本
    • (7). 預設條件
    • (8). 程式碼分離
  • 佈局(建議使用RelativeLayout,但是對於一些簡單的佈局,使用LinearLayout也是足夠的):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#eeeeee"
    android:orientation
="vertical" >
<TextView android:id="@+id/tv_version_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="right" android:layout_marginRight="20dp" android:layout_marginTop="30dp" android:text="@string/txt_version_name" android:textSize="20sp" android:textColor="@color/dark_gray" android:shadowColor="#551111" android:shadowRadius="1" android:shadowDx="0" android:shadowDy="1" /> <ImageView android:layout_height="230dp" android:layout_width="230dp" android:src="@drawable/logo_splash" android:layout_gravity="center_horizontal" android:layout_marginTop="30dp" /> <TextView android:text="@string/app_name" android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_gravity="center_horizontal" android:textSize="40sp" android:layout_marginTop="10dp" android:textColor="@color/dark_gray" android:shadowColor="#42EB88" android:shadowRadius="3" android:shadowDx="1" android:shadowDy="1" /> <ProgressBar android:layout_marginTop="10dp" android:layout_height="70dp" android:layout_width="70dp" android:layout_gravity="center_horizontal" /> </LinearLayout>
  • 程式碼分離

    • 把程式碼分開寫,條理清晰,降低各個元件之間的耦合度,提高程式碼複用率,儘可能避免程式碼冗餘性

    • 比如說檢查新版本這個操作,
      如果放在主介面中,就容易把本來是一個獨立的操作和載入資料的操作混在一起,增加了主介面程式碼的複雜度,
      如果放啟動介面中,就會顯得更乾淨更清晰的在啟動模組中檢測(因為檢測新版本本來就是應該在應用啟動的時候執行),而且還可以考慮是否允許使用者進入主介面(當你決定完全放棄老版本的時候,有時需要強制使用者升級到新版本)。

好了,廢話不多說,上程式碼:

public class SplashActivity extends BaseActivity
{

    Handler mHandler = new Handler()
    {
        public void handleMessage(android.os.Message msg) 
        {
            switch (msg.what) 
            {
                case 1:
                    startMainActivity();
                    break;  
                default:
                    break;
            }
        }

    };

    @Override
    protected void initView() 
    {
        this.setContentView(R.layout.activity_splash);
        mHandler.sendEmptyMessageDelayed(1,2000);
    }

    private void startMainActivity()
    {
        Intent intent = new Intent(this, MainActivity.class);
        startActivity(intent);
        finish();
    }
}
  • 如果使用Thread,那麼再建立一條執行緒,但是如果把SplashActivity放在主執行緒的話,會阻塞主執行緒,但是如果因為這個啟動介面而new一條子執行緒,那麼對記憶體來說是種很大的浪費

  • 通過 handler.sendEmptyMessageDelayed 把訊息延遲傳送

  • Handler mHandler = new Handler();如果只是new一個handler,並不會對訊息作出處理
  • Handler的訊息傳給 handleMessage進行處理