开源中国 Android 客户端学习-启动界面
2013-09-22 17:23
323 查看
开源中国 Android 客户端的启动界面是 AppStart.java 这个文件.
如果在启动时, 有电话接进来, 或者, 按下了返回键, 或HOME键, 总之, 就是让主界面不再处于前台了, 这时会怎么样?
其实你仔细观察一下就会发现, 在第2次继续进入时, 会闪过一个什么东西, 这时, 你通过在动画监听里加入输出日志信息来观察就能发现, 即使处于后台了, 动画依然没有结束, 当再次进入时, 上个动画要先结束, 才开始新动画. 所以我就在想, 是不是能把动画取消掉? 看API , 有一个 cancle 方法, 于是加入, 发现, 更麻烦, 原来不出现的却出现了. 最后通过调试变成如下.
加一个boolean变量来控制是否进入主界面. 变量的初始化放在 onResume 中, 在Activity 不处于顶层时, 就改变它的状态, 并 cancel 掉动画, 也就是提交消费掉这个动画, 在监听里来处理. 如果是正常结束那逻辑变量是 false, 如果之前被 onStop 过, 则为 true, 所以解决这个问题.
这样, 解决了这个看似不起眼的小问题. 充份利用 Activity 的生命周期方法来解决问题.
如果在启动时, 有电话接进来, 或者, 按下了返回键, 或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 的生命周期方法来解决问题.
相关文章推荐
- 开源中国安卓客户端源码学习(一) 渐变启动界面
- 开源中国 OsChina Android 客户端源码分析(1)启动界面 app_start
- Android客户端之“微服私访”App的系统学习(七)XRecyclerView快速实现列表界面+自定义Search输入框,软键盘搜索按钮监听+TextView部分样式改变
- Android之UI学习篇十:使用TabHost实现微博客户端界面
- Android开发学习笔记一:Android启动界面的简单实现
- 开源中国 Android 客户端学习-前言
- Android客户端首次启动引导界面
- 开源中国android客户端学习 第一天
- android 启动界面学习总结
- 开源中国android客户端源码分析-学习笔记2
- 新浪微博Android客户端学习记录三:完成登录界面和授权界面
- 新浪微博Android客户端学习记录一:完成Logo界面
- Android应用--新浪微博客户端新特性滚动视图和启动界面实现
- 新浪微博Android客户端学习记录一:完成Logo界面
- Android客户端之“微服私访”App的系统学习(二)TextInputLayout实现登录界面和LitePal初始化本地数据库
- Android开源客户端之LookAround学习(三) 界面框架
- Android客户端首次启动时的引导界面(viewpager)
- android基础学习007_android 应用启动界面SplashActivity
- 开源中国 OsChina Android 客户端源码分析(13)Fragment学习
- 开源中国android客户端源码分析-学习笔记1