现在随便下载一个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" 问题也可以解决了!