Androidの应用引导页SplashActivity的巧妙之处

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() {

		@Override
		public void handleMessage(Message msg) {
			switch (msg.what) {
			case GO_HOME:
				goHome();
				break;
			case GO_GUIDE:
				goGuide();
				break;
			}
			super.handleMessage(msg);
		}
	};

	@Override
	protected 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秒后执行跳转到MainActivity
			mHandler.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();
	}
}

应用源码下载:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值