您的位置:首页 > 移动开发 > Android开发

开源中国 Android 客户端学习-启动界面

2013-09-22 17:23 323 查看
开源中国 Android 客户端的启动界面是 AppStart.java 这个文件.

如果在启动时, 有电话接进来, 或者, 按下了返回键, 或HOME键, 总之, 就是让主界面不再处于前台了, 这时会怎么样?

其实你仔细观察一下就会发现, 在第2次继续进入时, 会闪过一个什么东西, 这时, 你通过在动画监听里加入输出日志信息来观察就能发现, 即使处于后台了, 动画依然没有结束, 当再次进入时, 上个动画要先结束, 才开始新动画. 所以我就在想, 是不是能把动画取消掉? 看API , 有一个 cancle 方法, 于是加入, 发现, 更麻烦, 原来不出现的却出现了. 最后通过调试变成如下.

package net.oschina.app;

import net.oschina.app.common.StringUtils;
import net.oschina.app.ui.Main;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;

/**
 * 应用程序启动类:显示欢迎界面并跳转到主界面
 * 
 * @author liux (http://my.oschina.net/liux)
 * @version 1.0
 * @created 2012-3-21
 */
public class AppStart extends Activity {

	private AlphaAnimation mAnimation = null;
	private View mView = null;
	private boolean mPause = false;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		mView = View.inflate(this, R.layout.start, null);
		setContentView(mView);

		initViews();

		// 兼容低版本cookie(1.5版本以下,包括1.5.0,1.5.1)
		AppContext appContext = (AppContext) getApplication();
		String cookie = appContext.getProperty("cookie");
		if (StringUtils.isEmpty(cookie)) {
			String cookie_name = appContext.getProperty("cookie_name");
			String cookie_value = appContext.getProperty("cookie_value");
			if (!StringUtils.isEmpty(cookie_name)
					&& !StringUtils.isEmpty(cookie_value)) {
				cookie = cookie_name + "=" + cookie_value;
				appContext.setProperty("cookie", cookie);
				appContext.removeProperty("cookie_domain", "cookie_name",
						"cookie_value", "cookie_version", "cookie_path");
			}
		}
	}

	@Override
	protected void onResume() {
		// mPause = false;
		// mAnimation.reset();
		transformStatus(false);
		mView.startAnimation(mAnimation);
		super.onResume();
	}

	@Override
	protected void onStop() {
		System.out.println("onStop :: aa.hasStarted() = "
				+ mAnimation.hasStarted() + ", aa.hasEnded() = "
				+ mAnimation.hasEnded());
		// mPause = true;
		// mAnimation.cancel();
		transformStatus(true);
		super.onDestroy();
	}

	@SuppressLint("NewApi")
	private void transformStatus(boolean status) {
		mPause = status;
		if (status) {
			mAnimation.cancel();
		} else {
			mAnimation.reset();
		}
	}

	/**
	 * 初始化组件
	 */
	private void initViews() {
		// 渐变展示启动屏
		mAnimation = new AlphaAnimation(0.3f, 1.0f);
		mAnimation.setDuration(2000);
		mAnimation.setAnimationListener(new AnimationListener() {
			@Override
			public void onAnimationEnd(Animation arg0) {
				System.out
						.println("onAnimationEnd :: mAnimation.hasStarted() = "
								+ mAnimation.hasStarted()
								+ ", mAnimation.hasEnded() = "
								+ mAnimation.hasEnded());
				if (!mPause) {
					redirectTo();
				}
			}

			@Override
			public void onAnimationRepeat(Animation animation) {
			}

			@Override
			public void onAnimationStart(Animation animation) {
				System.out
						.println("onAnimationStart :: mAnimation.hasStarted() = "
								+ mAnimation.hasStarted()
								+ ", mAnimation.hasEnded() = "
								+ mAnimation.hasEnded());
			}
		});
	}

	/**
	 * 跳转到...
	 */
	private void redirectTo() {
		Intent intent = new Intent(this, Main.class);
		startActivity(intent);
		finish();
	}
}


加一个boolean变量来控制是否进入主界面. 变量的初始化放在 onResume 中, 在Activity 不处于顶层时, 就改变它的状态, 并 cancel 掉动画, 也就是提交消费掉这个动画, 在监听里来处理. 如果是正常结束那逻辑变量是 false, 如果之前被 onStop 过, 则为 true, 所以解决这个问题.

这样, 解决了这个看似不起眼的小问题. 充份利用 Activity 的生命周期方法来解决问题.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: