Android创建启动画面[转]
每个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"> |
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里的东西比较多的时候,如果我们还把启动画面也加进去,势必会影响程序的效率,所以实际应用的话,第一个方法是首选。
Android创建启动画面[转]的更多相关文章
- Android创建启动画面
每一个Android应用启动之后都会出现一个Splash启动界面,显示产品的LOGO.公司的LOGO或者开发人员信息.假设应用程序启动时间比較长,那么启动界面就是一个非常好的东西,能够让用户耐心等待这 ...
- 从零开始学Xamarin.Forms(三) Android 制作启动画面
原文:从零开始学Xamarin.Forms(三) Android 制作启动画面 Xamarin.Forms 在启动的时候相当慢,必须添加一个启动界面,步骤如下: 1.将启动画面的图片命名为:s ...
- Delphi开发 Android 程序启动画面简单完美解决方案
原文在这里 还是这个方法好用,简单!加上牧马人做的自动生成工具,更是简单. 以下为原文,向波哥敬礼! 前面和音儿一起研究 Android 下启动画面的问题,虽然问题得到了解决,但是,总是感觉太麻烦,主 ...
- Android & iOS 启动画面工具
感谢Aone!为我们开发了如此便捷的工具!! 以下为原文: Android & iOS 启动画面工具 下载:OneSplash.启动画面工具.Aone.20190318.zip 说明:这一个 ...
- Android应用启动画面
原文地址: [Android]应用启动画面 - 空客的日志 - 网易博客 http://blog.163.com/da7_1@126/blog/static/104072678201291921028 ...
- Xamarin.Forms (Android制作启动画面)
http://blog.csdn.net/zapzqc/article/details/38496117 Xamarin.Forms 在启动的时候相当慢,必须添加一个启动界面,步骤如下: 1. ...
- android 之 启动画面的两种方法
现在,当我们打开任意的一个app时,其中的大部分都会显示一个启动界面,展示本公司的logo和当前的版本,有的则直接把广告放到了上面.启动画面的可以分为两种设置方式:一种是两个Activity实现,和一 ...
- react native android应用启动画面
参考地址:https://www.youtube.com/watch?v=rnLR65OGtic 第一步:生成启动画面的背景图片 生成一个2048*2048的背景图片,打开网站https://apet ...
- 初学Android,创建,启动,停止Service(五十八)
Service跟Windows系统里的服务概念差不多,都在后台执行,它跟Activity的最大区别就是,它是无界面的 开发Service与开发Activity的步骤类似 1.定义一个继承Service ...
随机推荐
- Qt :非window子窗体的透明度设置
✿问题的由来 心血来潮,想利用QTimer 配合 setWindowOpacity()方法来实现一个窗体淡入的效果. ✿实验代码 粗糙的实验代码: void Widge ...
- matlab---边缘之sobel简单实例
最近在项目中需要做一些图像边缘检测的工作,但是由于之前没接触过图像处理的相关知识,所以只得 在matlab里面对一些图像处理函数挨个挨个的试着用.在用的过程中在慢慢的明白了一些简单的图像处 理方法. ...
- 【数据结构(ywm版)】异或指针双向链表
在<数据结构题集>中看到这种链表,实际上就是把一般的双向链表的next和prior两个指针通过异或运算合并为一个指针域来存储,每个结点确实可以减少一个指针的空间,但会带来取指针值时运算的开 ...
- TimeSpan类【转】
TimeSpan ts1 = new TimeSpan(DateTime.Now.Ticks); //获取当前时间的刻度数 //执行某操作 ............................ . ...
- 《Effective C++》:条款46-条款47
条款46请输入转换的时候,需要定义非模板成员函数 条款47请使用traits class表现类型信息 条款46:须要类型转换时请为模板定义非成员函数 条款 24提到过为什么non-member函数才有 ...
- 【ThinkPHP学习】ThinkPHP自己主动转义存储富文本编辑器内容导致读取出错
RT. ThinkPHP的conf文件里的Convention.php有一个配置选项 'DEFAULT_FILTER' => 'htmlspecialchars', // 默认參数过滤方法 用于 ...
- Android学习之listview的下拉刷新、上拉载入
本例是在上例的基础上完成的.本例实现的listview上拉载入.下拉刷新功能,是在开源网站上别人写好的listview,主要是对listview的控件进行重写,添加了footer和header. 1. ...
- SQL Server 创建作业系列问题
一.从IClassFactory为CLSID为{AA40D1D6-CAEF-4A56-B9BB-D0D3DC976BA2}的COM组件创建实例失败. 尊重原著作:本文转载自http://www.hao ...
- SVN(一次检出&二次检出)
一次检出: >进入经历文件夹 >输入svn checkout指令 >输入电脑密码 >输入用户名 >输入密码 >检出成功 第二次检出: >进入小涛文件夹 > ...
- Hadoop学习笔记——入门指令操作
假设Hadoop的安装目录HADOOP_HOME为/home/admin/hadoop. 启动与关闭启动HADOOP1. 进入HADOOP_HOME目录. 2. 执行sh bin/start-all. ...