zoukankan      html  css  js  c++  java
  • Android之SplashActivity的巧妙之处

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






  • 相关阅读:
    康复计划
    Leetcode 08.02 迷路的机器人 缓存加回溯
    Leetcode 38 外观数列
    Leetcode 801 使序列递增的最小交换次数
    Leetcode 1143 最长公共子序列
    Leetcode 11 盛水最多的容器 贪心算法
    Leetcode 1186 删除一次得到子数组最大和
    Leetcode 300 最长上升子序列
    Leetcode95 不同的二叉搜索树II 精致的分治
    Leetcode 1367 二叉树中的列表 DFS
  • 原文地址:https://www.cnblogs.com/riskyer/p/3249444.html
Copyright © 2011-2022 走看看