Androidの应用引导页SplashActivity的巧妙之处(一) 1.众所周知,我们很多应用都会有一个SplashActivity,用来当作进入应用的第一个过度界面,显示一个logo信息。

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

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

/** *  * @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里面,做一些复制数据库文件,读取数据库城市列表等一些相对比较耗时的事情,这里就不具体说这个加载数据的函数了。因为我们可以根据不同的需求改变这个函数,比如说微博应用就替换成异步请求网络数据等。

第二种方式,如果使用几张引导页,滑动加载,可以避免耗时发生。看下代码:
public class SplashActivity extends Activity {boolean isFirstIn = false;private static final int GO_HOME = 1000;private static final int GO_GUIDE = 1001;// 延迟3秒private static final long SPLASH_DELAY_MILLIS = 3000;private static final String SHAREDPREFERENCES_NAME = "first_pref";/** * Handler:跳转到不同界面 */private Handler mHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {switch (msg.what) {case GO_HOME:goHome();break;case GO_GUIDE:goGuide();break;}super.handleMessage(msg);}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.splash);init();}private void init() {// 读取SharedPreferences中需要的数据// 使用SharedPreferences来记录程序的使用次数SharedPreferences preferences = getSharedPreferences(SHAREDPREFERENCES_NAME, MODE_PRIVATE);// 取得相应的值,如果没有该值,说明还未写入,用true作为默认值isFirstIn = preferences.getBoolean("isFirstIn", true);// 判断程序与第几次运行,如果是第一次运行则跳转到引导界面,否则跳转到主界面if (!isFirstIn) {// 使用Handler的postDelayed方法,3秒后执行跳转到MainActivitymHandler.sendEmptyMessageDelayed(GO_HOME, SPLASH_DELAY_MILLIS);} else {mHandler.sendEmptyMessageDelayed(GO_GUIDE, SPLASH_DELAY_MILLIS);}}private void goHome() {Intent intent = new Intent(SplashActivity.this, MainActivity.class);SplashActivity.this.startActivity(intent);SplashActivity.this.finish();}private void goGuide() {Intent intent = new Intent(SplashActivity.this, GuideActivity.class);SplashActivity.this.startActivity(intent);SplashActivity.this.finish();}}

应用源码下载: 点击打开链接

更多相关文章

  1. android 保存Json数据到本地
  2. Android异步加载图像小结----演化理解 Android 异步
  3. Android ORMLite数据库简介
  4. android使用ImageView加载本地SdCard图片和加载网络图片
  5. 源码分析android 系统framework(二)之view的布局加载流程
  6. adb shell 命令详解 在Android中查看和管理sqlite数据库
  7. Android 数据库SQLite升级降级

随机推荐

  1. The method setOnClickListener(View.OnC
  2. Android recovery 流程分析
  3. android 出错集
  4. Android实现朋友圈评论回复列表
  5. 编写自定义的 Android Preference 组件[
  6. 曾经的笔记——android的学习笔记(布局和
  7. android开发环境 eclipse + android sdk
  8. 上百个android小项目源码(来源于网络)
  9. Google API key申请
  10. Android界面布局详解