閱讀604 返回首頁    go 阿裏雲 go 技術社區[雲棲]


SplishActivity的作用

眾所周知,我們很多應用都會有一個SplashActivity,用來當作進入應用的第一個過度界麵,顯示一個logo信息。如下所示,是我的簡潔天氣的SplashActivity。



但是,它的作用僅僅隻是用來顯示一個logo信息嗎?這樣豈不是太浪費了?答案是肯定的。

其實一開始學習Android的時候,我也以為它的作用僅僅是用來顯示logo信息,但是在觀察新浪微博、騰訊微博等應用之後,我發現每次顯示這個界麵的時間會有所不同,網絡好的時候感覺不出來,網絡不好的時候會停留的時間比較長一點,所以,我可以肯定說:在這個Activity裏麵,肯定為下一個Activity的出現打好了基礎,也就是說預先初始化了一些工具類、加載了一些必要數據。這樣的話在下一個Activity很快就可以完整把所有數據展現在用戶麵前,獲取更好的用戶體驗。

說到這裏,也許有的童鞋就會說了,我可以在Application裏做這些事情啊,然後直接進入MainActivity,其實這樣也是可以的,比如我這個簡潔天氣最初就是這樣做的,但是細心的朋友就會發現,每次進我這個應用的時候,屏幕會黑一段時間,尤其是第一次進入更加明顯,其實就是因為我把加載數據的事情放在Application裏麵,而加載2000多個城市是需要一定時間的。這樣就不可避免的會黑一段時間,這樣給用戶的感覺就沒那麼親和了。


OK,鋪墊就到這裏了,下麵切入正題,我們來看看這個簡單SplashActivity:

  1. /** 
  2.  *  
  3.  * @author way  
  4.  * 預先加載數據的SplashActivity 
  5.  *  
  6.  */  
  7. public class SplashActivity extends Activity {  
  8.     private static final int SHOW_TIME_MIN = 3000;// 最小顯示時間  
  9.     private long mStartTime;// 開始時間  
  10.   
  11.     private Handler mHandler = new Handler() {  
  12.         public void handleMessage(android.os.Message msg) {  
  13.             switch (msg.what) {  
  14.             case Application.CITY_LIST_SCUESS:// 如果城市列表加載完畢,就發送此消息  
  15.                 long loadingTime = System.currentTimeMillis() - mStartTime;// 計算一下總共花費的時間  
  16.                 if (loadingTime < SHOW_TIME_MIN) {// 如果比最小顯示時間還短,就延時進入MainActivity,否則直接進入  
  17.                     mHandler.postDelayed(goToMainActivity, SHOW_TIME_MIN  
  18.                             - loadingTime);  
  19.                 } else {  
  20.                     mHandler.post(goToMainActivity);  
  21.                 }  
  22.                 break;  
  23.             default:  
  24.                 break;  
  25.             }  
  26.         }  
  27.     };  
  28.     //進入下一個Activity  
  29.     Runnable goToMainActivity = new Runnable() {  
  30.   
  31.         @Override  
  32.         public void run() {  
  33.             SplashActivity.this.startActivity(new Intent(SplashActivity.this,  
  34.                     MainActivity.class));  
  35.             finish();  
  36.         }  
  37.     };  
  38.   
  39.     @Override  
  40.     protected void onCreate(Bundle savedInstanceState) {  
  41.         super.onCreate(savedInstanceState);  
  42.         setContentView(R.layout.splash);  
  43.         mStartTime = System.currentTimeMillis();//記錄開始時間,  
  44.         Application.getInstance().initData(mHandler);//開始加載數據  
  45.     }  
  46. }  

我這裏把加載數據的函數放在Application裏麵,做一些複製數據庫文件,讀取數據庫城市列表等一些相對比較耗時的事情,這裏就不具體說這個加載數據的函數了。因為我們可以根據不同的需求改變這個函數,比如說微博應用就替換成異步請求網絡數據等。我這個例子僅是提供一個擴展思路,如果有更好的建議或者批評,歡迎大家給我留言。


最後更新:2017-04-03 12:53:54

  上一篇:go SVN報錯:could not connect to server
  下一篇:go C++編程規範之34:用組合代替繼承