每个Android应用启动之后都会出现一个Splash启动界面,显示产品的LOGO、公司的LOGO或者开发者信息。如果应用程序启动时间比较长,那么启动界面就是一个很好的东西,可以让用户耐心等待这段枯燥的时间。

  1.制作Splash界面
  突出产品LOGO,产品名称,产品主要特色;
  注明产品的版本信息;
  注明公司信息或者开发者信息;
  背景图片,亦可以用背景颜色代替;

  2.处理后台资源
  大多数的Splash界面都是会等待一定时间,然后切换到下一个界面;
  其实,在这段时间里,可以对系统状况进行检测,比如网络是否通,电源是否充足;
  或者,预先加载相关数据;
  为了能让启动界面展现时间固定,需要计算执行以上预处理任务所花费的时间,那么:启动界面SLEEP的时间=固定时间-预处理任务时间;

  思路有两个,一个是用两个Activity来做,一个用来做启动画面,另一个是主页面;还可以用一个Activity来做,程序启动时显现启动画面,当启动完成后,它会被隐藏来。

方法一:两个Activity,通过线程延迟指定的时间再执行Activity的跳转,我们需要建立两个Activity,一个是SplashActivity,用来做启动画面。另一个是HelloWorldActivity。在这里只是说明如何来做启动画面,所以就不详细来完成Activity了。

核心代码:

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

说明:

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

下面两行代码启动一个新的Activity,同时关闭当前Activity。

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

下面再讲一下Activity的生命周期,方便大家理解Activity的跳转。

如上所示,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 的状态与它在栈中的位置关系如下图:

上图的例子是

从 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文件。如下:

<?xml version="1.0" encoding="utf-8"?>
02 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
03       package="com.demo.app" 
04       android:versionCode="1" 
05       android:versionName="1.0"&gt; 
06     <application android:icon="@drawable/icon" ;android:label="@string/app_name"> ;
07         <activity android:name=.SplashActivity
" 
08                   android:label="@string/app_name"> ;
09             <intent-filter>
10                 <action android:name="android.intent.action.MAIN"/> 
11                 <category android:name="android.intent.category.LAUNCHER" /> 
12             </intent-filter
13         </activity
14     <activity android:name="Main">
15     </activity
16 </application
17     <uses-sdk android:minSdkVersion="3" /> 
18 </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里的东西比较多的时候,如果我们还把启动画面也加进去,势必会影响程序的效率,所以实际应用的话,第一个方法是首选。

分享到: 

最新文章

  1. linpe包-让发送和接收数据分析更快和更容易
  2. 今天有事-MySQL
  3. java.lang.NoClassDefFoundError: com/sun/mail/util/BEncoderStream
  4. 64位SqlServer通过链接服务器与32位oracle通讯
  5. iOS开发-为程序添加应用设置
  6. 【HTTPS】Https和SSL学习笔记(二)
  7. xcode xib 加载 、注意点
  8. STM32的FSMC总线复用调试笔记
  9. ios html5 设定PhoneGap开发环境
  10. Spring Security(07)——缓存UserDetails
  11. Tornado session 插件 pycket 定制时间和时间续租
  12. xls 打乱序列 -和给拼接字符串加上双引号
  13. kruskal重构树学习笔记
  14. Android Metro风格的Launcher开发系列第三篇
  15. 剑指offer例题分享--4
  16. Qt532.【转】Qt在pro中设置运行时库MT、MTd、MD、MDd,只适合VS版本的Qt
  17. render finished
  18. SpringMVC介绍之视图解析器ViewResolver
  19. Sonya and Ice Cream CodeForces - 1004E 树的直径, 贪心
  20. 35. oracle中instr在平台上的转换用法

热门文章

  1. TCP连接状态详解及TIME_WAIT过多的解决方法
  2. Cxf -Wsdl2java详细参数附录
  3. grok 正则解析日志例子&lt;1&gt;
  4. c++优先级
  5. https://pta.patest.cn/pta/test/15/exam/3/question/724
  6. linux之SQL语句简明教程---LIKE
  7. HDU 1796 Howmany integers can you find (容斥原理)
  8. hdu 2665 Kth number_划分树
  9. Hive 4、Hive 的安装配置(远端MyMql模式)
  10. Ice_cream’s world III(prime)