Android啟動畫面Splash – Android移動開發技術文章_手機開發 Android移動開發教學課程

方法一,兩個Activity


核心代碼:


package ghj1976.HelloWorld;


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 = 8000; // 延遲八秒


 @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);


 }
}說明:


Handler().postDelayed  是延遲指定的時間再執行


Handler類主要可以使用如下3個方法來設置執行Runnable對象的時間:


//  立即執行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); 有關 Handler 類的更詳細可以看這篇文章:http://book.51cto.com/art/201006/207064.htm


下面兩行代碼啟動一個新的Activity,同時關閉當前Activity。


SplashActivity.this.startActivity(mainIntent);
SplashActivity.this.finish();


對 finish 方法的解釋如下: http://android.toolib.net/reference/android/app/Activity.html
Call this when your activity is done and should be closed. The ActivityResult is propagated back to whoever launched you via onActivityResult().


 image


圖來自: http://www.ibm.com/developerworks/cn/opensource/os-cn-android-actvt/


如上所示,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 的狀態與它在棧中的位置關系如下圖:


 


 image


上圖的例子是


從 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。


 


方法二:一個 Activity


 



 


佈局文件:


1.0″ encoding=”utf-8″?>
http://schemas.android.com/apk/res/android”
 android:orientation=”vertical” android:layout_width=”fill_parent”
 android:layout_height=”fill_parent”>
 @+id/splashscreen”
  android:orientation=”vertical” android:layout_width=”fill_parent”
  android:layout_height=”fill_parent”>


  @+id/info” android:layout_width=”fill_parent”
   android:layout_height=”wrap_content” android:gravity=”center”
   android:paddingTop=”10px” android:text=”This is a splash !” />
 


 fill_parent”
  android:paddingTop=”10px” android:layout_height=”wrap_content”
  android:text=”This is a Context” />



說明:


這裡有一個id為splashscreen的LinearLayout,是程序啟動時顯現的部分。當啟動完成後,它會被隱藏。


核心代碼:


package ghj1976.AndroidTest;


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);  就實現瞭 啟動界面

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *