Android建立啓動畫面

每一個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的跳轉。

image

如上所示,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。

還有一點要注意的是,不要忘了修改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裏的東西比較多的時候,若是咱們還把啓動畫面也加進去,勢必會影響程序的效率,因此實際應用的話,第一個方法是首選。

相關文章
相關標籤/搜索