转载请标明出处:http://blog.csdn.net/u012637501/article/details/45746617
每个Android应用启动之后都会出现一个Splash启动界面,大多数的Splash界面都是会等待一定时间,然后切换到下一个界面。但如果app启动时间过长,可使用启动界面让用户耐心等待这段枯燥的时间。Splash界面一般用于显示产品的LOGO、产品名称、版本信息等,也可以完成对系统状况的检测,如网络是否连通、电源是否充足、检测新版本等,也可以预先加载相关数据。启动界面SLEEP的时间=固定时间-预处理任务时间。
一、为APP创建一个简单的启动界面
所谓简单的启动界面,即界面只用于显示产品的LOGO、产品名称等常规信息,不做系统状态检测或数据加载的操作。设计方法如下:实现两activity,一个是SplashActivity,用来做启动画面,另一个是将要跳转的Activity。通过创建一个新的线程,延迟指定的时间再执行Activity的跳转,并调用finish方法结束当前启动activity。
实例:高仿QQ启动界面
1.src/.../WelcomeActivity.java
- package com.example.qq2012;
-
import android.app.Activity;
- import android.content.Intent;
-
import android.os.Bundle;
- import android.view.Window;
-
/*欢迎动画*/
- public class WelcomeActivity extends Activity {
-
protected void onCreate(Bundle savedInstanceState) {
- // requestWindowFeature(Window.FEATURE_NO_TITLE); //设置显示窗口界面特征,此时为窗口无标题
-
super.onCreate(savedInstanceState);
- setContentView(R.layout.welcome);
-
final Intent intent = new Intent(WelcomeActivity.this,LoginActivity.class); //设置一个用于启动新Activity的"意图"
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); //使系统为需要启动的Activity寻找与当前Activity不同的任务栈
-
new Thread(new Runnable(){ //创建一个新的线程来显示欢迎动画,指定时间后结束,跳转至指定界面
- public void run() {
-
try {
- Thread.sleep(3000); //欢迎界面启动持续时间
-
getApplicationContext().startActivity(intent); //启动新的界面,获取应用的上下文,生命周期是整个应用,应用结束才会结束
- finish(); //结束欢迎界面activity
-
} catch (InterruptedException e) {
- e.printStackTrace();
-
}
- }
-
}).start();
- }
-
}
2.res/layout/welcome.xml
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-
android:layout_width="match_parent"
- android:layout_height="match_parent"
-
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
- android:background="@drawable/splash">
-
</LinearLayout>
分析说明:
(1)隐藏应用标题方法
a.在显示的布局文件中,添加 android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
b.在逻辑代码setContentView(R.layout.login)之前添加requestWindowFeature(Window.FEATURE_NO_TITLE);
(2)调用 Activity.finish()方法时,结果和用户按下 BACK 键一样:告诉 Activity Manager 该 Activity 实例完成了相应的工作,可以被“回收”。SplashActivity 从 Active 状态转换 Stoped
状态,并被系统从栈中移除,标志可以被“回收”。
(3)创建一个新的线程完成界面跳转,两种方法:
方法一:
new Thread(new Runnable(){
public void run() {
Thread.sleep(3000);
//延时时间
.....
finish();
}
}
方法二:
new Handler().postDelayed(new Runnable() {
public void run() {
........
SplashActivity.this.finish();
}
}, 3000);
说明:
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);
运行结果:
二、自定义复杂启动界面设计
在启动界面友好展示的同时,后台可以做很多操作,比如系统检测,预加载数据等,这些后台操作可以使用AsyncTask来实现。
1.Splash启动界面设计,res/layout/welcome.xml
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
-
android:layout_width="match_parent"
- android:layout_height="match_parent"
-
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
- android:background="#FFFFFF">
-
<!--第一级 -->
- <TextView
-
android:id="@+id/copy_right"
- android:layout_height="wrap_content"
-
android:layout_width="wrap_content"
- android:layout_centerHorizontal="true"
-
android:layout_alignParentBottom="true"
- android:padding="12dp"
-
android:text="By 老蒋良心出品"/>
- <!-- 第一级 -->
-
<RelativeLayout
- android:layout_width="fill_parent"
-
android:layout_height="fill_parent">
- <!-- 第二级 -->
-
<LinearLayout
- android:layout_width="wrap_content"
-
android:layout_height="wrap_content"
- android:orientation="vertical"
-
android:layout_centerInParent="true">
- <!-- logo图片 -->
-
<ImageView
- android:id="@+id/logoImage"
-
android:layout_width="wrap_content"
- android:layout_height="wrap_content"
-
android:src="@drawable/logo"
- android:layout_gravity="center_horizontal"
-
android:background="#ffffff"/>
- <!-- 产品名称、版本号 -->
-
<LinearLayout
- android:layout_width="wrap_content"
-
android:layout_height="wrap_content"
- android:layout_marginTop="20dp"
-
android:orientation="horizontal">
- <TextView
-
android:layout_width="wrap_content"
- android:layout_height="wrap_content"
-
android:padding="6dip"
- android:text="创新生活app"
-
android:textStyle="bold"
- android:textSize="20sp"/>
-
<TextView
- android:layout_width="wrap_content"
-
android:layout_height="wrap_content"
- android:padding="3dip"
-
android:text="V1.0"
- android:textStyle="bold"
-
android:textSize="15sp"/>
- </LinearLayout>
-
<!-- 分隔线 -->
- <View
-
android:layout_width="fill_parent"
- android:layout_height="1dp"
-
android:layout_marginLeft="17dp"
- android:layout_marginRight="17dp"
-
android:background="#dddddd"/>
- <!-- 内容描述 -->
-
<TextView android:layout_width="wrap_content"
- android:layout_height="wrap_content"
-
android:layout_gravity="center_horizontal"
- android:padding="6dip"
-
android:text="科技创新,振兴中华."
- android:textSize="13sp"/>
-
<ProgressBar android:id="@+id/refresh_list_footer_progressbar"
- android:layout_width="24dip"
-
android:layout_height="24dip"
- style="@android:attr/progressBarStyleLargeInverse"
-
android:layout_gravity="center">
- </ProgressBar>
-
</LinearLayout>
- </RelativeLayout>
2.后台处理,SplashActivity.java
- public class SplashActivity extends Activity {
-
@Override
- protected void onCreate(Bundle savedInstanceState) {
-
super.onCreate(savedInstanceState);
- setContentView(R.layout.splash);
-
- new AsyncTask<Void, Void, Integer>() {
- //后台操作
-
protected Integer doInBackground(Void... params) {
- int result;
-
long startTime = System.currentTimeMillis();
- result = loadingCache();
-
long loadingTime = System.currentTimeMillis() - startTime;
- if (loadingTime < SHOW_TIME_MIN) {
-
try {
- Thread.sleep(SHOW_TIME_MIN - loadingTime);
-
} catch (InterruptedException e) {
- e.printStackTrace();
-
}
- }
-
return result;
- }
- //操作后台操作的结果
-
@Override
- protected void onPostExecute(Integer result) {
-
// ... ...
- Intent intent = new Intent();
-
intent.setClassName(SplashActivity.this, getString(R.string.splash_out_activity));
- startActivity(intent);
-
finish();
- //两个参数分别表示进入的动画,退出的动画
-
overridePendingTransition(R.anim.fade_in, R.anim.fade_out);
- }.execute(new Void[]{});
-
}
- private int loadingCache()
-
{
- }
-
。。。。。
- }
参考资料: