首页 > 代码库 > Android Splash界面支持用户点击 直接进入主界面

Android Splash界面支持用户点击 直接进入主界面

现在随便下载一个app,打开都有一个Splash界面,为什么一进去就有一个splash界面呢?其实用户打开你的产品,希望用最少的信息给用户最多的信息量,让用户知道这是一款什么产品,这是说产品方面的,还有一个是功能方面的,比如数据库的拷贝,版本更新,还有一个重要的就是展示该公司的logo等等,现在的移动互联网相当于pC端对产品的体验更讲究,我们现在发现一个很好的产品它未必能马上能给这公司盈利,但是用户量大时,表示用户对你的产品认可,那么公司融资就比较简单了,废话不多说


如果splash什么都不做,一般都是过几秒进入主界面,代码如下:

public class SplashActivity extends Activity {
	private Handler handler = new Handler();
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_splash);
		
		handler.postDelayed(new Runnable() {
			@Override
			public void run() {
				 loadUI();
			}
		}, 5000);
	}
	protected void loadUI() {
			Intent intent = new Intent(this,MainActivity.class);
			startActivity(intent);
			finish();
	}
}

如果这个时候你把这个交给测试人员,那你就悲剧了,除非那测试是眼瞎不然你这个bug肯定是要被发现的,我们注意下会发现MainActivity会创建2个,界面会闪动一下,这个bug怎么解决呢?我们解决bug一定要从代码上去看,非常你对业务很熟悉,知道那段代码干什么事,出现这个bug是因为loadUI()方法执行了二次,而我们肯定是想让他只执行一次,那么这就涉及到判断了,但要看看这个这个方法是封装在一个类中还是这个方法就是单独的,如果是单独的一般是用一个boolean指去做判断,而这个方法是封装在一个类中,一般根据这个类的对象是否为null进行判断,如果为null,就执行不为null,就不执行,这只是个简单的逻辑,

那么在我们的这个怎么判断呢?我们看loadUI()方法其实在Runnable接口中执行,也就是这个方法封装在Runnable接口中,使用的是匿名内部类,现在我们不使用匿名对象,直接创建对象,然后再判断这个对象,解决方案代码如下:


public class SplashActivity extends Activity {
	private Handler handler = new Handler();
	private Runnable runnbale ;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_splash);
		runnbale = new Runnable() {
			@Override
			public void run() {
				loadUI();
			}
		};
		handler.postDelayed(runnbale, 5000);
	}
	protected void loadUI() {
			Intent intent = new Intent(this,MainActivity.class);
			startActivity(intent);
			finish();
	}
	
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		if(event.getAction()==MotionEvent.ACTION_UP) {
			Intent intent = new Intent(this,MainActivity.class);
			startActivity(intent);
			finish();
			//如果之前创建了Runnable对象,那么就把这任务移除
			if(runnbale!=null){
				handler.removeCallbacks(runnbale);
			}
		}
		return super.onTouchEvent(event);
	}
}

在有些时候我们在一个界面中使用Handler执行一个Runnable任务,当界面跳转时候,记得要把这个Runnable要从Handler移除,不然会带来意想不到的结果,而且找bug还不好找。


还有一种方案就要设计到Activity的启动模式了,我们是连续启动2个一样的activity,而activity有一种启动模式为singleTop,就是当启动的activity在栈顶时就不会再启动这个activity,我们设置下试试,

ok,设计这个android:launchMode = "singleTop" 问题也可以解决了!



Android Splash界面支持用户点击 直接进入主界面