众所周知,我们很多应用都会有一个SplashActivity,用来当作进入应用的第一个过度界面,显示一个logo信息。如下所示,是我的简洁天气的SplashActivity。

但是,它的作用仅仅只是用来显示一个logo信息吗?这样岂不是太浪费了?答案是肯定的。

其实一开始学习Android的时候,我也以为它的作用仅仅是用来显示logo信息,但是在观察新浪微博、腾讯微博等应用之后,我发现每次显示这个界面的时间会有所不同,网络好的时候感觉不出来,网络不好的时候会停留的时间比较长一点,所以,我可以肯定说:在这个Activity里面,肯定为下一个Activity的出现打好了基础,也就是说预先初始化了一些工具类、加载了一些必要数据。这样的话在下一个Activity很快就可以完整把所有数据展现在用户面前,获取更好的用户体验。

说到这里,也许有的童鞋就会说了,我可以在Application里做这些事情啊,然后直接进入MainActivity,其实这样也是可以的,比如我这个简洁天气最初就是这样做的,但是细心的朋友就会发现,每次进我这个应用的时候,屏幕会黑一段时间,尤其是第一次进入更加明显,其实就是因为我把加载数据的事情放在Application里面,而加载2000多个城市是需要一定时间的。这样就不可避免的会黑一段时间,这样给用户的感觉就没那么亲和了。

OK,铺垫就到这里了,下面切入正题,我们来看看这个简单SplashActivity:

/**
*
* @author way
* 预先加载数据的SplashActivity
*
*/
public class SplashActivity extends Activity {
private static final int SHOW_TIME_MIN = 3000;// 最小显示时间
private long mStartTime;// 开始时间 private Handler mHandler = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case Application.CITY_LIST_SCUESS:// 如果城市列表加载完毕,就发送此消息
long loadingTime = System.currentTimeMillis() - mStartTime;// 计算一下总共花费的时间
if (loadingTime < SHOW_TIME_MIN) {// 如果比最小显示时间还短,就延时进入MainActivity,否则直接进入
mHandler.postDelayed(goToMainActivity, SHOW_TIME_MIN
- loadingTime);
} else {
mHandler.post(goToMainActivity);
}
break;
default:
break;
}
}
};
//进入下一个Activity
Runnable goToMainActivity = new Runnable() { @Override
public void run() {
SplashActivity.this.startActivity(new Intent(SplashActivity.this,
MainActivity.class));
finish();
}
}; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.splash);
mStartTime = System.currentTimeMillis();//记录开始时间,
Application.getInstance().initData(mHandler);//开始加载数据
}
}

我这里把加载数据的函数放在Application里面,做一些复制数据库文件,读取数据库城市列表等一些相对比较耗时的事情,这里就不具体说这个加载数据的函数了。因为我们可以根据不同的需求改变这个函数,比如说微博应用就替换成异步请求网络数据等。我这个例子仅是提供一个扩展思路,如果有更好的建议或者批评,欢迎大家给我留言。

Android之SplashActivity的巧妙之处的更多相关文章

  1. 深入理解HashMap(及hash函数的真正巧妙之处)

    原文地址:http://www.iteye.com/topic/539465 Hashmap是一种非常常用的.应用广泛的数据类型,最近研究到相关的内容,就正好复习一下.网上关于hashmap的文章很多 ...

  2. Map结合Function函数式接口的巧妙之处

    需求:在给定 List 集合中,需根据不同的算法规则,选取计算方式并返回结果: 例如:[1, 2, 3, 4, 5] List 集合中都是 Integer 类型数据,根据提供的算法规则,sum 求和, ...

  3. Android实战_来电拦截专家

    1 项目演示: 2 代码演示: 1)MainActivity类代码: MainActivity类代码: package com.example.phoneinteceptor_one;import j ...

  4. Android.mk文件详解(转)

    源:Android.mk文件详解 从对Makefile一无所知开始,折腾了一个多星期,终于对Android.mk有了一个全面些的了解.了解了标准的Makefile后,发现Android.mk其实是把真 ...

  5. Java ME之Android开发从入门到精通

    1. 搭建Android开发环境 方式一:使用ADT插件安装 ADT插件的下载与安装,ADT插件获取网址:http://www.androiddevtools.cn/ 下载好的ADT插件如图所示: 在 ...

  6. android 编程小技巧(持续中)

    first:     Intent跳转一般存用于Activity类,可是若要在非activity类里跳转的话,解决方法是在startActivity(intent)前加mContext即上下文,终于为 ...

  7. Android开发案例 - 欢迎界面

    本文详细描述了如何实现如下图中的微信启动界面. 该类启动界面的特点是在整个Application的生命周期里, 它只会出现在第一次进入应用时, 即便按回退键到桌面之后. 使用该类启动界面的应用还有: ...

  8. [Android]学习笔记Activity_001

    操作button的说明 设置button的ID: android:id="@+id/button" 设置button的点击事件 findViewById(R.id.button). ...

  9. Android Studio安装配置、环境搭建详细步骤及基本使用

    前言 Android Studio的安装配置及使用篇终于来啦~ 废话不多说,以下针对JDK正确安装(及其环境变量配置完毕,即Java开发环境下).Android Studio的安装,配置,以及创建工程 ...

随机推荐

  1. Cocos2d-X学习之Ref类

    先看看定义该类的头文件——CCRef.h /**************************************************************************** C ...

  2. Flex中如何通过horizontalTickAligned和verticalTickAligned样式指定线图LineChart横竖方向轴心标记的例子

    原文http://blog.minidx.com/2008/12/03/1669.html 接下来的例子演示了Flex中如何通过horizontalTickAligned和verticalTickAl ...

  3. git解决冲突

    解决冲突 人生不如意之事十之八九,合并分支往往也不是一帆风顺的. 准备新的feature1分支,继续我们的新分支开发: $ git checkout -b feature1 Switched to a ...

  4. iOS 倒计时

    // // RootViewController.m // MyTimerDemo // // Created by huluo on 1/21/14. // Copyright (c) 2014 b ...

  5. [IOS ] - INFO

    Chart in ios (native) https://github.com/kevinzhow/PNChart Web Page performance - YShow https://deve ...

  6. 网易云课堂_程序设计入门-C语言_第六章:数组_1多项式加法

    1 多项式加法(5分) 题目内容: 一个多项式可以表达为x的各次幂与系数乘积的和,比如: 现在,你的程序要读入两个多项式,然后输出这两个多项式的和,也就是把对应的幂上的系数相加然后输出. 程序要处理的 ...

  7. Python 随即生成DAG(有向无环图)

    给校队选拔赛出了道DAG上的背包问题,需要生成DAG数据. 最开始使用的方法是先随机生成再判环,如果有环就重新生成.这种方法得到DAG的概率随着点数和边数的增加而急速降低,为了一个DAG要生成很多次, ...

  8. php什么是变量的数据类型

    什么是变量的数据类型 在变量中,由于变量占用的空间单元不一样(占的地盘大小不一样),也分成几种数据类型,就像超市商品的包装袋,有几种不同类型,不同的商品使用不同的包装袋.我们可以通过使用“memory ...

  9. jQuery源码笔记——三

    将类数组对象转化为数组对象 javascript中有许多类数组对象,比如HTMLCollection,NodeList,arguments.她们的特点是和数组一样有length属性,并且有0,1,2这 ...

  10. Semantic UI中的验证控件的事件的使用

    1.Semantic UI中的验证控件,功能挺不错的,中文官网的文档写的都比较详细了,我再这里就不再进行重复了,主要是想说一下它的事件的使用方法,这个可能有部分朋友刚开始接触的时候不太了解 注意看这几 ...